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>