私はしようとしています:
- JNDI から MySQL データソースを読み取る
- この JNDI データソースを使用して、DBCP 接続プールと JDBC 接続を構成します
- JDBC を使用して SQL ステートメントを起動する
- 丁寧に閉じます (プールへの接続を解放し、他のものを閉じるなど)。
このコードは頻繁に発生するため (アプリの単純なログ システム)、複数の SQL 実行にわたって開いたままにしておくことができるものはすべて開いたままにしておくことが望ましいです (何かを開く/閉じるなどのオーバーヘッドを減らすため)。
これが私の最善の試みです:
try {
// 1. Obtain the dbLogger datasource from JNDI.
Context context = new InitialContext();
DataSource logDatabaseDS = (DataSource)context.lookup(logDatabaseJNDI);
// 2. Configure the connection pool with my JNDI datasource.
// HOW?
// 3. Obtain a connection from the pool.
// HOW?
// 4. Use this connection to fire a JDBC INSERT.
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("urlFromJNDI",
"userFromJNDI", "passwordFromJNDI");
PreparedStatement statement = conn.prepareStatement(InsertSQL);
statement.setString(1, appName);
statement.setLong(2, timestamp);
statement.setString(3, logLevel);
statement.executeUpdate();
// 5. Release the borrowed connection back to the pool.
// HOW?
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
}
基本的なセットアップは正しいと思います。よくわからない:
maxIdle
JNDI セット プロパティ ( 、maxWait
など)を使用して DBCP プールを構成する方法- 効率的な方法で DBCP プールから接続を借用します (したがって、このコードは 1 秒間に数十回または数百回起動し、リソースをリークすることはありません)。
- JNDI データソースからの接続文字列 URL、ユーザー名、およびパスワードを
DriverManager.getConnection(...)
メソッドに挿入します。 - 丁寧に/正しく接続を解放してプールに戻します。
そして、このプロセスを正しく設定していない場合は、最初に一般的なアプローチを修正してください。再度、感謝します!