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

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

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

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

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

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

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

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

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

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

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

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

我使用Play Framework和Scala,所以下面的例子是在play项目中。

步骤1。 组态

在build.sbt中,如果使用mysql / hive作为数据库,则需要添加这些属性。

 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