我是新来的Java(我使用的Java 6)。 我一直在使用我的所有Java的POJO和servlet下面的设计模式访问通过3.1.2的GlassFish Web服务器在Oracle 11g数据库。
我发现了一个间歇性的数据库错误(ORA-12519)的时候所有可用的过程(或会话,不知道有什么区别)被消耗,导致我莫名其妙地觉得处理不被应用程序释放出来。
看着下面的设计模式,有没有更好的办法,以确保JDBC连接到数据库中的异常的情况下被释放? 例如,是否也应该放在if ( conn != null) conn.close();
代码中catch块? 或者,有没有更好的设计模式? 先谢谢您的任何意见/提示。
public String MyFunction() throws Exception {
Connection conn;
CallableStatement cs;
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call my_sproc (?)}" );
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
String outParam = cs.getString(1);
if ( conn != null ) // close connection
conn.close();
} catch (Exception e) {
outParam = "an error occurred";
}
return outparam;
}
if ( conn != null ) // close connection
conn.close();
在这条线conn
不能为空。 最流行的模式,直到Java 6的是:
Connection conn = null;
try {
// initialize connection
// use connection
} catch {
// handle exception
} finally {
if (conn != null) {
try { conn.close(); } catch (Exception e) { /* handle close exception, quite usually ignore */ }
}
}
在Java 7,这将成为其不太繁琐的尝试,与资源结构。 上面的代码可以改变到更短的
try (Connection conn = createConnection()) {
// use connection
} catch {
// handle exception
}
// close is not required to be called explicitly
使用finally
块总是以释放资源。
finally块总是执行try块退出时。 这保证了即使发生了意外的异常的最后块被执行。
try {
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call my_sproc (?)}" );
cs.registerOutParameter(1, Types.VARCHAR);
cs.execute();
String outParam = cs.getString(1);
} catch (Exception e) {
outParam = "an error occurred";
}
finally {
conn.close();
}
Java SE 7中支持的try-与资源的功能。 产生最终为您服务。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
finally块将关闭在try alocated的资源。 就像你正在使用使用C#关键字
但是用户在使用的Java SE6 ...查看其他用户的选择:)
重要提示:使用的语句也应该被关闭。
我更喜欢另一种更优雅的方式比:
} finally {
if (conn != null) {
try {
conn.close();
} catch (Exception e) {
/* handle close exception, quite usually ignore */
}
}
}
你可以使用DbUtils.closeQuietly: http://commons.apache.org/dbutils/apidocs/org/apache/commons/dbutils/DbUtils.html
文章来源: Java / JDBC: Best design pattern to close database connection when exception occurs