我有一个用于测试目的的小型 Java 应用程序。我最近搬到了hikari。我注意到的是我不断收到此错误。
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:602)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:195)
at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:145)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:85)
Run Code Online (Sandbox Code Playgroud)
以下是我最初对 hikari 的设置。
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/****");
config.setUsername("***");
config.setPassword("*****");
config.setMaximumPoolSize(20);
Run Code Online (Sandbox Code Playgroud)
我的两个设备几乎没有使用它,我确保最后我确实关闭了它。所以我不知道为什么它不断收到错误?可能是什么问题,或者我需要更改一些设置吗?
我的 hikari 版本是 HikariCP-2.6.1.jar。
我用 2.14.0 和 2.13.3 对此进行了测试,我将 JDBC Appender 与 DynamicThresholdFilter 结合使用,并尝试了普通的 Logger 和 AsyncLogger。
在 JDBC Appender 中,我还尝试了 PoolingDriver 和 ConnectionFactory 方法。
事实证明,由于 Log4j2,线程没有并行启动。
使用 AsyncLogger 甚至使情况变得更糟,因为输出表示 Appender 未启动,并且在 15.000 条预期日志中,数据库中只有 13.517 条。
为了重现这个问题,我做了一个 github repo 在这里看到:https : //github.com/stefanwendelmann/Log4j_JDBC_Test
编辑
我用 h2db 替换了 mssql-jdbc,并且线程不会阻塞。JMC 自动分析说有JdbcDatabaseManager 的锁定实例。
我的 mssql-jdbc 的 PoolableConnectionFactory 中是否存在任何配置问题,或者 dbcp/jdbc 驱动程序池是否存在一般问题?
编辑 2
在 Apaches LOGJ2 Jira 上创建票证:https ://issues.apache.org/jira/browse/LOG4J2-3022
编辑 3
为 mssql 和 h2:file 添加了更长的飞行记录
请问下面的代码是否可以正确使用连接池(DBCP)?
我提供 BasicDataSource 的实用程序类如下(几乎与 apache 示例相同)
public class DatabaseUtility {
private static BasicDataSource dataSource;
public static BasicDataSource getDataSource(Properties prop) {
if (dataSource == null)
{
BasicDataSource ds = new BasicDataSource();
ds.setUrl("jdbc:oracle:thin:@"+ prop.getProperty("db") + ":" + prop.getProperty("dbPort") + "/" +
prop.getProperty("dbService"));
ds.setUsername(prop.getProperty("dbUser"));
ds.setPassword(prop.getProperty("dbPassword"));
ds.setMinIdle(5);
ds.setMaxIdle(10);
ds.setMaxOpenPreparedStatements(100);
dataSource = ds;
}
return dataSource;
}
Run Code Online (Sandbox Code Playgroud)
然后我将上述内容用作:
public class MyClass {
public static boolean isNew(Properties prop, String label) {
Connection connection = null;
PreparedStatement ps = null;
try {
BasicDataSource dataSource = DatabaseUtility.getDataSource(prop);
connection …
Run Code Online (Sandbox Code Playgroud) dbcp ×3
java ×3
datasource ×1
hikaricp ×1
jdbc ×1
log4j2 ×1
logging ×1
spring ×1
sql-server ×1