我试着:
- 从 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();
}
我相信我的基本设置是正确的。只是不确定:
- 如何使用 JNDI 设置的属性(如 、 等)配置
maxIdle
DBCPmaxWait
池 - 以有效的方式从 DBCP 池中借用连接(因此此代码每秒可以触发数十/数百次并且不会泄漏资源)
- 将来自 JNDI 数据源的连接字符串 URL、用户名和密码注入
DriverManager.getConnection(...)
方法中 - 礼貌/正确地将连接释放回池中。
而且,如果我没有正确设置此过程,请先纠正我的一般方法!再次感谢!