Search code examples
javaspring-bootsap-asehikaricp

Stuckup with - HikariCP : JZ0C0: Connection is already closed (Sybase DB with SpringBoot v2.1.7)


I am getting Connection is already closed issue, for a CommandLineRunner -Spring Boot Application. Here is the tech stack I am using

  • SpringBoot v2.1.7
  • Sybase DB v16.x with jconn4

HikarCP - Configuration info :

DEBUG] 2020-05-22 10:51:58.449 [main] o.s.j.d.DataSourceUtils - Fetching JDBC Connection from DataSource
[DEBUG] 2020-05-22 10:51:58.450 [main] c.z.h.HikariConfig - GBSHikariCP - configuration:
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - allowPoolSuspension.............false
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - autoCommit......................true
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - catalog.........................none
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - connectionInitSql...............none
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - connectionTestQuery............."SELECT 1"
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - connectionTimeout...............30000
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - dataSource......................none
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - dataSourceClassName.............none
[DEBUG] 2020-05-22 10:51:58.451 [main] c.z.h.HikariConfig - dataSourceJNDI..................none
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - dataSourceProperties............{password=<masked>}
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - driverClassName................."com.sybase.jdbc4.jdbc.SybDriver"
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - healthCheckProperties...........{}
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - healthCheckRegistry.............none
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - idleTimeout.....................30000
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - initializationFailTimeout.......1
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - isolateInternalQueries..........false
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - jdbcUrl.........................jdbc:sybase:Tds:xxxxx.xxx.xx.xx:11111/SOMEDB
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - leakDetectionThreshold..........2500
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - maxLifetime.....................90000
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - maximumPoolSize.................20
[DEBUG] 2020-05-22 10:51:58.452 [main] c.z.h.HikariConfig - metricRegistry..................none
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - metricsTrackerFactory...........none
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - minimumIdle.....................5
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - password........................<masked>
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - poolName........................"HikariCP"
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - readOnly........................false
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - registerMbeans..................false
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - scheduledExecutor...............none
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - schema.........................."dbo"
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - threadFactory...................internal
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - transactionIsolation............default
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - username........................"usr111"
[DEBUG] 2020-05-22 10:51:58.453 [main] c.z.h.HikariConfig - validationTimeout...............10000

Here is the stack trace I see on the STS Console

2020-05-22 10:51:58.857 [main] c.z.h.p.PoolBase - HikariCP - Closing connection com.sybase.jdbc4.jdbc.SybConnection@4a183d02: (Failed to create/setup connection)
[DEBUG] 2020-05-22 10:51:58.859 [main] c.z.h.p.PoolBase - GBSHikariCP - Closing connection com.sybase.jdbc4.jdbc.SybConnection@4a183d02 failed
java.sql.SQLException: JZ0C0: Connection is already closed.
    at com.sybase.jdbc4.jdbc.ErrorMessage.raiseError(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybConnection.checkConnection(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybConnection.close(Unknown Source)
    at com.zaxxer.hikari.pool.PoolBase.quietlyCloseConnection(PoolBase.java:135)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:380)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:319)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:356)
    at org.springframework.boot.autoconfigure.orm.jpa.DatabaseLookup.getDatabase(DatabaseLookup.java:73)
    at org.springframework.boot.autoconfigure.orm.jpa.JpaProperties.determineDatabase(JpaProperties.java:142)
    at org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration.jpaVendorAdapter(JpaBaseConfiguration.java:113)
    at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration$$EnhancerBySpringCGLIB$$9d0516b2.CGLIB$jpaVendorAdapter$7(<generated>)
    at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration$$EnhancerBySpringCGLIB$$9d0516b2$$FastClassBySpringCGLIB$$9e5bd134.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
    at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:363)
    at org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration$$EnhancerBySpringCGLIB$$9d0516b2.jpaVendorAdapter(<generated>)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:622)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:456)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1251)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1171)
    at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:857)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:760)
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:509)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1321)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1160)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1105)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:743)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:390)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1214)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1203)
    at com.xxx.xx.xxx.jrt.JOBRunTP.main(JOBRunTP.java:44)

Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: JZ0C0: Connection is already closed.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:81)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:319)
    ... 61 common frames omitted
Caused by: java.sql.SQLException: JZ0C0: Connection is already closed.
    at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybConnection.handleSQLE(Unknown Source)
    at com.sybase.jdbc4.jdbc.SybConnection.isReadOnly(Unknown Source)
    at com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:413)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:374)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:541)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:157)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:115)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:78)

I also observed that , the same connection config perfectly works with a different Sybase user id . Is the issue specific to DB user ids ? any one help me where am I doing wrong .


Solution

  • At last this issue has been solved by adding the custome data source properties , as mentioned below in the spring boot application.yml file. Hope this helps others. These properties were validated at sybase db. (its application specific validation) .

    spring:
      datasource:
        hikari:
          data-source-properties:
            SELECT_OPENS_CURSOR : true
            applicationName: GBS«¼Æ¢ó½Ç²îª°»L