我们正在运行一个带有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);
}
}
答案 0 :(得分:1)
您的连接很可能来自池,而关闭它实际上将返回到池的连接(在封面下)。我认为发布获取连接的代码,使用它并通过JDBCHelper关闭它将会更有用。
重新。你的单身人士,我不知道你为什么要使用它,因为它似乎没有什么可以保证它是一个单身人士。查看Apache Commons DbUtils除此之外还有其他内容。
答案 1 :(得分:0)
此代码似乎仅针对单线程操作编写,因为它缺少任何同步代码。例如,getJdbcHelper()
方法可能会创建两个JdbcHelper
。如果我没有弄错,甚至不能保证第二个线程会在主线程创建后很长时间内看到对象。虽然它们通常会依赖于JVM运行的体系结构。
如果您在Web服务器中运行此操作,则可能会遇到竞争问题,其中两个线程同时修改您的连接。除非您推出自己的连接池或其他东西。
Brian是对的,使用一个免费提供的库来解决这个(硬)问题。