Spring Boot 2 Hikari pooling with oracle database - oracle

I have a problem with Hikari connection pooling in Spring boot. I use spring boot 2.1.7 in oauth2 server 2.3.4.RELEASE program that check tokens from oracle database. when I see v$session every thing is ok but in listener.log There are many logons and logoffs. Some sessions logon and logoff during 1 second!
I change Hikari connection pooling properties according to spring jdbc hikari connection pool - constantly logs on and off to database but nothing change!!
my parameters are:
spring.datasource.auto-commit=true
spring.datasource.connection-timeout=1000
spring.datasource.maximum-pool-size=10
spring.datasource.TYPE=com.zaxxer.hikari.HikariDataSource
spring.datasource.minimum-idle=1
spring.datasource.pool-name=oauth-POOL
#spring.datasource.maxLifetime=2000000
spring.datasource.idle-timeout=900000

Related

Quarkus reactive and JDBC datasource connection pooling

I'm using Quarkus and have a project with two default datasources connecting to the same database, one uses JDBC (Agroal) for a postgres copy operation, the other uses reactive (PgPool) for all other sql operations.
There's an option in quarkus QUARKUS_DATASOURCE_JDBC_POOLING_ENABLED that can be set to false to disable connection pooling for JDBC datasource. So my question is:
Does reactive and JDBC datasources share the same connection pool? If I disable the JDBC pooling, will it affect the reactive connection pool?
Is there a way to verify such behavior?
Thank you all.
Trying to figure out the behavior between reactive and JDBC datasource regarding connection pooling. Expecting that turning off the pooling for JDBC via the config QUARKUS_DATASOURCE_JDBC_POOLING_ENABLED will not impact reactive connection pool.

Drop idle connection in Spring Boot / hikari

I want a database connection that has gone idle to be dropped once its maxLifetime has been reached.
How can we do this in spring boot/hikari? Is this achieved with these 2 properties?
idleTimeout
maxLifetime
How can I check that idle connections are actually being dropped? Any logs I can activate?
What should be the ideal values?
read Hikari documentation
check DB activity via SQL (there you can see all transaction statistics)
add logging
try locally with Postgres in Docker

Spring Boot application with HikariCP and PgPool-II

I need to configure a failover cluster for Postgres. I want to use PgPool-II as failover for the failed instance of DB.
My application runs on Spring Boot 2 and uses HikariCP as datasource. HikariCP is a connection pool by itself, and PgPool uses its connection pool.
HikariCP allocate connection pool from PgPool, which gives connections from it's own pool. I understand that PgPool pool size must be greater than Hikari pool.
Can they work together? And is this a good practice to use both of them in conjuction?

Hikari and test on borrow option

I use spring boot 2 with Hikari connection pool, jpa and postgres.
Is there any reason to continue to use theses options
spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1
spring.datasource.testWhileIdle
No, They are unknown properties to Hikari connection pool so no need ,
They exists only in Tomcat JDBC Connection Pool (used in old Spring boot) which you aren't using anymore.
Explanation of different between properties
DBCP testOnBorrow=false rollbackOnReturn=false
enableAutoCommitOnReturn=false
Issues:
testOnBorrow=false increases the likelihood of broken connections
given to your application rollbackOnReturn=false +
enableAutoCommitOnReturn=false, like the C3P0 "remediation" above can
bleed transactions between consumers or cause locks to be held for
extended periods
HikariCP Differentiators
Tests connections with isValid() before returning them from the pool,
with an optimization that bypasses the check if the connection was
utilized within the last 1000ms Tracks connection state (and
transaction state), and performs rollback() only the the case of a
non-autocommit connections with uncommitted changes

Spring DatasourceTransactionManager not release connection after commit/rollback

I have an Enterprise Application (ear) deployed in this configuration enviroment:
Weblogic 12c (12.1.1) + Oracle RAC 11g (release 2).
Web Module is an MVC application, implemented with Struts 2 and Spring-framework (3.2.2) for core services. Spring JDBC is used for database access with simple JdbcTemplate for single statements and DatasourceTransactionManager for complex ones. I noticed a strange behavior when I enable Weblogic jdbc logs. When I start a new transaction, I can see jdbc info logs about transaction creation, retriving jdbc connection from weblogic datasource pool and setting autocommit property to false value over connection itself. But I can't see transaction releasing connection log, and restoring autocommit flag to true value after commit/rollback invocation.
It's possible that Spring Transaction Manager does not release jdbc connection and does not restore "autocommit" value flag (to true)? After a while I can see within my application some persistent locks on db tables, causing an overall defect of my application and that I would not have depended on the behavior of the transaction manager.
Has anyone noticed a similar behavior?
Is it possible that jdbc connection is not released by the framework and it can compete in multiple transactions (as seen in jdbc log)?
Thanks
Paolo
Since you are using managed DataSource from WebLogic (JNDI?) you have to use managed TransactionManager as well:
<tx:jta-transaction-manager/>
should be enough:
if (weblogicPresent) {
return WEBLOGIC_JTA_TRANSACTION_MANAGER_CLASS_NAME;
}
And it is instead of that DatasourceTransactionManager.

Resources