ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-使用com.zaxxer.hikari.HikariDataSource时出错

2019-11-20 05:20:29  阅读:5030  来源: 互联网

标签:hikaricp spring java


我在将HikariCP与Spring的JdbcTemplate集成时遇到错误.
我正在使用Spring 3.2.2,HikariCP 2.3.8和sybase jconn4版本7.0.0

弹簧配置:

<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>

每当上下文加载时,都会引发此错误,并且无法创建数据源

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

现在,有趣的部分是,如果我使用简单的代码执行此操作,它将可以完美运行.

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,它将失败.

花了整整一天的时间.任何建议表示赞赏

解决方法:

dataSourceClassName和jdbcUrl属性是互斥的(see the doc).您有两个选择…

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>

-要么-

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.

更新:
如果您可以阅读捷克文,则可以在http://blog.prodejna.biz/2013/03/glassfish-jms-broker-perzistujici.html处阅读到相同的错误.基本上,不要使用SyDataSource,请仅使用基于jdbcUrl的方法(如果需要,可以使用driverClassName).

标签:hikaricp,spring,java
来源: https://codeday.me/bug/20191120/2041459.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有