Hibernate连接池的使用
Hibernate中有内置的连接池,当我们配置好连接参数后实际上采用的就是默认的的内置连接池,且最大连接数量为1。
<!-- JDBC connection pool (use the built-in) -->
<property name="connection.pool_size">1</property>
然而这种默认的内置连接池性能并不好,我们可以采用已经集成到Hibernate中的第三方的连接池C3P0。
在 Hibernate.cfg.xml 中配置 c3p0 连接池:
<?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.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/learning?useSSL=true</property>
<property name="connection.username">root</property>
<property name="connection.password">123456</property>
<!-- 设置默认连接池的大小 -->
<property name="connection.pool_size">5</property>
<!-- 如果使用连接池的方式的话,必须告诉Hibernate一声,让它不使用单纯的JDBC连接 -->
<property name="hibernate.temp.use_jdbc_metadata_defaults">false</property>
<!-- 最大连接数 -->
<property name="hibernate.c3p0.max_size">20</property>
<!-- 最小连接数 -->
<property name="hibernate.c3p0.min_size">5</property>
<!-- 设置连接的超时时间,超过时间则抛出异常,单位:毫秒 -->
<!-- 即获得连接后一定时间内未归还,则抛出异常 -->
<property name="hibernate.c3p0.timeout">5000</property>
<!-- 创建的PreparedStatement对象的最大数量 -->
<property name="hibernate.c3p0.max_statements">100</property>
<!-- 每隔指定时间检查连接池中的空闲连接,时间单位:秒 -->
<property name="hibernate.c3p0.idle_test_period">150</property>
<!-- 当连接池中的连接使用完毕,c3p0会再和数据库建立n个新的连接放置到连接池中 -->
<property name="hibernate.c3p0.acquire_increment">2</property>
<!-- 每次都验证连接是否可用 -->
<property name="hibernate.c3p0.validate">false</property>
<!-- SQL dialect:方言类,将操作转为对应的SQL语句 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 输出操作的SQL语句 -->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- 配置映射文件 -->
<mapping resource="com/li/pojo/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
配置完成之后,还需导入 c3p0 的工具包(jar包),在 Hibernate 的开发包中可以找到,位于 hibernate-release-5.2.0.Final\lib\optional\c3p0 目录下。
使用数据源的方式使用连接池
使用数据源的连接池须在JavaEE环境下。此处我们使用Tomcat获取的数据源,先在Tomcat的server.xml中为工程配置一个数据源并为数据源绑定一个JNDI名字(如下:jdbc/Hibernate)。
<Context docBase="Hibernate" path="/Hibernate" reloadable="true" source="org.eclipse.jst.jee.server:Hibernate">
<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxIdle="30" maxTotal="50" maxWaitMillis="-1" name="jdbc/Hibernate" password="123456" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/learning?useSSL=true" username="root"></Resource>
</Context>
打开开发包目录 hibernate-release-5.2.0.Final\project\etc 下的 模板配置文件 hibernate.properies,找到其中的JNDI Datasource,从这里我们可以知道怎么讲数据源的JDNI绑定到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>
<!-- jdbc/Hibernate:绑定所配置的数据源JNDI名称 -->
<!-- 使用java:comp/env/前缀来指明当前在JavaEE环境中 -->
<!-- 只需这一句就行,其他的基本配置就不需要,多此一举也会报错 -->
<property name="hibernate.connection.datasource">java:comp/env/jdbc/Hibernate</property>
<!-- SQL dialect:方言类,将操作转为对应的SQL语句 -->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 输出操作的SQL语句 -->
<!-- Echo all executed SQL to stdout -->
<property name="show_sql">true</property>
<!-- 配置映射文件 -->
<mapping resource="com/li/pojo/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
配置过后,因为我们是在JavaEE环境下创建的应用,所以我们应该让应用获取数据源,然后我们的Hibernate才能使用这个数据源