У меня есть приложение весенней загрузки с JPA и Hibernate как ORM.Я использую Hikaricp для пула соединений.Поэтому у меня есть API, который выбирает некоторые записи из базы данных, применяет некоторую бизнес-логику и возвращает результат клиенту.Поскольку бизнес-логике нужно выполнить тяжелую задачу (вызов другого API-интерфейса).
Я ожидал, что соединение с базой данных должно быть возвращено обратно в пул, поскольку записи извлекаются успешно и ничего общего с этим соединением, но соединение по-прежнему сохраняется.открыт (получение утечки соединения с помощью HikariCP (leakDetectionThreshold = 5000))
Конфигурация Hikari.
hikari:
idleTimeout: 10000
connectionTimeout: 60000
maximumPoolSize: 10
minimumIdle: 2
poolName: gor-srms
leakDetectionThreshold: 5000
Класс конфигурации базы данных
@ Configuration @EnableTransactionManagement@EnableJpaRepositories (entityManagerFactoryRef = "srmsEntityManagerFactory" ,actionManagerRef = "srmsTransactionManager", basePackages = {"com.gor.platform.srms.service.dao"})
public class SrmsDatabaseConfig {
@Autowired
private Environment environment;
@Autowired
JpaVendorAdapter jpaVendorAdapter;
@Bean(name = "srmsDataSource")
public DataSource dataSource() {
final HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(environment.getProperty("srms.db.driver"));
dataSource.setJdbcUrl(environment.getProperty("srms.db.url"));
dataSource.setUsername(environment.getProperty("srms.db.username"));
dataSource.setPassword(environment.getProperty("srms.db.password"));
dataSource.setIdleTimeout(Long.valueOf(environment.getProperty("hikari.idleTimeout")));
dataSource.setConnectionTimeout(Long.valueOf(environment.getProperty("hikari.connectionTimeout")));
dataSource.setMaximumPoolSize(Integer.parseInt(environment.getProperty("hikari.maximumPoolSize")));
dataSource.setPoolName(environment.getProperty("hikari.poolName"));
dataSource.setMinimumIdle(Integer.parseInt(environment.getProperty("hikari.minimumIdle")));
dataSource.setLeakDetectionThreshold(Long.valueOf(environment.getProperty("hikari.leakDetectionThreshold")));
return dataSource;
}
@Bean(name = "srmsEntityManagerFactory")
public EntityManagerFactory entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean();
lef.setDataSource(dataSource());
lef.setJpaVendorAdapter(jpaVendorAdapter);
lef.setPackagesToScan(environment.getProperty("srms.entitymanager.packagesToScan"));
lef.setPersistenceUnitName(environment.getProperty("srms.hibernate.unit_name"));
lef.afterPropertiesSet();
return lef.getObject();
}
@Bean(name = "srmsTransactionManager")
public PlatformTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory());
}
@Bean(name = "srmsEntityManager")
public EntityManager entityManager() {
return entityManagerFactory().createEntityManager();
}
} * 1015 Repositкласс
public interface ServiceRequestDao extends Dao<MServiceRequest, Long> {
@Query(value = "Native query.....", nativeQuery = true)
Long getParentId(@Param("childId") Long childId);
}