1、Hibernate内置连接池
hibernate.cfg.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://192.168.56.101:3306/bookstore?useSSL=false</property>
<property name="connection.username">billy</property>
<property name="connection.password">xxxxxx</property>
<property name="show_sql">true</property>
<mapping class="com.zhangdb.hibernate.Book" />
</session-factory>
</hibernate-configuration>
以上配置没有明确说明使用何种类型连接池,Hibernate会使用内置的连接池实现,采用默认值。这种实现并非面向生产环境,多用于开发测试。
2、javax.sql.DataSource连接池
Hibernate可以与javax.sql.DataSource类型的连接池集成,通过JNDI方式直接从连接池取得连接。
以Tomcat为例,可以修改Tomcat的conf下的context.xml文件,在这里边定义连接数据库的信息及连接池配置。当然context.xml文件也可以放置在web项目下的META-INF目录下。前者Tomcat下的所有WEB都可以使用,后者则只有当前WEB应用可以使用。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
name="jdbc/bookstore"
auth="Container"
type="javax.sql.DataSource"
maxActive="10"
maxIdle="3"
maxWait="10000"
driverClassName="com.mysql.cj.jdbc.Driver"
url="jdbc:mysql://192.168.56.101:3306/bookstore?useSSL=false"
username="billy"
password="xxxxxx" />
</Context>
在web应用的web.xml中引用该资源,如:
<web-app>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/bookstore</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
hibernate的配置文件改为如下内容:
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.datasource">java:comp/env/jdbc/bookstore</property>
<property name="dialect">org.hibernate.dialect.MySQL8Dialect</property>
<property name="show_sql">true</property>
<mapping class="com.zhangdb.hibernate.Book" />
</session-factory>
</hibernate-configuration>
关键是这句话:<property name="connection.datasource">java:comp/env/jdbc/bookstore</property>
这样Hibernate就可以直接使用由Tomcat容器管理的连接池。
如何为Tomcat设置数据库连接池资源,参考文档:https://www.codejava.net/servers/tomcat/configuring-jndi-datasource-for-database-connection-pooling-in-tomcat
3、C3P0数据库连接池
javax.sql.DataSource连接池是由Tomcat容器管理的,也可以创建由项目自己管理的数据库连接池,C3P0是其中一种。
首先引入C3P0的相关jar包,如果用maven管理依赖,则在项目的pom文件中加入如下内容:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.4.1.Final</version>
</dependency>
hibernate.cfg.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Database connection settings -->
<property name="connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://192.168.56.101:3306/bookstore?useSSL=false</property>
<property name="connection.username">billy</property>
<property name="connection.password">******</property>
<!-- Database connection pool setting -->
<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<property name="hibernate.c3p0.timeout">120</property>
<property name="hibernate.c3p0.idle_test_period">3000</property>
<property name="show_sql">true</property>
<mapping class="com.zhangdb.hibernate.Book" />
</session-factory>
</hibernate-configuration>
里边既包括数据库连接配置信息,也包含C3P0连接池配置信息。C3P0的连接池属性还有很多,它实现了很多功能,可参考相关文档查看。
4、Proxool数据库连接池
导入proxool依赖包,pom配置:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-proxool</artifactId>
<version>5.4.1.Final</version>
</dependency>
在项目class path目录下增加proxool.xml配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
<proxool>
<alias>ProxoolPool</alias>
<driver-url>jdbc:mysql://192.168.56.101:3306/bookstore?useSSL=false</driver-url>
<driver-class>com.mysql.cj.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="billy"/>
<property name="password" value="******"/>
</driver-properties>
<maximum-connection-count>20</maximum-connection-count>
<minimum-connection-count>5</minimum-connection-count>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<maximum-new-connections>10</maximum-new-connections>
<prototype-count>5</prototype-count>
<test-before-use>true</test-before-use>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
</something-else-entirely>
hibernate.cfg.xml内容:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- Proxool Database connection settings -->
<property name="hibernate.proxool.pool_alias">ProxoolPool</property>
<property name="hibernate.proxool.xml">proxool.xml</property>
<property name="hibernate.connection.provider_class">org.hibernate.proxool.internal.ProxoolConnectionProvider</property>
<property name="show_sql">true</property>
<mapping class="com.zhangdb.hibernate.Book" />
</session-factory>
</hibernate-configuration>
5、其它连接池配置
除了以上四种方式,Hibernate还支持其它类型的数据库连接池配置。详细可参考:http://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#database