以下是我的帮助程序类来获取数据库连接:
我使用了here所述的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)之外,我是否应该费心去做任何其他的清理工作。
什么是this清理?我应该在何时何地这样做?
如果您在上述代码中发现任何错误,请指出。
答案 0 :(得分:23)
使用池化数据源,池中的连接实际上不会关闭,它们只会返回池中。但是,当应用程序关闭时,这些与数据库的连接应该正确并实际关闭,这是最终清理的地方。
顺便提一下,c3p0项目在水中几乎已经死了,我建议你改用Apache Commons DBCP,它仍在维护。
答案 1 :(得分:6)
DAO不应负责获取与数据库的连接。他们无法知道什么时候他们被用作更大交易的一部分。您应该将数据源或连接实例传递到DAO。
如果在finally块中关闭的任何调用抛出异常,则不会调用后面的任何异常。每个人都需要在自己的try / catch块中。我将它们作为静态方法放入实用程序类中。
答案 2 :(得分:5)
代码看起来很好,但我会编写一个帮助方法来执行关闭操作,或者你会在每个DAO或方法中得到这个详细的finally块。也许你应该在关闭的操作周围编写三个单独的try-catch-blocks,以确保连接被关闭,无论语句和结果集是否已经抛出了一个执行。另请注意javadoc says
当Statement对象关闭时,它的当前ResultSet对象(如果存在)也将关闭。
所以你不需要在上面的例子中关闭结果集,但你可以。
链接清理方法用于关闭数据源,大多数项目都不需要,因为只要您的应用正在运行,DS就会存在。
答案 3 :(得分:0)
我使用Play Framework和Scala,因此以下示例处于播放项目中。
步骤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"
)
第二步。怎么访问它?你需要导入c3p0库。
import com.mchange.v2.c3p0.ComboPooledDataSource
步骤3。然后你需要创建实例。
val cpds = new ComboPooledDataSource()
cpds.setDriverClass(...)
cpds.setJdbcUrl(...)
cpds.setUser(...)
cpds.setPassword(...)
步骤4。你得到一个连接
cpds.getConnection