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

大腊肠犬

所以这是我的设置:

pom.xml

<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.4.0-rc4-SNAPSHOT</version>
<scope>compile</scope>
</dependency>

这是开始偷偷摸摸的地方:pom.xml(续)

<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 jar,否则您将收到“缺少的” ConnectionProvider错误。在Hibernate配置文件中,免得我们忘记了:

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

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

<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-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”参考。已经过时了。

bhdrkn

您可以使用hikaricp 2不同的方式。第一种方法是像在context.xml文件中一样使用容器管理的数据源。第二种方法是通过休眠定义连接。但是您尝试同时做这两个。

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

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章