web-dev-qa-db-ja.com

DriverManager getConnectionの接続タイムアウト

標準のJDBC方法を使用してDBに接続しようとしています

connection = DriverManager.getConnection(url, username, password);

接続のタイムアウトの最大値、接続の存続期間はありますか、値を増やすことができますか?接続が永遠に開かれている場合、それは良いアイデアですか?.

23
kal

通常、値はDB制御です。コードを使用して制御することはできません。使用するDBサーバーによって異なります。通常、約30分から最大1時間です。

一方、Connectionを永久に開いたままにしておくことは非常に悪い考えです。ベストプラクティスは、およびを取得することです。最短スコープでConnectionStatementResultSetを閉じて、リソースリークと、リークとタイムアウトによるアプリケーションクラッシュを回避します。

確かに、DBの接続は高価なタスクです。アプリケーションが比較的長時間実行され、DBにかなり頻繁に接続することになっている場合は、接続プールを使用して接続パフォーマンスを改善することを検討してください。アプリケーションがWebアプリケーションの場合は、アプリケーションサーバーのドキュメントを参照してください。通常、DataSourceのフレーバーで接続プール機能が提供されます。クライアントアプリケーションの場合は、 Apache Commons DBCP (一般的に使用され、多くのアプリサーバーで使用される)、 C3P (Hibernateから既知)および Proxool (XA接続が必要な場合)。

接続プールを使用する場合、適切なJDBCコード、i.o.wを記述する必要があることに注意してください。 acquire and可能な限り短いスコープ内のすべてのリソースを閉じます。接続プールは、実際に接続を閉じるか、または再利用のためにプールに解放することを心配します。

この記事 JDBCの基本を適切な方法で行う方法からさらに洞察を得ることができます。

これがお役に立てば幸いです。

26
BalusC

DriverManagerで次のようにタイムアウトを設定できます。

 DriverManager.setLoginTimeout(10);
 Connection c = DriverManager.getConnection(url, username, password);

これは、指定した時間内に接続が開かない場合、タイムアウトになることを意味します。

接続を永久に開いたままにしておくという点では、接続を閉じないことは可能ですが、それは良い考えではないかもしれません。接続が終了したらすぐに接続を閉じる必要があります。

接続の開始と終了を最適化する場合は、接続プールを使用できます。

30

それが私のために働いたので、答えとしてユーザーflamming_pythonからのコメントのより完全な再投稿を再投稿するだけです:

dbConnectionString = "jdbc:mysql://"+dbHost+":"+dbPort+"/"+dbTable+"?user="+dbUser+"&password="+dbPassword;
Properties properties = new Properties();
properties.put("connectTimeout", "2000");
dbConnect = DriverManager.getConnection(dbConnectionString, properties);

元のコメント:
"LoL @ your threads-Propertiesオブジェクトpropを作成し、それからprop.put(" connectTimeout "、" 2000 ")(" 2000 "はミリ秒単位のタイムアウト)で作成できます。そして、propオブジェクトをURLとともにDriverManager.getConnection()メソッドに渡します」

7
Felix

Connector/J MYSQLドライバーでこれを行う方法は次のとおりです。

_String qqq = "jdbc:mysql://localhost/Test?connectTimeout=TIME_IN_MILLIS";
conn = DriverManager.getConnection(qqq, db_user, db_pass);
_

setLoginTimeout()が何もしなかった後、私にとってはうまくいきました。

7
QQ_QQ

Bestroが示唆したように、関連付けられたタイムアウトを持つFutureを使用することは可能です。例えば:

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Connection> future = executor.submit(new Callable<Connection>() {

    @Override
    public Connection call() throws Exception {
        Connection con = DriverManager.getConnection(url, username, password);
        return con;
    }
});

Connection con = null;
try {
    con = future.get(5, TimeUnit.SECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException ex) {
    Logger.getLogger(Scratch.class.getName()).log(Level.SEVERE, null, ex);
}
executor.shutdownNow();

if (con == null) {
    System.out.println("Could not establish connection");
} else {
    System.out.println("Connection established!");
}
0
Fidel