无法关闭JDBC资源!

问题描述:

我们正在运行一个带有oracle数据库的websphere商业网站,并面临着我们用完数据库连接的问题。 我们使用JDBCHelper单例获取准备好的语句并找出连接。无法关闭JDBC资源!

public static JDBCHelper getJDBCHelper() { 

       if (theObject == null){     
        theObject = new JDBCHelper(); 
       } 

     return theObject; 
} 
public void closeResources(Connection con, PreparedStatement pstmt, ResultSet rs){ 

     try{ 
      if(rs!=null){ rs.close();} 
     }catch(SQLException e){ 
      logger.info("Exception closing the resultset"); 
     }try{ 
      if(pstmt!=null) { pstmt.close(); } 
     }catch(SQLException e){ 
      logger.info("Exception closing the preparedstatement"); 
     }try{ 
      if(con!=null){ con.close(); } 

     }catch(SQLException e){ 
      logger.info("Exception closing the connection"); 
     } 
} 

然而,当我们试图让使用prepStmt.getConnection()传递到接近资源执行后的连接,它抛出一个SQL例外。任何想法为什么?执行后立即关闭连接吗?我们使用单例JDBCHelper有什么不对吗?

编辑

部分,这使得准备好的语句,执行和关闭连接

PreparedStatement pstmt = jdbcHelper.getPreparedStatement(query); 
try{ 
//rest of the code 
int brs = pstmt.executeUpdate(); 
} 

finally{ 
      try { 
       jdbcHelper.closeResources(pstmt.getConnection(),pstmt); 
      } catch (SQLException e1) { 
       logger.logp(Level.SEVERE,CLASS_NAME,methodName,"In the finally block - Could not close connection", e1); 
      } 
     } 
代码

您的连接将最有可能来自一个游泳池,并关闭它实际上将返回到连接游泳池(在封面下)。我认为发布获取连接的代码,使用它并通过JDBCHelper关闭它会更有用。

Re。你的单身人士,我不知道你为什么使用这个,因为它似乎没有任何东西,它是一个单身人士。退房Apache Commons DbUtils这是做这种东西,除此之外。

+0

谢谢...已经更新了一部分代码...虽然看起来很直截了当 – sarego 2009-09-25 09:09:17

此代码似乎只是为单线程操作编写的,因为它缺少任何同步代码。例如,getJdbcHelper()方法可能会创建两个JdbcHelper。如果我没有弄错,甚至不能保证第二个线程会在主线程创建它之后很长时间看到该对象。尽管它们通常会依靠JVM运行的体系结构。

如果你在网络服务器中运行这个服务,你可能会遇到种族问题,其中两个线程同时修改你的连接。除非你推出了自己的连接池或其他东西。

Brian是对的,使用免费提供的一个库来解决这个(困难)问题。