【发布时间】:2023-01-16 18:39:43
【问题描述】:
我使用 Spring 框架(带有 JPA)。解析 URL 中的 id 以动态创建和使用数据源。 Datasource使用了caffeine来缓存,但是过期了也没有从内存中释放。这导致了内存泄漏。过期时间后,从缓存中移除,但不从内存中释放。即使删除缓存以允许使用一次数据源,也会发生内存泄漏。有没有办法缓存数据源?
下面是部分代码。
private HikariDataSource getDataSourceRdsLocation(RdsLocationEntity rdsLocationEntity){
HikariConfig config = new HikariConfig();
config.setAllowPoolSuspension(true);
config.setJdbcUrl("jdbc:mysql://"+rdsLocationEntity.getServerReadOnly()+"/"+rdsLocationEntity.getDatabaseName());
config.setUsername("");
config.setPassword("");
config.setPoolName(rdsLocationEntity.getName());
config.setMaximumPoolSize(10);
config.setMinimumIdle(1);
config.setIdleTimeout(3600000);
config.setMaxLifetime(7200000);
config.setConnectionTimeout(500);
return new HikariDataSource(config);
}
new CaffeineCache(cache.getCacheName(), Caffeine.newBuilder().recordStats()
.removalListener((key, value, cause) -> {
if (cause.wasEvicted() && value instanceof HikariDataSource ds) {
ds.close();
}
})
.expireAfterWrite(cache.getExpiredAfter(), cache.getTimeUnit())
.maximumSize(cache.getMaximumSize())
.build()
【问题讨论】:
-
你能在github上分享一个复制器吗?
-
与@ozkanpakdil 一样,我也建议共享 Github 存储库以重现问题。另外,您做了哪些测量/观察来得出内存泄漏的结论?
-
即使调用了 HikariDataSource 的 close,该对象仍然保留在线程本地。我通过使用 jprofiler 进行堆转储的结果找到了它。这个本地线程似乎是为了管理 HikariDataSource 而创建的,但我一直无法找到直接访问它或从中释放对象的方法。
标签: spring-boot jpa hikaricp