Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 1.6 Java.sql try/catch/finally疯狂编码_Java_Try Catch - Fatal编程技术网

Java 1.6 Java.sql try/catch/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

我目前正在创建许多类,这些类将使用连接池访问数据库。 所以我得到一个连接,创建一个语句,然后得到结果集。(我不能使用Java 1.7和神奇的自动资源管理) 完成我的方法时,我必须以finally块完成:

        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
    berode
    close()

    • 再举一个例子。适合简单的小项目

      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
        berode
        close()

      您还可以利用这样一个事实,即对于要关闭的每个类,
      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。我不久前用过它,完全忘记了那些对我期望的有点太多的实用程序;)。谢谢分享。这对我的期望来说有点太高了;)。谢谢分享。