test multiple maximum hikari borrow baeldung spring jdbc spring-jdbc jdbctemplate hikaricp

multiple - ¿Cómo configurar el origen de datos con Spring para HikariCP?



spring datasource hikari maximum pool size default (8)

Al usar la configuración XML, su fuente de datos debe verse más o menos así:

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="dataSourceProperties" > <props> <prop key="dataSource.url">jdbc:oracle:thin:@localhost:1521:XE</prop> <prop key="dataSource.user">username</prop> <prop key="dataSource.password">password</prop> </props> </property> <property name="dataSourceClassName" value="oracle.jdbc.driver.OracleDriver" /> </bean> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <constructor-arg ref="hikariConfig" /> </bean>

O puede omitir el frijol HikariConfig completo y usar un enfoque como el que se menciona here

Hola, estoy intentando usar HikariCP con Spring para el grupo de conexiones. Estoy usando jdbcTempLate y JdbcdaoSupport.
Este es mi archivo de configuración de primavera para el origen de datos:

<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <property name="dataSourceClassName" value="oracle.jdbc.driver.OracleDriver"/> <property name="dataSource.url" value="jdbc:oracle:thin:@localhost:1521:XE"/> <property name="dataSource.user" value="username"/> <property name="dataSource.password" value="password"/> </bean>

Pero desafortunadamente el siguiente mensaje de error está generando:

Cannot resolve reference to bean ''dataSource'' while setting bean property ''dataSource''; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ''dataSource'' defined in ServletContext resource [/WEB-INF/dispatcher-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.zaxxer.hikari.HikariDataSource]: No default constructor found; nested exception is java.lang.NoSuchMethodException: com.zaxxer.hikari.HikariDataSource.<init>()

¿Puede alguien decirme cómo resolver este problema?


Este último error es causado por la biblioteca SLF4J no se encuentra. HikariCP tiene dos dependencias: slf4j y javassist. Por cierto, HikariDataSource tiene un constructor predeterminado y no necesita HikariConfig, mira este enlace . Entonces ese nunca fue el problema.


Lo encontré en http://www.baeldung.com/hikaricp y funciona.

Tu pom.xml

<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>2.6.3</version> </dependency>

Su data.xml

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="driverClassName" value="${jdbc.driverClassName}"/> <property name="jdbcUrl" value="${jdbc.databaseurl}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </bean> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" p:dataSource-ref="dataSource" />

Su jdbc.properties

jdbc.driverClassName=org.postgresql.Driver jdbc.dialect=org.hibernate.dialect.PostgreSQL94Dialect jdbc.databaseurl=jdbc:postgresql://localhost:5432/dev_db jdbc.username=dev jdbc.password=dev


Puede crear un bean de fuente de datos en el contexto de servlet como:

<beans:bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <beans:property name="dataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlDataSource"/> <beans:property name="maximumPoolSize" value="5" /> <beans:property name="maxLifetime" value="30000" /> <beans:property name="idleTimeout" value="30000" /> <beans:property name="dataSourceProperties"> <beans:props> <beans:prop key="url">jdbc:mysql://localhost:3306/exampledb</beans:prop> <beans:prop key="user">root</beans:prop> <beans:prop key="password"></beans:prop> <beans:prop key="prepStmtCacheSize">250</beans:prop> <beans:prop key="prepStmtCacheSqlLimit">2048</beans:prop> <beans:prop key="cachePrepStmts">true</beans:prop> <beans:prop key="useServerPrepStmts">true</beans:prop> </beans:props> </beans:property> </beans:bean>


Recientemente C3P0 de C3P0 a HikariCP en un proyecto basado en Spring e Hibernate y no fue tan fácil como había imaginado y aquí estoy compartiendo mis hallazgos.

Para Spring Boot ver mi respuesta here

Tengo la siguiente configuración

  • Spring 4.3.8+
  • Hiberante 4.3.8+
  • Gradle 2.x
  • PostgreSQL 9.5

Algunas de las siguientes configuraciones son similares a algunas de las respuestas anteriores, pero hay diferencias.

Gradle cosas

Para poder tirar los frascos correctos, necesitaba tirar los siguientes frascos

//latest driver because *brettw* see https://github.com/pgjdbc/pgjdbc/pull/849 compile ''org.postgresql:postgresql:42.2.0'' compile(''com.zaxxer:HikariCP:2.7.6'') { //they are pulled in separately elsewhere exclude group: ''org.hibernate'', module: ''hibernate-core'' } // Recommended to use HikariCPConnectionProvider by Hibernate in 4.3.6+ compile(''org.hibernate:hibernate-hikaricp:4.3.8.Final'') { //they are pulled in separately elsewhere, to avoid version conflicts exclude group: ''org.hibernate'', module: ''hibernate-core'' exclude group: ''com.zaxxer'', module: ''HikariCP'' } // Needed for HikariCP logging if you use log4j compile(''org.slf4j:slf4j-simple:1.7.25'') compile(''org.slf4j:slf4j-log4j12:1.7.25'') { //log4j pulled in separately, exclude to avoid version conflict exclude group: ''log4j'', module: ''log4j'' }

Configuraciones basadas en Spring / Hibernate

Para que Spring & Hibernate haga uso del conjunto de conexiones de Hikari, debe definir HikariDataSource y alimentarlo a sessionFactory Bean como se muestra a continuación.

<!-- HikariCP Database bean --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean> <!-- HikariConfig config that is fed to above dataSource --> <bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="SpringHikariPool" /> <property name="dataSourceClassName" value="org.postgresql.ds.PGSimpleDataSource" /> <property name="maximumPoolSize" value="20" /> <property name="idleTimeout" value="30000" /> <property name="dataSourceProperties"> <props> <prop key="serverName">localhost</prop> <prop key="portNumber">5432</prop> <prop key="databaseName">dbname</prop> <prop key="user">dbuser</prop> <prop key="password">dbpassword</prop> </props> </property> </bean> <bean class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" id="sessionFactory"> <!-- Your Hikari dataSource below --> <property name="dataSource" ref="dataSource"/> <!-- your other configs go here --> <property name="hibernateProperties"> <props> <prop key="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider</prop> <!-- Remaining props goes here --> </props> </property> </bean>

Una vez que lo anterior está configurado, debe agregar una entrada a su log4j or logback y establecer el level en DEBUG para ver el inicio del grupo de conexiones Hikari .

Log4j1.2

<!-- Keep additivity=false to avoid duplicate lines --> <logger additivity="false" name="com.zaxxer.hikari"> <level value="debug"/> <!-- Your appenders goes here --> </logger>

Volver a iniciar sesión

A través de application.properties en Spring Boot

debug=true logging.level.com.zaxxer.hikari.HikariConfig=DEBUG

Usando logback.xml

<logger name="com.zaxxer.hikari" level="DEBUG" additivity="false"> <appender-ref ref="STDOUT" /> </logger>

Con lo anterior, ¡deberías estar listo para empezar! Obviamente, necesita personalizar las HikariCP grupo HikariCP para obtener el rendimiento que promete.


mi prueba java config (para MySql)

@Bean(destroyMethod = "close") public DataSource dataSource(){ HikariConfig hikariConfig = new HikariConfig(); hikariConfig.setDriverClassName("com.mysql.jdbc.Driver"); hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/spring-test"); hikariConfig.setUsername("root"); hikariConfig.setPassword("admin"); hikariConfig.setMaximumPoolSize(5); hikariConfig.setConnectionTestQuery("SELECT 1"); hikariConfig.setPoolName("springHikariCP"); hikariConfig.addDataSourceProperty("dataSource.cachePrepStmts", "true"); hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSize", "250"); hikariConfig.addDataSourceProperty("dataSource.prepStmtCacheSqlLimit", "2048"); hikariConfig.addDataSourceProperty("dataSource.useServerPrepStmts", "true"); HikariDataSource dataSource = new HikariDataSource(hikariConfig); return dataSource; }


necesita escribir esta estructura en su configuración de beans (esta es su fuente de datos):

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="springHikariCP" /> <property name="connectionTestQuery" value="SELECT 1" /> <property name="dataSourceClassName" value="${hibernate.dataSourceClassName}" /> <property name="maximumPoolSize" value="${hibernate.hikari.maximumPoolSize}" /> <property name="idleTimeout" value="${hibernate.hikari.idleTimeout}" /> <property name="dataSourceProperties"> <props> <prop key="url">${dataSource.url}</prop> <prop key="user">${dataSource.username}</prop> <prop key="password">${dataSource.password}</prop> </props> </property> </bean> <!-- HikariCP configuration --> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean>

Este es mi ejemplo y está funcionando. Solo necesita colocar sus propiedades en hibernate.properties y configurarlas antes:

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:hibernate.properties</value> </list> </property> </bean>

Obs .: las versiones son
log4j: 1.2.16
springframework: 3.1.4.RELEASE
HikariCP: 1.4.0

Archivo de propiedades (hibernate.properties):

hibernate.dataSourceClassName=oracle.jdbc.pool.OracleDataSource hibernate.hikari.maximumPoolSize=10 hibernate.hikari.idleTimeout=30000 dataSource.url=jdbc:oracle:thin:@localhost:1521:xe dataSource.username=admin dataSource.password=


para DB2, intente la configuración siguiente.

<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="poolName" value="springHikariCP" /> <property name="dataSourceClassName" value="com.ibm.db2.jcc.DB2SimpleDataSource"/> <property name="maximumPoolSize" value="${db.maxTotal}" /> <property name="dataSourceProperties"> <props> <prop key="driverType">4</prop> <prop key="serverName">192.168.xxx.xxx</prop> <prop key="databaseName">dbname</prop> <prop key="portNumber">50000</prop> <prop key="user">db2inst1</prop> <prop key="password">password</prop> </props> </property> <property name="jdbcUrl" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> </bean> <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close"> <constructor-arg ref="hikariConfig" /> </bean>