(十一)Hibernate 高级配置
第一节:配置数据库连接池
访问数据库,需要不断的创建和释放连接,假如访问量大的话,效率比较低级,服务器消耗大;
使用数据库连接池,我们可以根据实际项目的情况,定义连接池的连接个数,从而可以实现从连接池获取连接,用户放回到连接池。从而有效的提高的系统的执行效率;
Hibernate 自带的连接池不是很好,有bug;
推荐使用C3P0,proxool 等;
C3P0的jar包:
百度云下载:http://pan.baidu.com/s/1jH45002
密码:s391
资料:
<!-- 最小连接数 -->
<property name="c3p0.min_size">7</property>
<!-- 最大连接数 -->
<property name="c3p0.max_size">42</property>
<!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 -->
<property name="c3p0.timeout">1800</property>
<!-- 最大的PreparedStatement的数量 -->
<property name="c3p0.max_statements">50</property>
hibernate.cfg.xml
1 <?xml version='1.0' encoding='utf-8'?> 2 <!DOCTYPE hibernate-configuration PUBLIC 3 "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 4 "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 5 6 <hibernate-configuration> 7 8 <session-factory> 9 10 <!--数据库连接设置 --> 11 <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 12 <property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property> 13 <property name="connection.username">root</property> 14 <property name="connection.password">123456</property> 15 16 17 <!-- 方言 --> 18 <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property> 19 20 <!-- 控制台显示SQL --> 21 <property name="show_sql">true</property> 22 23 <!-- 自动更新表结构 --> 24 <property name="hbm2ddl.auto">update</property> 25 26 <!-- 最小连接数 --> 27 <property name="c3p0.min_size">7</property> 28 <!-- 最大连接数 --> 29 <property name="c3p0.max_size">42</property> 30 <!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 --> 31 <property name="c3p0.timeout">1800</property> 32 <!-- 最大的PreparedStatement的数量 --> 33 <property name="c3p0.max_statements">50</property> 34 35 <mapping resource="com/wishwzp/model/Student.hbm.xml"/> 36 37 38 39 </session-factory> 40 41 </hibernate-configuration>
第二节:配置日志框架Log4J
Log4J 作为一个开源的优秀日志框架,被广泛使用,Hibernate4 必须包中直接支持Log4J 日志框架;我们只需要引入Log4j jar 包,即可使用
log4jjar包和配置文件:
百度云下载:http://pan.baidu.com/s/1slchiMx
密码:i7qe
StudentTest.java
1 package com.java1234.service; 2 3 4 import java.util.Iterator; 5 import java.util.List; 6 7 import org.apache.log4j.Logger; 8 import org.hibernate.Criteria; 9 import org.hibernate.Query; 10 import org.hibernate.Session; 11 import org.hibernate.SessionFactory; 12 import org.hibernate.criterion.Criterion; 13 import org.hibernate.criterion.Order; 14 import org.hibernate.criterion.Restrictions; 15 import org.junit.After; 16 import org.junit.Before; 17 import org.junit.Test; 18 19 import com.java1234.model.Student; 20 import com.java1234.util.HibernateUtil; 21 22 public class StudentTest { 23 24 private SessionFactory sessionFactory=HibernateUtil.getSessionFactory(); 25 private Session session; 26 private Logger logger=Logger.getLogger(StudentTest.class); 27 28 @Before 29 public void setUp() throws Exception { 30 session=sessionFactory.openSession(); // 生成一个session 31 session.beginTransaction(); // 开启事务 32 } 33 34 @After 35 public void tearDown() throws Exception { 36 session.getTransaction().commit(); // 提交事务 37 session.close(); // 关闭session 38 } 39 40 @Test 41 public void testSQLQuery() { 42 String sql="select * from t_student"; 43 Query query=session.createSQLQuery(sql).addEntity(Student.class); 44 List studentList=query.list(); 45 Iterator it=studentList.iterator(); 46 while(it.hasNext()){ 47 Student s=(Student)it.next(); 48 System.out.println(s); 49 } 50 logger.debug("这是一个debug信息"); 51 logger.info("这是一个info信息"); 52 logger.error("这是一个错误信息"); 53 } 54 55 56 57 }
第三节:配置Hibernate 二级缓存
1,缓存的概念:
缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存或者硬盘中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能。Hibernate 在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL 语句到数据库查询的性能损耗。
2,Hibernate 缓存的分类:
一、Session 缓存(又称作事务缓存):Hibernate 内置的,不能卸除。
缓存范围:缓存只能被当前Session 对象访问。缓存的生命周期依赖于Session 的生命周期,当Session 被关闭后,缓存也就结束生命周期。
二、SessionFactory 缓存(又称作应用缓存):使用第三方插件,可插拔。
缓存范围:缓存被应用范围内的所有session 共享,不同的Session 可以共享。这些session 有可能是并发访问缓存,因此必须对缓存进行更新。缓存的生命周期依赖于应用的生命周期,应用结束时,缓存也就结束了生命。
周期,二级缓存存在于应用程序范围。
3,二级缓存策略提供商:
提供了HashTable 缓存,EHCache,OSCache,SwarmCache,jBoss Cathe2,这些缓存机制,其中EHCache,OSCache 是不能用于集群环境(Cluster Safe)的,而SwarmCache,jBoss Cathe2 是可以的。HashTable 缓存主要是用来测试的,只能把对象放在内存中,EHCache,OSCache 可以把对象放在内存(memory)中,也可以把对象放在硬盘(disk)上(为什么放到硬盘上?上面解释了)。
4,什么数据适合放二级缓存中:
(1)经常被访问
(2)改动不大
(3)数量有限
(4)不是很重要的数据,允许出现偶尔并发的数据。
比如组织机构代码,列表信息等;
【推荐】FFA 2024大会视频回放:Apache Flink 的过去、现在及未来
【推荐】中国电信天翼云云端翼购节,2核2G云服务器一口价38元/年
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步