无法关闭JDBC资源!

时间:2009-09-25 08:53:08

标签: jdbc connection resultset prepared-statement

我们正在运行一个带有oracle DB的websphere商业站点,并面临着我们的数据库连接不足的问题。 我们使用JDBCHelper单例来获取准备好的语句并建立连接。

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()获取连接以在执行后传递给close资源时,它会抛出一个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);
            }
        }

2 个答案:

答案 0 :(得分:1)

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

重新。你的单身人士,我不知道你为什么要使用它,因为它似乎没有什么可以保证它是一个单身人士。查看Apache Commons DbUtils除此之外还有其他内容。

答案 1 :(得分:0)

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

如果您在Web服务器中运行此操作,则可能会遇到竞争问题,其中两个线程同时修改您的连接。除非您推出自己的连接池或其他东西。

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