使用C3P0的JDBC连接池

jai*_*jai 30 java database database-connection connection-pooling c3p0

以下是我的帮助类获取数据库连接:

我已经使用了这里描述的C3P0连接池.

public class DBConnection {

    private static DataSource dataSource;
    private static final String DRIVER_NAME;
    private static final String URL;
    private static final String UNAME;
    private static final String PWD;

    static {

        final ResourceBundle config = ResourceBundle
                .getBundle("props.database");
        DRIVER_NAME = config.getString("driverName");
        URL = config.getString("url");
        UNAME = config.getString("uname");
        PWD = config.getString("pwd");

        dataSource = setupDataSource();
    }

    public static Connection getOracleConnection() throws SQLException {
        return dataSource.getConnection();
    }

    private static DataSource setupDataSource() {
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        try {
            cpds.setDriverClass(DRIVER_NAME);
        } catch (PropertyVetoException e) {
            e.printStackTrace();
        }
        cpds.setJdbcUrl(URL);
        cpds.setUser(UNAME);
        cpds.setPassword(PWD);
        cpds.setMinPoolSize(5);
        cpds.setAcquireIncrement(5);
        cpds.setMaxPoolSize(20);
        return cpds;
    }
}
Run Code Online (Sandbox Code Playgroud)

在DAO我会写这样的东西:

try {
            conn = DBConnection.getOracleConnection();

            ....


} finally {
    try {
        if (rs != null) {
            rs.close();
        }
        if (ps != null) {
            ps.close();
        }
        if (conn != null) {
            conn.close();
        }
    } catch (SQLException e) {
        logger
                .logError("Exception occured while closing cursors!", e);

    }
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是,除了关闭finally块中列出的游标(connection/statement/resultSet/preparedStatement)之外,我是否应该费心去做任何其他的清理工作.

什么是这个清理?我应该在何时何地这样做?

如果您在上述代码中发现任何错误,请指出.

ska*_*man 24

使用池化数据源,池中的连接实际上不会关闭,它们只会返回池中.但是,当关闭应用程序时,应该正确并实际关闭与数据库的连接,这是最终清理的地方.

顺便说一下,c3p0项目在水中几乎已经死了,我建议你使用Apache Commons DBCP,它仍在维护.

  • @skaffman:在阅读了与你在这里所说的相反的情况后,我正准备从DBCP切换到C3P0:http://stackoverflow.com/questions/520585/connection-pooling-options-with-jdbc-dbcp-vs -c3p0.现在我不太确定 - 似乎这两个项目最近都没有多少TLC. (7认同)
  • 数据库连接池不需要大量的功能.一旦完成并且其最突出的错误得到修复,您不应期望过多的活动,即使其维护者仍然关心它. (7认同)
  • 使用BoneCP,非常活跃,优秀的工具,良好的文档,非常快.我们在非常高的流量站点使用它并且没有问题. (2认同)
  • 截至本文发表时,有关c3p0死亡的传言似乎被大大夸大了:http://sourceforge.net/projects/c3p0/(最新的回购更新是2014-04-04)。 (2认同)

duf*_*ymo 6

DAO不应负责获取与数据库的连接.他们无法知道什么时候他们被用作更大交易的一部分.您应该将数据源或连接实例传递给DAO.

如果在finally块中关闭的任何调用抛出异常,则不会调用后面的任何异常.每个人都需要在自己的try/catch块中.我将它们作为静态方法放入实用程序类中.


Tim*_*the 5

代码看起来很好,但我会编写一个帮助方法来执行关闭操作,或者你会在每个DAO或方法中得到这个详细的finally块.也许你应该在关闭的操作周围编写三个单独的try-catch-blocks,以确保连接被关闭,无论语句和结果集是否已经抛出了一个执行.另请注意,javadoc说

关闭Statement对象时,其当前ResultSet对象(如果存在)也将关闭.

因此,您不需要在上面的示例中关闭结果集,但您可以.

链接清理方法用于关闭数据源,大多数项目都不需要,因为只要您的应用程序正在运行,DS就会存在.