代码之家  ›  专栏  ›  技术社区  ›  jeff

Java应用中Oracle连接不关闭

  •  2
  • jeff  · 技术社区  · 14 年前

    在一些不使用连接池的较老的Java Web应用程序中,我有一个连接泄漏。 查找泄漏很困难,因为它不会授予我访问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); 
        }
    

    但是,如果我还补充 conn = null; 在下面 连接关闭(); 语句连接现在似乎已关闭。所以我的问题是conn.close();实际上释放了我的连接,还是必须使其为空才能真正释放我的连接。就像我说的,在没有查询v$session的情况下,很难确定连接是否真的被释放。是否有Java代码片段可以给我打开的连接??

    这可能是有教育意义的,因为我计划重构这些应用程序以使用连接池,但我现在正在寻找一个快速的创可贴。

    6 回复  |  直到 10 年前
        1
  •  6
  •   duffymo    14 年前

        2
  •  4
  •   Peter Tillemans    14 年前

        3
  •  3
  •   atk    14 年前

    conn.close() conn.isClosed()



    conn = null documentation

        4
  •  1
  •   Jay    14 年前

        5
  •  0
  •   CoolBeans Jeremy    14 年前

    如果(康恩)!=空)

    如果(conn.isclosed())

        6
  •  0
  •   ROMANIA_engineer Alexey    10 年前

    是否有Java代码片段可以给我打开的连接?

    Statement smt = null;
        ResultSet rs = null;
        try { 
            // Create Statement from connection
            smt = conn.createStatement();
            // Execute Query in statement 
            rs = stmt.executeQuery("SELECT 1 FROM Dual");
    
            if (rs.next()) {
                return true; // connection is valid
            }
            catch (SQLException e) {
                // Some sort of logging
                return false;
            }
            finally {
                if (smt != null) smt.close();
                if (rs != null) rs.close();
            }
    

    假设您使用的是Oracle,您只需快速猜测一下。 建议:为什么不安装jboss并通过它设置连接池?