IllegalArgumentException:MySQL、Hibernate 4.3+、HikariCP 和 context.xml
IllegalArgumentException: MySQL, Hibernate 4.3+, HikariCP and 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 否则你会得到一个 "missing" 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: one of either dataSource or
dataSourceClassName must be specified..."
有人可以诊断这个菜鸟的错误吗?
感谢@bhdrkn。他敏锐地指出我混淆了两种方法。我通过采用 Hibernate 实现方法解决了这个问题。我之所以这样做,很大程度上是因为 HikariCP 文档鼓励这种方法 (here)。即便如此,当我担心 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&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" 参考。它已经过时了。
您可以使用 hikaricp 2 种不同的方式。 First way is using with a container managed datasource like you do in your context.xml file. The second way 正在通过休眠定义您的连接。但是您尝试同时进行。
如果您想使用 JNDI 数据源,您必须告诉 hibernate 使用您的 JNDI 数据源而不是连接提供程序信息。
这里是一个使用 JNDI 数据源的例子hibernate.cfg.xml
。
<?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>
dataSourceClassName
不是驱动程序。您必须使用数据源 class。因为 mysql 是 com.mysql.jdbc.jdbc2.optional.MysqlDataSource
.
这是我的设置:
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 否则你会得到一个 "missing" 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: one of either dataSource or dataSourceClassName must be specified..."
有人可以诊断这个菜鸟的错误吗?
感谢@bhdrkn。他敏锐地指出我混淆了两种方法。我通过采用 Hibernate 实现方法解决了这个问题。我之所以这样做,很大程度上是因为 HikariCP 文档鼓励这种方法 (here)。即便如此,当我担心 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&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" 参考。它已经过时了。
您可以使用 hikaricp 2 种不同的方式。 First way is using with a container managed datasource like you do in your context.xml file. The second way 正在通过休眠定义您的连接。但是您尝试同时进行。
如果您想使用 JNDI 数据源,您必须告诉 hibernate 使用您的 JNDI 数据源而不是连接提供程序信息。
这里是一个使用 JNDI 数据源的例子hibernate.cfg.xml
。
<?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>
dataSourceClassName
不是驱动程序。您必须使用数据源 class。因为 mysql 是 com.mysql.jdbc.jdbc2.optional.MysqlDataSource
.