Hibernate+C3P0+Log4j 开发时所遇到的点点滴滴,求解!

华兹格 发布于 2012/04/26 21:48
阅读 1K+
收藏 0

今天刚在网上找资料把 C3p0 + Hibernate 搭建完全,体验了 Hibernate 在数据存储方面直接存储对像的思想,很受启发!

 

因为Hibernate提供的数据库连接池性能不是太好,坛子里有很多大牛推荐用C3P0,故今就整合了一下.在整合的过程中我遇到一个问题

 

需要大牛帮我解释一下:

 

1.在对数据操作时,使用Hibernate本身的功能直接操作一个对象 与 使用数据库连接池操作数据库有什么不同?哪种方法更好?

 

(1)Hibernate操作对象方法

 

Session session=HibernateUtils.getSession();

try {

session=HibernateUtils.getSession();

session.beginTransaction();

User user=new User();

user.setName("aaa");

user.setPassword("bbb");

session.save(user);

//user.setName("cccccc");

session.getTransaction().commit();

} catch (HibernateException e) {

  e.printStackTrace();

  session.getTransaction().rollback();

}finally{

HibernateUtils.closeSession(session);

 

(2)数据库连接池执行SQL语句

 

Connection conn=DBAppender.getInstance().getConnection();

User user=new User();

user.setName("aaa");

user.setPassword("bbb");

String sql="INSERT INTO USER (name,password) VALUES('"+user.getName()+"','"+user.getPassword()+"')";

try {

Statement statement=conn.createStatement();

statement.executeUpdate(sql);

} catch (SQLException e) {

e.printStackTrace();

}finally{

DBAppender.getInstance().closeConnection(conn);

}

 

    注:以上的 HibernateUtils、DBAppender是分别对Hibernate中的SessionFactory 和 c3p0中的ComboPooledDataSource 进行简单

 

的封装(个人理解相当于Servlet中DAO层的单列模式吧)。

 

问题:以上2个列子分别从不同的方面给出了操作数据的方式,但究竟哪一种更好、更灵活呢?

 

如果您您认为方法(1)好,那是不是 SessionFactory 在获取 hibernate.cfg.xml 配置信息时已经根据配置信息实现了数据库连接池功

 

能,我们只要使用 SessionFactory、Session 就可以了?

 

如果您认为方法(2)好些,那请问,既然直接用数据库连接池对象更好,那我们还要Hibernate做什么?

 

 

2.使用log4j记录日志,输入到数据库中不成功

问题描述:我想使用log4j对同一个操作分别记录信息在文本中和保存到数据库中,但抛出:

log4j:WARN No such property [maxFileSize] in org.apache.log4j.ConsoleAppender.

log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.ConsoleAppender.

log4j:WARN No such property [file] in org.apache.log4j.ConsoleAppender.

 

 

 

log4j配置信息:

log4j.logger.user_login_info =INFO,U1,Udb

#log4j.logger.org.springframework=ERROR 

log4j.appender.U1=org.apache.log4j.PatternLayout  

log4j.appender.U1.File=E:/EclipseJava/logDoc/user_login_info.log   

log4j.appender.U1.MaxFileSize=10KB   

# Keep three backup files.   

log4j.appender.U1.MaxBackupIndex=1  

# Pattern to output: date priority [category] - message   

log4j.appender.U1.layout=org.apache.log4j.PatternLayout 

log4j.appender.U1.threshold=INFO   

log4j.appender.U1.layout.ConversionPattern=%d [%X{user_id}/%X{log_ip}/%X{req.id} - %X{entranceMethod} - %X{req.requestURIWithQueryString}] %-5p %c - %m%n 

 

#Save to Database

log4j.appender.Udb=com.log.DBAppender

log4j.appender.Udb.BufferSize = 40

log4j.appender.Udb.threshold=INFO

log4j.appender.Udb.File=E:/EclipseJava/logDoc/sql_user_login_info.log  

log4j.appender.Udb.MaxFileSize=10KB   

log4j.appender.Udb.MaxBackupIndex=1  

log4j.appender.Udb.sql=INSERT INTO tb_user_login_log (user_id,log_title,log_type,log_datetime,log_ip,log_host_name) VALUES ('%X{user_id}','%X{log_title}','%X{log_type}','%X{log_datetime}','%X{log_ip}','%X{log_host_name}') 

 

Log测试类:

 

public class LogTest {

static Log log = LogFactory.getLog(LogTest.class);

public void log() {

SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH🇲🇲ss");

Date now = new Date(System.currentTimeMillis());

MDC.put("user_id", 1);

MDC.put("log_title", "网站访问记录");

MDC.put("log_type", "记录");

MDC.put("log_title", "网站访问记录");

MDC.put("log_datetime", format.format(now));

try {

InetAddress addr = InetAddress.getLocalHost();

String ip = addr.getHostAddress();// 获得本机IP

String host_name = addr.getHostName();// 获得本机名称

MDC.put("log_ip", ip);

MDC.put("log_host_name", host_name);

} catch (UnknownHostException e) {

e.printStackTrace();

MDC.put("log_net_error", "无法获取本机IP信息");

}

log.info(MDC.getContext());

}

public static void main(String[] args) {

LogTest test = new LogTest();

test.log();

}

}

 

对配置文件的说明:

(1)log4j.logger.user_login_info =INFO,U1,Udb  我将同个事件分别输出到不同的类型中(不知这样理解对不对~)

(2)log4j.appender.Udb=com.log.DBAppender 是我自定义方法,是对数据库连接池的封装(可以操作数据操作性能吧~)

 

 

不知道是我配置有问题还是哪儿设计有问题,总不成功、报错。。。如果实再不行,只能写个Filter手动操作了,我想这样实现起来和用log4j原理也是一样的吧,性能上有什么问题呢?

小弟不才,开发时遇到如此错误,还请大牛伸出援手,帮我答疑解惑,不胜感激!^_^

 

 

加载中
0
黄青龙
黄青龙

能否给你这项目的源码我看看  我也在学

华兹格
华兹格
刚回到学校,不好意思这么久才回你呀!你能具体点吗?我也是新手,怕误了你,你想要啥可以直接说的~~
0
(码农)
(码农)

1、Hibernate简化了对象模型和关系模型之间的转换,使得开发者不需要太多的关心数据库模型,只要从对象的角度出发,把更多的精力放到业务上就可以了。

2、Hibernate可以通过简单的配置,利用第三方组件,快速的实现数据连接池(如C3P0)功能、数据缓存能力(如EHCACHE、OSCACHE等).

3、使用Hibernate开发,可实现高度的可抑制性能,可以用同一份代码在不同类型的数据库之间使用。

暂时只想到这么多,呵呵。

返回顶部
顶部