我正在使用带有Spring和Hibernate的c3p0 ComboPooledDataSource,我提出的解决方案是一个自定义Datasource类,它接受它的构造函数中的实际Datasource.我将所有责任委托给实际的数据源.我有一个锁定的布尔值,当设置为tr...
我正在使用带有Spring和Hibernate的c3p0 ComboPooledDataSource,我提出的解决方案是一个自定义Datasource类,它接受它的构造函数中的实际Datasource.我将所有责任委托给实际的数据源.我有一个锁定的布尔值,当设置为true时,getConnection()等待,直到锁定为false.
我只是想知道是否有人能看到我的方法存在缺陷或者有更好的选择?谢谢!
public interface LockableDataSource extends DataSource {
public boolean isLocked();
public void setLocked(boolean locked);
}
public class LockableDataSourceImpl implements LockableDataSource{
private DataSource dataSource;
private boolean locked = false;
public LockableDataSourceImpl(DataSource dataSource) {
this.dataSource = dataSource;
}
public Connection getConnection() throws SQLException {
while(locked){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return dataSource.getConnection();
}
public Connection getConnection(String s, String s1) throws SQLException {
while(locked){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return dataSource.getConnection(s, s1);
}
public PrintWriter getLogWriter() throws SQLException {
return dataSource.getLogWriter();
}
public void setLogWriter(PrintWriter printWriter) throws SQLException {
dataSource.setLogWriter(printWriter);
}
public void setLoginTimeout(int i) throws SQLException {
dataSource.setLoginTimeout(i);
}
public int getLoginTimeout() throws SQLException {
return dataSource.getLoginTimeout();
}
public <T> T unwrap(Class<T> tClass) throws SQLException {
return dataSource.unwrap(tClass);
}
public boolean isWrapperFor(Class<?> aClass) throws SQLException {
return dataSource.isWrapperFor(aClass);
}
public boolean isLocked() {
return locked;
}
synchronized public void setLocked(boolean locked) {
this.locked = locked;
}
}
解决方法:
几个缺陷:
>您不同步对标志变量的访问,因此您无法保证其他线程看到其状态.
>在InterruptedException上返回null,这将导致调用代码中难以诊断的异常.
>您正在重新实现已存在的同步原语.
到目前为止,最好的解决方案是在使用数据库时关闭您的应用程序.
如果您确实希望在数据库关闭时挂起应用程序,请查看Semaphore.
本文标题为:我正在恢复数据库,我需要在执行此操作时从我的Java应用程序中锁定任何活动
![](/xwassets/images/pre.png)
![](/xwassets/images/next.png)
- Java实现断点下载功能的示例代码 2022-11-20
- redis深入浅出分布式锁实现上篇 2023-05-08
- 详解springcloud组件consul服务治理 2023-04-12
- Java Swing实现QQ登录页面 2022-11-02
- Feign利用自定义注解实现路径转义详解 2023-02-05
- 一文带你全面了解Java Properties类 2023-05-19
- java实现在性能测试中进行业务验证实例 2023-03-15
- Spring整合SpringMVC与Mybatis(SSM)实现完整登录功能流程详解 2023-05-24
- IDEA配置Maven的超详细步骤 2023-04-17
- SpringBoot 实现自定义的 @ConditionalOnXXX 注解示例详解 2023-05-08