JDBCを使用してMySQLデータベースに接続しているJavaアプリケーションの問題をトラブルシューティングしようとしています。表面の問題は、有効なデータベースに接続すると、DriverManager.getConnectionがNULLを返すことがあります。ほんの数分後に、同じデータベースに有効な接続が返されることがあります。Java/JDBC/MySQL:DriverManager.getConnection()がNULLを返す理由をトラブルシューティングするにはどうすればよいですか?
私はこの問題のトラブルシューティングを試みる立場にありますが、Java、JDBC、およびMySQLがどこで会うのかについての私の理解はかなり制限されています。私はこれについて多くの研究をしてきましたが、壁に衝突し、ここからどこに行くのか分かりません。ここで
は、私がこれまで何をやったかです:
- のJava側では、私は()のコードにしたDriverManager.getConnectionにすべての方法をトレースしています。私はそこからNULL接続が来ていると判断しましたが、getConnectionのフードの下で何が起こっているのかわかりません。私はこのオンラインの完全な説明を見つけるのに苦労してきました。
- MySQLの終わりに、私は利用可能な接続がたくさんあることを確認しました。(約1000回の無料接続があります)、最大接続数を超えていません。ログを見ると、問題が最も多い時間帯に中断しているコネクション数が少し増えたと判断できましたが、なぜこれらの接続が中止されたのかを判断する方法がわかりません(MySQL中止、JDBC、Javaアプリケーション?)私はMySQLの終わりで探している必要があるかどうかはわかりません。
- 真ん中では、JDBCではかなり失われています。私はhttp://dev.mysql.com/doc/refman/5.1/en/connector-j.htmlでMySQL Connector/Jを読んできましたが、その情報がJavaで利用されているJDBCドライバに関係しているかどうかは不明です。
私がここからどこに行くことができるかについてのどんな方向も大いに感謝するでしょう。
ありがとうございます!
EDIT - 2/15、10:35 am CST より具体的ではないことをお詫び申し上げます。このアプリケーションは正常に動作するプロダクションアプリケーションです。 1日に数万件の接続を問題なく処理することができます。この問題は、1日のうちにランダムな時間帯に発生し、30秒から5分まで持続します。
ここで私はすべての方法ダウンしたDriverManager.getConnectionにトレースしたコードです:
var dbConn = DatabaseConnectionFactory.createDatabaseConnection('com.mysql.jdbc.Driver','jdbc:mysql://'+ serverName +':' + port + '/' + database, userName, password);
public static DatabaseConnection createDatabaseConnection(String driver, String address, String username, String password) throws SQLException {
try {
Class.forName(driver);
} catch (Exception e) {
e.printStackTrace();
}
Properties info = new Properties();
info.setProperty("user", username);
info.setProperty("password", password);
// this property should only be set if it's for embedded database
info.setProperty("shutdown", "true");
return new DatabaseConnection(address, info);
}
public DatabaseConnection(String address, Properties info) throws SQLException {
logger.debug("creating new database connection: address=" + address + ", " + info);
this.address = address;
connection = DriverManager.getConnection(address, info);
}
私はコードですべての問題ではなく、問題がどこかのgetConnectionの間で実際にそこにあるとは思わないが、 ()とMySQL。
いくつかのコードを投稿すると、より簡単にお手伝いします。 – duffymo
接続(ネットワーク)が信頼できない可能性があり、マシンが常にdbに接続されているマシンに接続されていない可能性があるので、接続が確立できない場合があります。 –
Jeff - これは私の疑いですが、これが発生している可能性があります。 DriverManager.getConnectionがNULLを返すさまざまな理由を判断する方法がある場合は、この問題を大幅に追跡するのに役立ちます。 – TACHEON