Утечка соединения Spring Hibernate

Я получаю ошибку ниже после 5-6 запросов.

org.springframework.dao.DataAccessResourceFailureException
Unable to acquire JDBC Connection; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to acquire JDBC Connection

Использование приведенного ниже кода работает отлично, за исключением того, что он исчерпывает пул соединений после нескольких запросов.

Я новичок в Spring framework и сделал все это, используя онлайн-образцы. Я пробовал несколько вариантов, и все потерпели неудачу. Любая помощь будет оценена по достоинству. Спасибо.

application.yml

spring:
    datasource:
        type: com.zaxxer.hikari.HikariDataSource
        dataSourceClassName: com.mysql.jdbc.jdbc2.optional.MysqlDataSource
        jdbcUrl: jdbc:mysql://localhost:3306/db_name?autoReconnect=true&useSSL=false&useUnicode=true&characterEncoding=utf8
        catalog: db_name
        username: myusername
        password: mypassword
        testOnBorrow: true
        validationQuery: SELECT 1
        testWhileIdle: true
        timeBetweenEvictionRunsMillis: 3600000
    jpa:
        show_sql: true

hibernate:
    dialect: org.hibernate.dialect.MySQLDialect
    show_sql: false
    format_sql: true
    connection:
        provider_class: com.zaxxer.hikari.hibernate.HikariConnectionProvider
        release_mode: after_transaction
...

Конфигурация приложения.java

@Configuration
@PropertySource("classpath:application.yml")
@EnableTransactionManagement
@EnableSwagger2
@EntityScan("com...dal.data")
public class ApplicationConfiguration extends WebMvcConfigurerAdapter {

    @Configuration
    @ConfigurationProperties(prefix="spring.datasource")
    public class JpaConfig extends HikariConfig {}

    @Autowired
    private JpaConfig jpaConfig;

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        return new HikariDataSource(jpaConfig);
    }

    @Bean
    public SessionFactory sessionFactory() {
        LocalSessionFactoryBuilder factoryBuilder = new LocalSessionFactoryBuilder(dataSource());
        factoryBuilder.addAnnotatedClasses(
                com...dal.data.MyEntity.class, ...
        );
        return factoryBuilder.buildSessionFactory();
    }

TestDaoImpl.java

@Repository
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class TestDaoImpl implements TestDao {

    private static final Logger logger = LoggerFactory.getLogger(TestDaoImpl.class);

    @PersistenceContext
    private EntityManager em;

    @SuppressWarnings("unchecked")
    @Override
    public List<MyEntity> getEntities() {
        return em.unwrap(Session.class)
                .createCriteria(MyEntity.class, "myEntity")
                .list();
    }

    @Override
    @Transactional
    public void saveTest(MyEntity test) throws OperationException {
        try {
            em.persist(test);
        } catch (Exception e) {
            logger.error("ERROR saving test", e);
            throw new OperationException("PS-SERVER");
        }
    }

person Stalin Gino    schedule 31.12.2016    source источник


Ответы (1)


Этот код работает хорошо.

Проблема заключалась в том, что другой класс @Repository в проекте делал

@Inject
private SessionFactory sessionFactory;

который съедал соединение, даже когда код не будет вызываться в тестовом сервисе. Я до сих пор не уверен, как это работает, но как только я заменю этот код на

@PersistenceContext
private EntityManager em;

это сработало.

person Stalin Gino    schedule 04.01.2017
comment
Я использую следующую технику для получения HibernateSession: stackoverflow.com/a/33881946/272180, и через некоторое время я получаю утечки, а также в приложении. Раньше работало хорошо. Странный. - person yglodt; 16.05.2017