java - 在多个类之间共享一个 JDBC 连接池

标签 java jdbc connection-pooling

我有一些 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/

相关文章:

javax.naming.NameNotFoundException : Name [comp/env] is not bound in this Context. Java 调度程序无法找到 [comp] 错误

java - 按值排序列表

即使从父类转换实际上是转换为子类的实例,也会抛出 Java Class Cast Exception

java - 连接池查询结果在实时数据和旧数据之间跳转?

java - JDBC 连接到 MySQL 需要哪些文件?

java - 使用 JDBC 获取 BLOB 数据时出错

jpa - eclipselink连接池

java - 需要将 String month 作为 int 获取

java - 在 Android 上录制音频和在 Swing (PC) 上播放时出现问题

java - 无法直接从 Spark RDD 向 Ignite 写入/保存数据