我有一些c3p0池封装在一个用来执行SQL语句的类中。 它的初始化是这样的:在很多类之间共享一个JDBC连接池
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框架。实际上我使用反射来创建数据包实例(它们有成千上万个,它们都对相同的构造函数==>“IncomingPacket incomingPacketInstance = incomingPacketConstructor.newInstance(pooledQueryExecutor);”),因此标记使用数据库的数据包的接口是不是一个真正的选择(保持清洁的“反射代码”)。如果我把一些“私人静态PooledQueryExecutor数据库;”在基类内(IncomingPacket)。我只需要设置一次,我就可以为JUnit设置一个模拟对象。 – AndrewBourgeois
你提供了一些非常有趣的细节。我认为“界面”方法现在更好。只需遍历一个'incomingPacketInstance'集合并使用'instanceof'即可。将来,如果你需要更多的依赖关系,你可以添加更多'* Aware'接口。相信我,'static'字段(不能是'final')将来会很痛苦。 –
我将使用接口方法,一旦有多个对象可能(!)在数据包中需要,它确实会更好。谢谢 ! – AndrewBourgeois