1

Oracle DB を使用して Websphere コマース サイトを実行しており、DB 接続が不足しているという問題に直面しています。準備されたステートメントを取得し、接続を確立するために 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()たとえば、メソッドは 2 つの を作成する可能性がありますJdbcHelper。私が間違っていなければ、プライマリ スレッドがオブジェクトを作成してからずっと後に、2 番目のスレッドが theObject を参照するという保証さえありません。通常はそうなりますが、JVM が実行されるアーキテクチャのおかげです。

これを Web サーバー内で実行している場合、競合の問題が発生する可能性が高く、2 つのスレッドが同時に接続を変更しています。独自の接続プールなどを展開しない限り。

ブライアンの言うとおりです。この (困難な) 問題を解決してくれる、無料で入手できるライブラリの 1 つを使用してください。

于 2009-09-25T12:58:31.603 に答える