使用com.zaxxer.hikari.HikariDataSource时出错 [英] Error using com.zaxxer.hikari.HikariDataSource
问题描述
我在将HikariCP与Spring的JdbcTemplate集成时遇到错误。
我使用的是Spring 3.2.2,HikariCP 2.3.8和sybase jconn4版本7.0.0
I'm facing an error integrating HikariCP with Spring's JdbcTemplate. I'm using Spring 3.2.2, HikariCP 2.3.8 and sybase jconn4 version 7.0.0
Spring配置:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="dataSourceClassName" value="com.sybase.jdbc4.jdbc.SybDataSource" />
<property name="connectionTestQuery" value="SELECT 1" />
<property name="maximumPoolSize" value="100" />
<property name="idleTimeout" value="60000" />
<property name="jdbcUrl"
value="jdbc:sybase:Tds:${hostname}:${port}/${dbname}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
<bean id="ds" class="com.zaxxer.hikari.HikariDataSource"
destroy-method="close">
<constructor-arg ref="hikariConfig" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="ds" />
</property>
</bean>
每次加载上下文时都会抛出此错误并且无法创建数据源
Every time the context is loading it throws this error and the datasource can't be created
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ds' defined in class path resource [commons/config/datasourceTest.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.zaxxer.hikari.HikariDataSource]: Constructor threw exception; nested exception is com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:288)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1051)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:955)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:626)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:932)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:120)
at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:100)
at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:248)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContextInternal(CacheAwareContextLoaderDelegate.java:64)
at org.springframework.test.context.CacheAwareContextLoaderDelegate.loadContext(CacheAwareContextLoaderDelegate.java:91)
... 25 more
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.zaxxer.hikari.HikariDataSource]: Constructor threw exception; nested exception is com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:121)
at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:280)
... 42 more
Caused by: com.zaxxer.hikari.pool.PoolInitializationException: Exception during pool initialization
at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:544)
at com.zaxxer.hikari.pool.BaseHikariPool.<init>(BaseHikariPool.java:171)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:60)
at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:48)
at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:80)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148)
... 44 more
Caused by: java.sql.SQLException: JZ0PN: Specified port number of -1 was out of range. Port numbers must meet the following conditions: 0 <= portNumber <= 65535
at com.sybase.jdbc4.jdbc.SybConnection.getAllExceptions(Unknown Source)
at com.sybase.jdbc4.jdbc.SybConnection.handleSQLE(Unknown Source)
at com.sybase.jdbc4.jdbc.SybConnection.a(Unknown Source)
at com.sybase.jdbc4.jdbc.SybConnection.handleHAFailover(Unknown Source)
at com.sybase.jdbc4.jdbc.SybConnection.<init>(Unknown Source)
at com.sybase.jdbc4.jdbc.SybDriver.createConnection(Unknown Source)
at com.sybase.jdbc4.jdbc.SybDriver.connect(Unknown Source)
at com.sybase.jdbc4.jdbc.SybDriver.connect(Unknown Source)
at com.sybase.jdbc4.jdbc.SybDataSource.getConnection(Unknown Source)
at com.zaxxer.hikari.pool.BaseHikariPool.addConnection(BaseHikariPool.java:438)
at com.zaxxer.hikari.pool.BaseHikariPool.initializeConnections(BaseHikariPool.java:542)
... 53 more
现在有趣的是,如果我使用简单的代码,这是完美的工作。
Now the interesting part is this is working perfectly if i do it with simple code.
public class JdbcTemplateFactoryTest {
@Autowired
HikariConfig hikariConfig;
//@Autowired
//HikariDataSource ds;
@Test
public void hikaritest(){
HikariDataSource ds = new HikariDataSource(hikariConfig);
JdbcTemplate jdbcTemplate = new JdbcTemplate(ds);
assertNotNull(jdbcTemplate);
}
}
奇怪的部分是如果我取消注释 ds 按春天加载)它失败了。
Strange part is if i uncomment the ds to load by spring) it fails.
花了一整天的时间。任何建议都表示赞赏
Spent the whole day on this. Any suggestion is appreciate
推荐答案
dataSourceClassName
和 jdbcUrl
属性是互斥的(查看文档一>)。你有两个选择......
The dataSourceClassName
and jdbcUrl
properties are mutually exclusive (see the doc). You have two options...
1)使用 dataSourceClassName
:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="dataSourceClassName" value="com.sybase.jdbc4.jdbc.SybDataSource" />
<property name="connectionTestQuery" value="SELECT 1" />
<property name="maximumPoolSize" value="100" />
<property name="idleTimeout" value="60000" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="dataSourceProperties">
<props>
<property name="serverName" value="${hostname}" />
<property name="port" value="${port}" />
<property name="databaseName" value="${dbname}" />
</props>
</property>
</bean>
- 或 -
-or-
2)使用 jdbcUrl
:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<property name="jdbcUrl"
value="jdbc:sybase:Tds:${hostname}:${port}/${dbname}" />
<property name="connectionTestQuery" value="SELECT 1" />
<property name="maximumPoolSize" value="100" />
<property name="idleTimeout" value="60000" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</bean>
如果您的驱动程序没有自行注册,您可能需要添加 driverClassName
属性到选项#2。
If your driver does not self-register, you may need to add the driverClassName
property to option #2.
更新:
如果你能读捷克语,你可以在这里读到同样的错误 http://blog.prodejna.biz/2013/03/glassfish-jms -broker-perzistujici.html 。基本上,不要使用 SyDataSource
,只使用基于 jdbcUrl
的方法(可能 driverClassName
如果需要的话)。
UPDATE:
If you can read Czech you can read about the same error here http://blog.prodejna.biz/2013/03/glassfish-jms-broker-perzistujici.html. Basically, don't use SyDataSource
, use only the jdbcUrl
-based approach (and possibly driverClassName
if needed).
这篇关于使用com.zaxxer.hikari.HikariDataSource时出错的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!