Java 1.6 Java.sql try/catch/finally疯狂编码
我目前正在创建许多类,这些类将使用连接池访问数据库。 所以我得到一个连接,创建一个语句,然后得到结果集。(我不能使用Java 1.7和神奇的自动资源管理) 完成我的方法时,我必须以finally块完成:Java 1.6 Java.sql try/catch/finally疯狂编码,java,try-catch,Java,Try Catch,我目前正在创建许多类,这些类将使用连接池访问数据库。 所以我得到一个连接,创建一个语句,然后得到结果集。(我不能使用Java 1.7和神奇的自动资源管理) 完成我的方法时,我必须以finally块完成: if (rs != null) { try { rs.close(); } catch (SQLException sqle) { logger.error("Coul
if (rs != null) {
try {
rs.close();
} catch (SQLException sqle) {
logger.error("Couldn't close result set", sqle);
}
}
if (st != null) {
try {
st.close();
} catch (SQLException sqle) {
logger.error("Couldn't close statement", sqle);
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException sqle) {
logger.error("Couldn't close connection", sqle);
}
}
我已经看到了XX类的噩梦,每个类有4/5个方法
制作一个helper类是否是一个好的实践,它将为每种对象类型提供一个特殊的close方法,如:
public static void closeResource(Connection connection) {
if (connection != null) {
try {
connection.close();
} catch (SQLException sqle) {
logger.error("Couldn't close connection", sqle);
}
}
然后用xx完成我通常的操作,最后关闭(连接);xx.结束(声明);xx.关闭(rs)代码>
或者在同样的想法中(我知道在这一点上,我会让一些人感到震惊,因为我自己发现这有点奇怪),有一个像publicstaticvoidcloseresources(Object…obj){}
这样的方法,它有一个可怕的instanceof
列表
或者根据您的经验,在任何地方编写整个代码都更好?使用重载
private void close(ResultSet rSet) throws SQLException {
if (rSet != null) {
rSet.close();
}
}
private void close(Statement statement) throws SQLException {
if (statement != null) {
statement.close();
}
}
private void close(Connection conn) throws SQLException {
if (conn != null) {
conn.close();
}
}
现在使用会更干净:
try {
// do db stuff
} catch (Exception e) {
logger.error("log it", e);
} finally {
close(rs);
close(cs);
close(conn);
}
使用重载
private void close(ResultSet rSet) throws SQLException {
if (rSet != null) {
rSet.close();
}
}
private void close(Statement statement) throws SQLException {
if (statement != null) {
statement.close();
}
}
private void close(Connection conn) throws SQLException {
if (conn != null) {
conn.close();
}
}
现在使用会更干净:
try {
// do db stuff
} catch (Exception e) {
logger.error("log it", e);
} finally {
close(rs);
close(cs);
close(conn);
}
使用Apache commons项目:
DbUtils.closequityle()可能是您需要的使用Apache commons项目:
DbUtils.closequityle()可能就是您需要的再举一个例子。适合简单的小项目
Object doRequest() throws SQLException {
PreparedStatement ps = ... // initialize statement
try {
ResultSet rs = ps.executeQuery();
try {
// use ResultSet
return someResult;
} finally {
rs.close();
}
} finally {
ps.close();
}
}
虽然它并不是假装完整的解决方案(许多嵌套的try finally
都是不可读的),但它有几个优点:
- 方法本身不处理异常处理。通常只有调用方可以决定如何处理异常
- 如下所示,方法总是返回正确的结果或引发异常。不需要神奇的“错误值”
- 资源仅在初始化时关闭。无需检查
null
berodeclose()
再举一个例子。适合简单的小项目
Object doRequest() throws SQLException {
PreparedStatement ps = ... // initialize statement
try {
ResultSet rs = ps.executeQuery();
try {
// use ResultSet
return someResult;
} finally {
rs.close();
}
} finally {
ps.close();
}
}
虽然它并不是假装完整的解决方案(许多嵌套的try finally
都是不可读的),但它有几个优点:
- 方法本身不处理异常处理。通常只有调用方可以决定如何处理异常
- 如下所示,方法总是返回正确的结果或引发异常。不需要神奇的“错误值”
- 资源仅在初始化时关闭。无需检查
null
berodeclose()
您还可以利用这样一个事实,即对于要关闭的每个类,close
方法都没有参数,并创建一个反射助手方法,如下所示:
public static final void tryClose(Object o){
if(o != null){
Method[] m = o.getClass().getMethods();
for (Method method : m) {
if("close".equals(method.getName())){
if(!method.isAccessible()) method.setAccessible(true);
try {
method.invoke(o);
} catch (Exception e) {
System.err.println(e);
}
break;
}
}
}
}
编辑:使用FileWriter进行测试,在我的机器上运行良好。您还可以利用这样一个事实,即对于要关闭的每个类,close
方法没有参数,并创建一个反射帮助器方法,如下所示:
public static final void tryClose(Object o){
if(o != null){
Method[] m = o.getClass().getMethods();
for (Method method : m) {
if("close".equals(method.getName())){
if(!method.isAccessible()) method.setAccessible(true);
try {
method.invoke(o);
} catch (Exception e) {
System.err.println(e);
}
break;
}
}
}
}
编辑:通过FileWriter测试,在我的机器上运行良好。也许可以看看如何使用方面。您可能会使用aspectJ来编写此功能。您可能会对@TomaszNurkiewicz感兴趣。感谢您向我介绍Spring JDBC,我不会在这个项目中使用它,但我会记住这一点。也许可以看看如何使用Aspects。你可以使用aspectJ来编织这个功能。你可能会对@TomaszNurkiewicz感兴趣。谢谢你向我介绍Spring JDBC,我不会在这个项目中使用它,但我会记住这一点。是的,如果我继续使用方法的话,我正在考虑这个问题。不管怎样,谢谢是的,我在想如果我继续学习方法的话。不管怎样,谢谢你,这正是我要做的。谢谢你指点lib。我不久前用过它,完全忘记了那些实用程序,也就是我要做的。谢谢你指点lib。我不久前用过它,完全忘记了那些对我期望的有点太多的实用程序;)。谢谢分享。这对我的期望来说有点太高了;)。谢谢分享。