gpt4 book ai didi

java - 通过单一方法关闭多个资源的最佳实践

转载 作者:行者123 更新时间:2023-12-01 12:39:53 25 4
gpt4 key购买 nike

我对 Java 很陌生。现在我正在使用 JSP 和 Servelet 开发 Web 服务。我有一个名为 DBUtil 的类,它处理数据库操作。因为这个类充当许多 JSP 页面的辅助类,所以我将每个函数都静态化。一个例子是这样的调用:

  public static boolean isAdmin (String uid) {
boolean result = false;
Connection conn = getConnection(); // Datamanager.getConnection(...);
PreparedStatement pstmt = null;
ResultSet rs = null;
try{
pstmt = conn.prepareStatement("select u_admin from table where uid = ?");
pstmt.setInt(1,Integer.parseInt(uid));
rs = pstmt.executeQuery();
if(rs.next()){
result = rs.getBoolean(1);
}
}catch(){
e.printStackTrace();
}finally{
try{
if(rs != null){
rs.close();
rs = null;
}
}catch(Exception e){
e.printStackTrace();
}
try{
if(pstmt != null){
pstmt.close();
pstmt = null;
}
}catch(Exception e){
e.printStackTrace();
}
try{
if(conn != null){
conn.close();
conn = null;
}
}catch(Exception e){
e.printStackTrace();
}
}
return result;
}

所以每个静态函数都会打开一些资源并关闭它。现在的问题是,许多函数必须关闭多个资源,例如 ResultSetPreparedStatementConnection。其中一些甚至有五个以上的资源,必须按一定的顺序关闭。因此,我编写了一个函数如下:

private static void closeResource(AutoCloseable ...resources ){
if (resources == null || resources.length == 0) {
return;
} else {
for (AutoCloseable rs: resources) {
try{
if(rs!= null) rs.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
}

这样我就不必为rs.close()编写繁琐的长行try-catch-语句。相反,我可以简单地调用 closeResource(pstmt,rs,conn) (以保持每个函数更短)。

这是一个好的做法吗?是否有任何其他解决方案可以通过单个函数关闭多个资源(我实际上正在寻找类似 C 宏的解决方案,但什么也没找到)。

同时,我也想问一下,我的静态函数操作数据库的方式是不是一个好的做法?我不想在 JSP 页面中缓存像 Conn 这样的对象,因为可能存在一些线程安全问题。如果我错了并且天真,请纠正我。

最佳答案

您可以通过在 ( ) (Java 7+) 之间声明资源来使用 try-with-resources。在括号之间,您可以声明实现 AutoClosable 的对象。

下面是使用 Scanner 和 ServerSocket 的示例,它们是需要关闭的资源,并且是AutoClosable:

try (Scanner scanner = new Scanner(System.in); ServerSocket socket = new ServerSocket(15180)) {
//use resources
}

一旦 try block 完成,括号内声明的所有资源将自动关闭

Try-with-resources Tutorial

关于java - 通过单一方法关闭多个资源的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com