这是我的设计:
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,否则你会得到一个“丢失”的ConnectionProvider bug。在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配置文件:
<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“引用。已经过时了。
发布于 2015-07-03 06:01:52
你可以用两种不同的方式。第一条路与容器托管数据源一起使用,就像在context.xml文件中所做的那样。第二条路是通过hibernate定义连接的。但你试着同时做这两件事。
如果要使用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>https://stackoverflow.com/questions/31199147
复制相似问题