web-dev-qa-db-ja.com

データベース接続は常に開いたままにする必要がありますか、それとも必要な場合にのみ開く必要がありますか?

データベースへの接続を必要とするbukkitプラグイン(minecraft)があります。

データベース接続は常に開いたままにする必要がありますか、それとも必要に応じて開いたり閉じたりする必要がありますか?

28
aman207

データベース接続は、必要なときにのみ開いて、必要なすべてのジョブを実行した後に閉じる必要があります。コードサンプル:

  • Java 7より前:

    Connection con = null;
    try {
        con = ... //retrieve the database connection
        //do your work...
    } catch (SQLException e) {
        //handle the exception
    } finally {
        try {
            if (con != null) {
                con.close();
            }
        } catch (SQLException shouldNotHandleMe) {
            //...
        }
    }
    
  • Java 7:

    try (Connection con = ...) {
    } catch (SQLException e) {
    }
    //no need to call Connection#close since now Connection interface extends Autocloseable
    

ただし、データベース接続を手動で開くのは非常にコストがかかるため、 データベース接続プール を使用することを強くお勧めします。これにより、物理データベース接続が処理され、closeすると(つまり、Connection#close)、物理データベース接続はSLEEPモードであり、まだ開いています。

関連Q/A:

データベース接続プールを処理するいくつかのツール:

19
Luiggi Mendoza

あなたのニーズは何に依存します。

接続の作成には時間がかかるため、データベースに頻繁にアクセスする必要がある場合は、接続を開いたままにしておくことをお勧めします。また、プールを作成して、多くのユーザーがデータベースに同時にアクセスできるようにすることをお勧めします(必要な場合)。

この接続を数回だけ使用する必要がある場合は、開いたままにしておくことはできませんが、データベースにアクセスするときに遅延が発生します。だから私はあなたがしばらく接続を開いたままにするタイマー(接続タイムアウト)を作ることをお勧めします。

3
qiGuar

実際、アプリケーションをどのように記述するかがすべての問題です。それは芸術ですが、悲しいことに、誰もがMicrosoftのチュートリアルのような優れた実践のためのチュートリアルを採用しています。

コーディング対象がわかっている場合は、アプリケーションの存続期間中、接続を開いたままにします。それは簡単です、あなたが朝あなたが仕事に行かなければならないからではなく、毎日私たちはあなたのためだけに特別なルートを作らなければならないのではありません!あなたはその単一のルートを取るか、誰もがするように2つまたは4つです!トラフィックを判断し、必要に応じて2つ、4つ、または6つのルートを作成します。これらの4または6ルートのトラフィックがある場合、待機します!

ハッピーコーディング。

2
intiko81

クエリを実行するたびに接続を閉じる必要があります。クエリが相互にぶら下がっているため、複数のクエリを同時に実行する必要がある場合があります。たとえば、「最初の挿入タスクを従業員に割り当てる」などです。このとき、同じトランザクションでクエリを実行してコミットし、エラーが発生した場合はロールバックします。デフォルトでは、JDBCで自動コミットが無効になっています。

接続プーリングを使用します。Webアプリケーションを開発している場合は、App Serverの接続プーリングを使用します。アプリサーバーは各アプリケーションに同じプーリングを使用するため、1つのポイントから接続数を制御できます。ApacheTomcatの接続プーリングを強くお勧めします。

追加情報として:接続、ステートメント、およびResultSet。

1.接続を閉じる場合、閉じるステートメントまたは結果セットは必要ありません。これらは両方とも自動的に閉じられます。

2.ステートメントを閉じると、ResultSetも閉じます

3.このようにtry-with-resourcesを使用する場合:

try (Connection con = ...) {
} catch (SQLException e) {
}

これは、接続を自動的に閉じます。try-with-resourcesは自動クローズ可能なオブジェクトを必要とし、Connectionは自動クローズできるためです。try-with-resourcesの詳細を見ることができます here

2
Sarkhan

接続は、必要な場合にのみ開く必要があります。実際に必要になる前に開いている場合は、接続プールからアクティブな接続を1つ減らします。そのため、最終的にはアプリケーションのユーザーに影響します。

そのため、必要な場合にのみ接続を開き、プロセスの完了後に接続を閉じることをお勧めします。

アプリケーションで例外が発生した場合でも、接続が確実に閉じられるように、finallyブロック内に接続クローズロジックを配置してください。

finally
{
connection.close()
}
0
Sai Avinash