使用 C3P0 的 JDBC 连接池

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

我已使用 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;
    }
}

在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);

    }

现在,我的问题是,除了关闭最终块中列出的游标(connection/statement/resultSet/preparedStatement)之外,我是否应该费心进行任何其他清理。

是什么清理??我应该在何时何地执行此操作?

如果您在上面的代码中发现任何错误,请指出。


答案 1

对于池数据源,池中的连接实际上并未关闭,它们只是返回到池中。但是,当应用程序关闭时,与数据库的那些连接应正确且实际关闭,这是最终清理的用武之地。

顺便说一句,c3p0项目几乎已经死了,我建议你使用Apache Commons DBCP代替,它仍然在维护中。


答案 2

DAO 不应负责获取与数据库的连接。他们无法知道何时将自己用作较大交易的一部分。应将数据源或连接实例传递到 DAO 中。

如果在 finally 块中关闭的任何调用引发异常,则不会调用后面的任何调用。每个都需要在自己的尝试/捕获块中。我将它们作为静态方法放入实用程序类中。


推荐