0

基本的に、AbstractModel クラスで定義されたこれらのメソッドを使用して、データベースに接続および切断します。

    // close connection
    public void closeConnection(){
        try{
//          if (!rs.isClosed()){
//              rs.close();
//          }
            cstmt.close();
            SingletonConnection.instance();
            DatabaseConnection.closeConnection();
        } catch (SQLException e){
            System.out.println("SQL Exception: ");
            e.printStackTrace();
        }

    }

    // establish connection
    public void createConnection(){
        try {
            SingletonConnection.instance();
            myConnection = DatabaseConnection.establishConnection();
        } catch (SQLException e){
            e.printStackTrace();
        }
    }

ResultSet rs を閉じようとすると NullPointerException という別の問題が発生しましたが、c3p0 のドキュメントには、接続が終了するとデフォルトで ResultSet が閉じられると記載されています。

もちろん、これら 2 つのメソッドは、DatabaseConnection クラスのこれら 2 つのメソッドを呼び出します。

// create connection
public static Connection establishConnection() throws SQLException {
    return datasource.getConnection();
}

// close connection
public static void closeConnection() throws SQLException{
    DataSources.destroy(datasource);
}

したがって、基本的に getConnection() および destroy() メソッドを使用して、データソースの接続を開いたり閉じたりします。c3p0 接続プールを扱う場合、これは正しいアプローチですか? 今のところ問題なく動作しているようです。

4

2 に答える 2

2

TL; DRですが、私を捕らえたことが1つあります。

注:アプリがすぐに接続を使い果たしたため、プールの設定/パラメーターの一部にコメントしました。理由はわかりません。

その理由は、接続がプールに適切に戻されていないことが原因である可能性があります。また、コード内にaへの参照が見つからないためConnection.commit、トランザクションはまだ開いており、コミットされていないと思います。アプリケーションの終了後、PostgreSQLはこれらの接続をロールバックし、INSERTはなくなります。

それで:

  • TXNが実際にコミットされていることを再確認してください。
  • 接続がプールに正しく戻されていることを再確認してください。

それでも問題が解決しない場合:コードを大幅に削減してクリーンアップします。このサーバーには2つの目的があります。1つ目:これを実行しているときに、コードのエラーを自分で検出する場合があります2番目:SSCCEの例がある場合は、これを投稿すると、誰かがすぐに理解しようとする可能性があります。これは、現在のコードでは不可能です。

于 2012-07-06T14:43:20.707 に答える
0

私はそれを機能させましたが、それがどのように、またはなぜ機能するのか正確にはわかりません。このコード行が問題のようです:

myConnection.setAutoCommit(false);

モデルのメソッドからのものです。テーブル内のデータを変更するはずのメソッドでこの行をコメントアウトすると、うまくいったようです。問題は、データを挿入するいくつかの方法はうまく機能するように見えますが、他の方法はそうではないことです。理由はわかりません。

ドキュメント以外に、c3p0 の実装を簡単に説明する簡単な例はありますか? 私は 1 つを探していますが、何も見つかりませんでした。

この件についてさらに調査が進み次第、最新情報をお知らせします。

于 2012-07-07T07:05:32.420 に答える