Java连接未在Java Application中关闭

jef*_*eff 2 java oracle database-connection

我在一些不使用连接池的旧Java Web应用程序中发生连接泄漏.试图找到泄漏很难,因为IT不会授予我访问v $ session的权限SELECT Count(*) FROM v$session;

所以我试图使用System.out语句进行调试.即使在conn.close();我将conn打印到系统日志文件时关闭连接,它也会为我提供连接对象名称.

try { 
    Connection conn;
    conn.close() 
    } 
catch (SQLException e) { }
finally { 
    if (conn != null) {
        try {
           System.out.println("Closing the connection"); 
           conn.close();
           }
        catch (Exception ex) 
            {
            System.out.println("Exception is " + ex); 
            }
     }
 }
// I then check conn and it is not null and I can print the object name.
    if (conn != null) {
            System.out.println("Connection is still open and is " + conn); 
    }
Run Code Online (Sandbox Code Playgroud)

但是,如果我conn = null;conn.close();声明下方添加,则连接现在似乎已关闭.所以我的问题是conn.close(); 实际上释放我的连接或我也必须使它为null以真正释放我的连接.就像我说的那样,我很难确定连接是否实际发布而无法查询v $ session.有没有java代码片段可以给我打开连接?

这可能是教育性的,因为我计划重构这些应用程序以使用连接池,但我现在正在寻找一个快速的绑定.

duf*_*ymo 6

关闭的重要部分是数据库方面正在发生的事情.这是必须关闭该连接的RDBMS.调用close()方法是将消息传递给数据库以关闭连接的方法.

将连接设置为null不会指示RDBMS执行任何操作.

相同的逻辑适用于ResultSet,它是数据库端的游标和Statement.您需要以创建它们的相反顺序关闭创建它们的方法的finally块中的各个try/catch块中的那些块.否则,您将看到有关"超出最大游标数"的错误.