使用C3P0 JDBC连接池(JDBC Connection pooling using C3P0)

2019-07-18 23:06发布

以下是我的助手类来获得DB连接:

我已经使用了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);

    }

现在,我的问题是,我应该不屑做任何其他的清理比关闭游标上市(连接/声明/的resultSet / preparedStatement时)其他finally块。

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

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

Answer 1:

随着合并数据源,池中的连接不会真正关闭,他们只是返回池中。 然而,当应用程序被关闭,到数据库这些连接应适当和实际关闭,这是在最后的清理用武之地。

顺便说一句,C3P0项目是在水中几乎死了,我建议你使用的Apache下议院DBCP相反,它仍然维持。



Answer 2:

DAO的不应该是负责获取到数据库的连接。 他们也没有办法时,他们被用来作为一个更大的交易的一部分就知道了。 你应该通过数据源或连接到例如DAO。

如果任何调用到你的finally块关闭抛出一个异常,没有后面的那些将被调用。 每个人必须在自己的try / catch块。 我把它们放进一个工具类为静态方法。



Answer 3:

代码看起来没什么问题,但我会写,做密切操作的helper方法,或者你会得到在每一个DAO或方法这个冗长的最终块。 也许你应该写三个独立的围绕关闭操作的try-catch块,以确保连接被关闭无论在Statement和ResultSet都抛出exection。 还要注意的是, javadoc中说:

当Statement对象被关闭时,它的当前ResultSet对象,如果存在的话,也被关闭。

所以,你不必关闭ResultSet在上面的例子,但你可以。

链接的清理方法是关闭数据源,大多数项目是不是需要什么,因为DS的生活,只要你的应用程序正在运行。



Answer 4:

我使用Play框架和Scala,所以下面的例子是在游戏项目。

步骤1。 组态

在build.sbt,如果你使用mysql /蜂巢数据库,你需要添加这些属性。

libraryDependencies ++ = Seq (
   jdbc,
  "mysql" % "mysql-connector-java" % "5.1.31",
  "org.apache.hive" % "hive-jdbc" % "0.12.0",
  "com.mchange" % "c3p0" % "0.9.2.1"
)

第2步。 如何访问呢? 您需要导入C3P0库。

import com.mchange.v2.c3p0.ComboPooledDataSource

第三步。 然后你需要创建实例。

val cpds = new ComboPooledDataSource()
cpds.setDriverClass(...)
cpds.setJdbcUrl(...)
cpds.setUser(...)
cpds.setPassword(...)

第4步。 你得到一个连接

cpds.getConnection


文章来源: JDBC Connection pooling using C3P0