首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IllegalArgumentException: MySQL,Hibernate 4.3+,HikariCP和context.xml

IllegalArgumentException: MySQL,Hibernate 4.3+,HikariCP和context.xml
EN

Stack Overflow用户
提问于 2015-07-03 05:31:12
回答 1查看 1.1K关注 0票数 1

这是我的设计:

pom.xml

代码语言:javascript
复制
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.4.0-rc4-SNAPSHOT</version>
<scope>compile</scope>
</dependency>

这里是它开始鬼鬼祟祟的地方: pom.xml (续)

代码语言:javascript
复制
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.10.Final</version>
</dependency>

<!-- HikariCP and Hibernate integration -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-hikaricp</artifactId>
<version>4.3.10.Final</version>
</dependency>

需要那个hibernate-hikaricp,否则你会得到一个“丢失”的ConnectionProvider bug。在Hibernate配置文件中,以免我们忘记:

代码语言:javascript
复制
<hibernate-configuration>
<session-factory>
<!-- using HikaricCP for connection pooling deprecated: com.zaxxer.hikari.hibernate.HikariConnectionProvider -->
<property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider
</property>
     .
     .
     .

现在,在我的context.xml中:

代码语言:javascript
复制
<Resource name="jdbc/coolDb" auth="Container" 
type="javax.sql.DataSource"  
factory="com.zaxxer.hikari.HikariJNDIFactory"
dataSourceClassName="com.mysql.jdbc.Driver" 
dataSource.url="jdbc:mysql://localhost/coolDb:3306?zeroDateTimeBehavior=convertToNull"
dataSource.user="coolUser" 
dataSource.password="coolPasswd" 
connectionTimeout="300000"
cachePrepStmts="true"
prepStmtCacheSize="250" 
prepStmtCacheSqlLimit="2048"
minimumIdle="10" 
maximumPoolSize="20"/>

现在,我希望我能报告,这是正确的配置,但是,唉,没有这样的运气。我得到了一个

"java.lang.IllegalArgumentException:必须指定dataSource或dataSourceClassName之一.“

有人能诊断这个菜鸟的臭虫吗?

感谢@bhdrkn。他敏锐地指出,我把两种方法混为一谈。我采用Hibernate实现方法解决了这个问题。我这么做很大程度上是因为HikariCP文档鼓励这种方法(这里)。即便如此,当我担心Hibernate会破坏复杂的数据库调用时,我仍然保留context.xml配置来执行JDBC调用。

context.xml:

代码语言:javascript
复制
<Resource name="jdbc/coolDb" auth="Container" type="javax.sql.DataSource"
         driverClassName="com.mysql.jdbc.Driver" timeBetweenEvictionRunsMillis="30000"
         minEvictableIdleTimeMillis="60000" removeAbandonedOnBorrow="true" removeAbandonedOnMaintenance="true"
         url="jdbc:mysql://localhost:3306/coolDb?zeroDateTimeBehavior=convertToNull"
         username="coolUser"
         password="coolPassword"  maxActive="30" maxIdle="10" maxWait="10000"  initialSize="5" validationQuery= "SELECT 1" validationInterval="30000"
         removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" />

Hibernate配置文件:

代码语言:javascript
复制
<hibernate-configuration>
<session-factory>
    <!-- using HikaricCP for connection pooling -->
    <property name="hibernate.connection.provider_class">org.hibernate.hikaricp.internal.HikariCPConnectionProvider
    </property>

    <property name="hibernate.hikari.dataSourceClassName">com.mysql.jdbc.jdbc2.optional.MysqlDataSource</property>
    <property name="hibernate.hikari.dataSource.url">jdbc:mysql://localhost/coolDb?zeroDateTimeBehavior=convertToNull&amp;autoReconnect=true</property>
    <property name="hibernate.hikari.dataSource.user">coolUser</property>
    <property name="hibernate.hikari.dataSource.password">coolPassword</property>
    <property name="hibernate.hikari.dataSource.cachePrepStmts">true</property>
    <property name="hibernate.hikari.dataSource.prepStmtCacheSize">250</property> 
    <property name="hibernate.hikari.dataSource.prepStmtCacheSqlLimit">2048</property>

    <property name="hibernate.hikari.idleTimeout">300000</property>
    <property name="hibernate.hikari.minimumIdle">10</property> 
    <property name="hibernate.hikari.maximumPoolSize">20</property> 
    <!-- using container-managed JNDI : Not if I'm using HikariCP/Hibernate configuration  
    <property name="hibernate.connection.datasource">java:/comp/env/jdbc/coolDb</property>
    -->

注意:我注释掉了旧的"hibernate.connection.datasource“引用。已经过时了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-03 06:01:52

你可以用两种不同的方式。第一条路与容器托管数据源一起使用,就像在context.xml文件中所做的那样。第二条路是通过hibernate定义连接的。但你试着同时做这两件事。

如果要使用JNDI数据源,必须告诉hibernate使用JNDI数据源而不是连接提供程序信息。

下面是一个使用JNDI数据源的示例hibernate.cfg.xml

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="hibernate.connection.datasource">java:comp/env/jdbc/coolDb </property>

        <!-- Mapping with model class containing annotations -->
    <mapping class="..."/>
    ....
    </session-factory>
</hibernate-configuration>

此外,如果还没有完成,则需要在web.xml上指定资源。

代码语言:javascript
复制
<resource-env-ref>
    <resource-env-ref-name>jdbc/coolDb</resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31199147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档