我在执行SQL语句的类中封装了一些c3p0池。
它是这样初始化的:
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
避免污染我的构造函数,但是我认为这不是一个好主意,对吗?编辑:这不是一个Web应用程序,并且当前没有使用依赖项注入框架。
感谢您的时间!
最佳答案
我假设您没有使用任何DI框架?如果是这种情况,您可以选择以下几种:
将PooledQueryExecutor
传递给需要它的类的构造函数。从测试和体系结构的角度来看,这实际上是相当不错的。
让需要JDBC的类实现一些简单的接口,例如:
interface PooledQueryExecutorAware {
void setPooledQueryExecutor(PooledQueryExecutor executor);
}
然后,您甚至可以遍历类,发现哪些实现了该类,并在需要的地方注入
PooledQueryExecutor
。您是在这里重新发现DI的第一步,但是没关系。类似的方法是创建一个抽象基类,该基类需要
PooledQueryExecutorAware
作为依赖项,并具有protected final
字段来保存它。让每个班级都知道
PooledQueryExecutor
-不推荐,不必要的耦合Singleton是最糟糕的事情,无法测试且难以理解的代码。求你了
ThreadLocal
?忘掉它。记住,明确是王。还可以查看JdbcTemplate。它是Spring的一部分,但是在不使用整个框架的情况下,您只能包含
spring-jdbc.jar
和其他一些内容。我认为它可以轻松替换您的PooledQueryExecutor
。