我有一些 c3p0 池封装在我用来执行 SQL 语句的类中。 它是这样初始化的:
public PooledQueryExecutor(String url, Properties connectionProperties) throws DALException {
try {
dataSource = new ComboPooledDataSource();
dataSource.setDriverClass(DRIVER);
dataSource.setJdbcUrl(url);
dataSource.setProperties(connectionProperties);
} catch (PropertyVetoException ve) {
throw new DALException(ve);
}
}
然后 - 在同一个类中 - 我使用一些方法来执行基本任务:
public CachedRowSet executeSelect(String sql) throws DALException {
// Get a connection, execute the SQL, return the rows that match, return resources to the pool
}
“问题”是:
我有很多不同的类来表示我收到的网络数据包。大多数类需要有这个 PooledQueryExecutor 来执行数据库操作,但有些则不需要。我是将此 PooledQueryExecutor 传递给需要它的类的构造函数(80% 的数据包),还是将 PooledQueryExecutor 设为单例?或者也许是“别的东西”?我也想过使用 ThreadLocal
来避免污染我的构造函数,但我认为这不是个好主意,对吧?
编辑:它不是网络应用程序,目前没有使用依赖注入(inject)框架。
感谢您的宝贵时间!
最佳答案
我假设您没有使用任何 DI 框架?如果是这种情况,您有几个选择:
将
PooledQueryExecutor
传递给需要它的类的构造函数。从测试和架构的角度来看,这实际上非常好。让需要 JDBC 的类实现一些简单的接口(interface),例如:
interface PooledQueryExecutorAware {
void setPooledQueryExecutor(PooledQueryExecutor executor);
}
然后您甚至可以遍历类并发现哪个实现了 this 并在需要时注入(inject) PooledQueryExecutor
。您只是在这里重新发现 DI 的第一步,但没关系。
类似的方法是创建一个抽象基类,该基类需要
PooledQueryExecutorAware
作为依赖项,并有protected final
字段保存它。让每个类都知道
PooledQueryExecutor
- 不推荐,不必要的耦合单例是你能做的最糟糕的事情,不可测试且难以理解的代码。请不要。
线程本地
?忘掉它。请记住,明确为王。
另请查看 JdbcTemplate .它是 Spring 的一部分,但您只能包含 spring-jdbc.jar
和其他一些而不使用整个框架。我认为它可以轻松替换您的 PooledQueryExecutor
。
关于java - 在多个类之间共享一个 JDBC 连接池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8219348/