我在执行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

07-27 13:59