Соединения с базой данных открыты до тех пор, пока http-запрос не будет завершен - PullRequest
0 голосов
/ 04 февраля 2019

У меня есть приложение весенней загрузки с 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);

}

...