1

我们正在运行一个带有 oracle 数据库的 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() 获取连接以在执行后传递给关闭的资源时,它会引发 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);
            }
        }
4

2 回答 2

1

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

关于。您的单身人士,我不确定您为什么要使用它,因为它似乎没有任何证据可以证明它是单身人士。查看Apache Commons DbUtils,它可以做这类事情以及更多。

于 2009-09-25T08:58:46.937 回答
0

这段代码似乎只为单线程操作而编写,因为它缺少任何同步代码。例如,该getJdbcHelper()方法可能会创建两个JdbcHelpers。如果我没记错的话,甚至不能保证第二个线程会在主线程创建对象很久之后看到它。尽管它们通常会,但凭借 JVM 运行的架构。

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

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

于 2009-09-25T12:58:31.603 回答