Hello,
I am trying to use Hikari together with PostgreSQL, but I get exception during initialization. I guess there is a minor bug in the code.
I get following exception:
java.lang.RuntimeException: Fail-fast during pool initialization
at com.zaxxer.hikari.pool.HikariPool.fillPool(HikariPool.java:499)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:162)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:113)
at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:102)
at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:111)
at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:77)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:573)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:637)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:666)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:674)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:714)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:797)
at com.spatialloader.writer.WifiGpsLocationWriterTest.findNearestBox(WifiGpsLocationWriterTest.java:78)
at com.spatialloader.writer.WifiGpsLocationWriterTest$1.run(WifiGpsLocationWriterTest.java:40)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.postgresql.util.PSQLException: Method org.postgresql.jdbc4.Jdbc4Connection.isValid(int) is not yet implemented.
at org.postgresql.Driver.notImplemented(Driver.java:753)
at org.postgresql.jdbc4.AbstractJdbc4Connection.isValid(AbstractJdbc4Connection.java:109)
at org.postgresql.jdbc4.Jdbc4Connection.isValid(Jdbc4Connection.java:21)
at com.zaxxer.hikari.util.PoolUtilities.isJdbc40Compliant(PoolUtilities.java:240)
at com.zaxxer.hikari.pool.HikariPool.addConnection(HikariPool.java:420)
at com.zaxxer.hikari.pool.HikariPool.fillPool(HikariPool.java:498)
... 16 more
My configuration:
(Spring init of datasource)
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"
p:driverClassName="${postgres.classname}"
p:jdbcUrl="${postgres.url}"
p:username="${postgres.username}"
p:password="${postgres.password}"
>
<property name="minimumIdle" value="7" />
<property name="maximumPoolSize" value="40" />
<property name="connectionTestQuery" value="SELECT 1" />
</bean>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.2.5</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.1-901.jdbc4</version>
</dependency>
I guess the problem is related with this method:
com.zaxxer.hikari.util.PoolUtilities#isJdbc40Compliant
this method expects throwing one of the following exceptions SQLFeatureNotSupportedException, AbstractMethodError, NoSuchMethodError, but Postgress is throwing org.postgresql.util.PSQLException which is a descendant of java.sql.SQLException - so it does not match.
isJdbc40Compliant should be updated according to or the IF clause in
isUseJdbc4Validation = isJdbc40Compliant(connection) && configuration.getConnectionTestQuery() == null;
should be updated to set isUseJdbc4Validation= false if the connectionTestQuery is set, but beware of first calling of isJdbc40Compliant.
This bug is already fixed in the 2.3.0-rc4 release candidate. We consider it a bug in the PostgreSQL driver, but are able to work around it. For release 2.2.5, configure HikariCP to use a test query instead of using JDBC4 isValid() validation.
Thanks for good news.
Don't use the connectionTestQuery, instead allow HikariCP to use the Connection.isValid() method (the default).
How is it done? I experience the error with hikariCP 2.3.3 and postgresql 9.1-901-1.jdbc4
Is it correct approach?
<property name="hibernate.hikari.connectionTestQuery" value="SELECT 1 " />
@gkiko Can you post the stacktrace of the exception? This should have been handled by changes in 2.3.x, so we are surprised to hear it is not working. You should be getting a different exception than the one above, but either way the solution is the same, as you suggest, using a connectionTestQuery.
SEVERE: Exception sending context initialized event to listener instance of class gov.nbs.servlet.InitListener
javax.persistence.PersistenceException: Unable to build entity manager factory
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:83)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at gov.nbs.hibernate.PersistenceManager.openEntityManagerFactory(PersistenceManager.java:28)
at gov.nbs.servlet.InitListener.contextInitialized(InitListener.java:49)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4973)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5467)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:901)
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:877)
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:632)
at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1073)
at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:553)
at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1648)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.tomcat.util.modeler.BaseModelMBean.invoke(BaseModelMBean.java:301)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.invoke(DefaultMBeanServerInterceptor.java:819)
at com.sun.jmx.mbeanserver.JmxMBeanServer.invoke(JmxMBeanServer.java:801)
at org.apache.catalina.manager.ManagerServlet.check(ManagerServlet.java:1445)
at org.apache.catalina.manager.ManagerServlet.deploy(ManagerServlet.java:677)
at org.apache.catalina.manager.ManagerServlet.doPut(ManagerServlet.java:435)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:649)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:610)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)
Caused by: org.hibernate.HibernateException: com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization
at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:84)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.buildJdbcConnectionAccess(JdbcServicesImpl.java:260)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:94)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1887)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1845)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
... 45 more
Caused by: com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization
at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:500)
at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:172)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:61)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:49)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:78)
at com.zaxxer.hikari.hibernate.HikariConnectionProvider.configure(HikariConnectionProvider.java:80)
... 60 more
Caused by: java.sql.SQLException: JDBC4 Connection.isValid() method not supported, connection test query must be configured
at com.zaxxer.hikari.pool.BaseHikariPool.addConnection(BaseHikariPool.java:399)
at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:498)
... 65 more
@Vity01 Ah yes, _"JDBC4 Connection.isValid() method not supported, connection test query must be configured"_ is the message that was added to 2.3.x. The solution, as directed, is to set the connectionTestQuery.
Connection.isValid() method is implemented in Postgres JDBC since version 9.1-903 by doing a SELECT 1. More recent versions of the JDBC driver do an executeUpdate("") to validate the connection.
So you could also just upgrade your JDBC driver to a more recent one.
Set a validation query for parameter "validationQuery".
E.g for bean: property name="validationQuery" value="SELECT 1"
This validation query is run against the connection before returning it. So have a valid query, above is a dummy one.
https://commons.apache.org/proper/commons-dbcp/configuration.html
@ninjakoder is right, in my case, i was able to solve that problem by adding a parameter called "validationQuery" to my xml tag "resource", as in
<Resource name="jdbc/postgres" auth="Container"
type="javax.sql.DataSource" driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://localhost:5432/musify" username="xxxxx"
password="xxxx" maxActive="20" maxIdle="10" maxWait="-1" validationQuery='SELECT * FROM public."Artists"' />
on my server Context.xml (i was running tomcat 9) what i could understand from online documentation is that (from what i remember) since version 9+ on tomcat that parameter is required to verify the connection to the database before actually using it.
i know its a closed post but you know, its always usefull info, perhaps on almost every other website i found when i was doing my research everybody said that i had to change my postgresql version on my maven dependency declaration, that wasnt really what you are looking for when you run on this problem, hope it helps!
I was getting same error so it tried another postgresql maven repository PostgreSQL JDBC Driver JDBC 4.2 » 42.2.9
and it helped, try https://mvnrepository.com/artifact/org.postgresql/postgresql/42.2.9
instead of https://mvnrepository.com/artifact/postgresql/postgresql
Most helpful comment
I was getting same error so it tried another postgresql maven repository PostgreSQL JDBC Driver JDBC 4.2 » 42.2.9
and it helped, try https://mvnrepository.com/artifact/org.postgresql/postgresql/42.2.9
instead of https://mvnrepository.com/artifact/postgresql/postgresql