1

I'm getting below error after 5-6 requests.

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

Using below code working perfectly, except it exhausts the connection pool after few requests.

I'm new to Spring framework, and made up all these using online samples. I have tried a few variants and all failed. Any help would be appreciated. Thanks.

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
...

ApplicationConfiguration.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");
        }
    }
Stalin Gino
  • 592
  • 9
  • 28

1 Answers1

0

This Code is working good.

The issue was with another @Repository class in the project was doing

@Inject
private SessionFactory sessionFactory;

which was eating up the connection, even when the code will not be called in the test service. I'm still not sure how that works, but once i replace that code with

@PersistenceContext
private EntityManager em;

it worked.

Stalin Gino
  • 592
  • 9
  • 28
  • I am using the following technique to get the HibernateSession: http://stackoverflow.com/a/33881946/272180 and since a while I get leaks as well in an application. It used to work well before. Strange. – yglodt May 16 '17 at 15:42