1

データを処理して MySQL データベースにアップロードするためのアプリケーションを Java で開発しています。このアプリケーションでは、ディレクトリ内の処理が必要なすべてのファイルを反復処理します。ファイルの各行で、その行のデータをさまざまな変数に保存し、いくつかの変換を行って、すべてのデータをデータベースにアップロードする準備を整えます。次に、PreparedStatement と INSERT クエリを使用して、その行のデータをデータベースにアップロードする予定です。

自分の状況でのベスト プラクティスがよくわかりません。私はこれを自分自身に教える過程にあるので、初めて正しく行うための小さなガイダンスを探しています.

アプリケーションのランタイムの開始時に単に接続を開く (つまり、一度開く) のは不適切でしょうか? 挿入クエリごとに、PreparedStatement を作成して閉じますが、すべてのファイルの処理が完了するまで接続を開いたままにします。

他の場所で接続プールについて読んだことがありますが、自分の状況に適用できるかどうかわかりません。接続を頻繁に開いたり閉じたりするとコストがかかることはわかっていますが、一度開いてその接続ですべてのクエリを実行できるようにすべきではありませんか?

接続プールの使用をお勧めする場合、私の状況にどのサービスをお勧めしますか? できれば、すぐに対処するのは簡単です。私のプロジェクトはやや時間に敏感です。ありがとう。

4

2 に答える 2

3

デスクトップJavaアプリケーションを開発している場合は、接続プールを使用しません。接続プールはJavaアプリケーションサーバー(Tomcat、JBoss、Glassfish)によって管理され、デスクトップJavaアプリケーションでは使用できません。

更新を1回だけ行う場合は、接続を開いたままにしておくのが妥当です。

また、バッチ更新はあなたにとって素晴らしいアイデアです:

String connectionURL = "jdbc:mysql://localhost:3306/database";
Connection con = null;
PreparedStatement stmt = null;

try {
    Class.forName("com.mysql.jdbc.Driver");
    con = DriverManager.getConnection(connectionURL);
    stmt = con.prepareStatement(statement);

    for (Object o : list) {    // this is a list of your Java entity class
        stmt.setString(1, "foo");    // this is to update the parameters in the PreparedStatement
        stmt.setString(2, "bar");

         stmt.addBatch();     //  this adds the PreparedStatement to the batch of statements to execute
    }

    stmt.executeBatch();

} catch (SQLException e) {
    e.printStackTrace();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (stmt != null) {
        stmt.close();
    }
    if (con != null) {
        con.close();
    }
}

バッチ更新の考え方は、パラメーターを変更するだけで「新しい」ステートメントをステートメントのバッチに追加できる1つのプリペアドステートメントを用意することです。次に、stmt.executeBatch()を呼び出すときに、それらすべてを一度に実行できます。

ただし、そのようなステートメントが多数ある場合は、一度に30個程度のステートメントを実行することをお勧めします。そうしないと、プログラムがクラッシュ/失敗した場合に取り残されてしまいます。

于 2012-06-08T03:53:33.603 に答える
0

これは、実装しているバッチ プロセスのように聞こえます。その場合、データベースへの専用接続がより適切なソリューションです。

于 2012-06-08T03:39:35.270 に答える