• (十一)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)不是很重要的数据,允许出现偶尔并发的数据。

    比如组织机构代码,列表信息等;

  • 相关阅读:
    Shiro【常用的自定义】
    Shiro【重要概念总结】
    Shiro【自定义Realm实战】
    Shiro【内置Realm实操】
    Shiro【快速上手】
    Shiro【初识】
    面向对象【抽象类和接口的区别】
    面向对象【多态中的成员访问特点】
    Kafka2.12-2.5.0在windows环境的安装 启动 通信测试
    CentOS.iso 下载地址收纳整理
  • 原文地址:https://www.cnblogs.com/wishwzp/p/5486048.html
Copyright © 2020-2023  润新知