Hibernate 高级配置(数据库连接池和日志框架 Log4J)
数据库连接池配置
反问数据库,需要不断的创建和释放连接,假如访问量大的话,效率比较低级,服务器消耗大;
使用数据库连接池,我们可以根据实际项目的情况,定义连接池的连接个数,从而可以实现从连接池获取连
接,用户放回到连接池。从而有效的提高的系统的执行效率;
Hibernate 自带的连接池不是很好,有 bug;
推荐使用 C3P0,proxool 等
第一步:引入c3p0的jar包
第二步:
这里配置c3p0连接池,需要的jar包:
jar包位于hibernate压缩包的:hibernate-release-4.3.5.Final\lib\optional\c3p0
第三步:
1)在hibernate.properties中配置:
2)在hibernate.cfg.xml中配置:
<hibernate-configuration>
<session-factory>
<!--数据库连接设置 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/hibernate</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- 方言 -->
<property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- 控制台显示SQL -->
<property name="show_sql">true</property>
<!-- 自动更新表结构 -->
<property name="hbm2ddl.auto">update</property>
<!-- 最小连接数 -->
<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>
<mapping resource="com/cy/model/Student.hbm.xml"/>
</session-factory>
</hibernate-configuration>
第二节:配置日志框架 Log4J
Log4J 作为一个开源的优秀日志框架,被广泛使用,Hibernate4 必须包中直接支持 Log4J 日志框架;我们只需
要引入 Log4j jar 包,即可使用
hibernate默认使用的是简单日志框架;
简单日志框架里面也有使用log4j的整合包,这里使用log4j;
需要的jar包:
下面是项目中的简单使用:
src/log4j.properties:
//此句为将等级为INFO的日志信息输出到appender1,appender2这两个目的地
等级可分为OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,如果配置OFF则不打出任何信息,如果配置为INFO这样只显示INFO、WARN、ERROR的log信息,而DEBUG信息不会被显示,这里定义等级为debug
log4j.rootLogger=debug,appender1,appender2 //定义输出端为控制台和D:/logFile.txt log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender2=org.apache.log4j.FileAppender log4j.appender.appender2.File=D:/logFile.txt //此句为定义名为stdout的输出端的layout是TTCCLayout类型(包含日志产生的时间、线程、类别等等信息)
还有其它的类型
org.apache.log4j.HTMLLayout(以HTML表格形式布局),
org.apache.log4j.PatternLayout(可以灵活地指定布局模式),
org.apache.log4j.SimpleLayout(包含日志信息的级别和信息字符串),
log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout
log4j.appender.appender2.layout=org.apache.log4j.TTCCLayout
StudentTest.java:
package com.cy.service;
import java.util.List;
import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.cy.model.Student;
import com.cy.util.HibernateUtil;
public class StudentTest {
private SessionFactory sessionFactory=HibernateUtil.getSessionFactory();
private Session session;
//
在要输出日志的类中加入相关语句:
定义属性:static Logger logger = Logger.getLogger(LogDemo.class); //LogDemo为相关的类
在相应的方法中:
if (logger.isDebugEnabled()){
logger.debug(“System …..”);
}
private Logger logger = Logger.getLogger(StudentTest.class);
@Before
public void setUp() throws Exception {
session=sessionFactory.openSession();
session.beginTransaction();
}
@After
public void tearDown() throws Exception {
session.getTransaction().commit();
session.close();
}
@Test
public void testSQLQuery(){
String sql = "select * from t_student";
Query query = session.createSQLQuery(sql).addEntity(Student.class); //查询student,绑定Student实体
List<Student> studentList = query.list();
for(Student s: studentList){
System.out.println(s);
}
logger.debug("这是一个debug信息");
logger.info("这是一个info信息");
logger.error("这是一个error信息");
}
}
如果输出等级为info的话,只打印这是一个info信息和这是一个error信息,不打印这是一个debug信息这句话
执行testSQLQuery后,可以看到console:
同时D:\logFile.txt也记录了相关的日志;