做者:泥沙砖瓦浆木匠
网站:http://blog.csdn.net/jeffli1993
我的签名:打算起手不凡写出鸿篇巨做的人,每每坚持不了完成第一章节。html
交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_AonqzL0rpdQAjjqlHQQjava
若是个人帮到了你,是否乐意捐助一下或请一杯啤酒也好呢?有你支持,干的更好~mysql
点这参与众筹 个人支付宝:13958686678git
泥瓦匠又和你们见面了,最近两天我在Code Review ,顺便代码小小的Refactoring(重构)下。先了解这个项目吧,此次解决的是数据源配置优化。由于这web项目中配置数据源的地方不少。例如JDBC要配置数据源,Mybatis要配置数据源,Quartz定时任务要配置数据源,还有Log4j存记录到数据库也要配置…github
如题目,兴许你们的疑惑看了前面的说明会明白。此次给你们带来的 数据源配置与优化:log4j 配置数据库链接池Druid。web
提纲:sql
泥瓦匠也是怕本身说不清楚,又不想把Log4j 和 Durid介绍个遍。那样会太麻烦。此次主要是项目实战。因此泥瓦匠也不罗嗦知识准备这块也就是点到为止。数据库
Log4j 简介
在应用程序中添加日志记录总的来讲基于三个目的:
监视代码中变量的变化状况,周期性的记录到文件中供其余应用进行统计分析工做;
跟踪代码运行时轨迹,做为往后审计的依据;
担当集成开发环境中的调试器的做用,向文件或控制台打印代码的调试信息。
它支持将日志信息输入到数据库,此次咱们一Mysql为例说明。咱们须要Log4j来将调试信息、操做信息等记录下来,以便后面的审计,这些日志信息包括用户ID、用户姓名、操做类、路径、方法、操做时间、日志信息。apache
Druid 简介编程
Druid是Java语言中最好的数据库链接池。Druid可以提供强大的监控和扩展功能。很少多介绍了,阿里牛人做品必须精品。详细介绍在:https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
泥瓦匠的任务很简单,目的是为了数据源配置优化,实现数据源配置的惟一性。泥瓦匠也画了草图,曾经被人说成画图画出鬼画符的我告诉你们:没事,越作越好。如图,设计简单草图就是这样的。
结论:一个项目的配置文件要保持惟一性,就是数据源配置的惟一性。
3、正文 开始动手吧
开始弄吧,为了写这个东西。我就也搞了个demo项目。泥瓦匠很辛苦的,哈哈送钱的上面支付宝哦。哈哈,泡了杯水,准备说这个项目了。下面,泥瓦匠先给出这个项目的结构图,这样我待会讲起来不怎么累。逻辑性比较强吧。如图:
上面很清楚的写着我须要完成的功能模块。最后那个test,是一个测试的servlet类。你们一看就明白。我先从配置文件提及吧。
配置文件 :
dbConfig.properties 记录的是最基础的db配置:url name psd 等,代码以下:
database.vendor = mysql db_url = jdbc:mysql://localhost:3307/test driverClassName= com.mysql.jdbc.Driver db_user = root db_password = 123456 showsql= false devMode = true validationQuery=SELECT 1
log4j.properties则是日志的配置,但日志的配置中有一点注意的是以下:
log4j.rootLogger=debug,appender1 log4j.appender.appender1=org.apache.log4j.ConsoleAppender log4j.appender.appender1.layout=org.apache.log4j.TTCCLayout log4j.logger.test=INFO, db # log db setting log4j.appender.db=org.nsg.dbsetting.MyJDBCAppender log4j.appender.db.BufferSize=1 log4j.appender.db.sql=insert into operate_log(handclass,method,createtime,loglevel,logmsg) values ('%C','%M','%d{yyyy-MM-dd HH\:mm\:ss}','%p','%m') log4j.appender.db.layout=org.apache.log4j.PatternLayout
在这里,咱们要注意两点:
1、设置咱们包的下的logger权限,并给予存数据库的权限。
2、db的实现的应用要为你写的引用类。
# log db setting log4j.appender.db=org.nsg.dbsetting.MyJDBCAppender
建数据表 :
而后咱们要根据上面配置文件中写的数据库和表格咱们要对应的建一个名为test的数据库和一张名为operate_log的表。
/* Navicat MySQL Data Transfer Source Server : Mysql Source Server Version : 50617 Source Host : localhost:3307 Source Database : test Target Server Type : MYSQL Target Server Version : 50617 File Encoding : 65001 Date: 2014-12-08 18:46:21 */ SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- Table structure for operate_log -- ---------------------------- DROP TABLE IF EXISTS `operate_log`; CREATE TABLE `operate_log` ( `log_id` int(11) NOT NULL AUTO_INCREMENT, `handclass` varchar(100) DEFAULT NULL, `method` varchar(100) DEFAULT NULL, `createtime` varchar(100) DEFAULT NULL, `loglevel` varchar(20) DEFAULT NULL, `logmsg` text, PRIMARY KEY (`log_id`) ) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8;
这样咱们就能够开始写代码了,泥瓦匠是一个很细节的人。此次博客,我主要是讲下代码中的核心点。由于后面我会把项目提供给大家下载。因此,这里点到为止。
核心代码讲解:
MyJDBCAppender.java 用于Log4j的数据库Session管理[链接池用Druid]。这个确定是咱们得核心思想。这里我就继承了log4j提供的org.apache.log4j.jdbc.JDBCAppender;而后只要简单的重写了closeConnection和getConnection方法。若是获取Druid数据库源对象异常的话,我还写了个 取消初始化 的方法uninitialize。代码这边也贴出下,方便你们观看:
package org.nsg.dbsetting; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import org.apache.log4j.jdbc.JDBCAppender; import org.apache.log4j.spi.ErrorCode; import org.nsg.constant.PropertiesConst; import org.nsg.exception.JdbcException; import org.nsg.util.MyProperties; import org.nsg.util.PropertiesUtil; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; /** * @Description MyJDBCAppender.java * 用于Log4j的数据库Session管理[链接池用Druid] * @author 泥沙砖瓦浆木匠 * @date 2014年12月7日下午1:50:56 * @version 1.0 */ public class MyJDBCAppender extends JDBCAppender { /* Druid数据源 */ private DruidDataSource dataSource; public MyJDBCAppender() { super(); } @Override protected void closeConnection(Connection con) { try { /* 若是数据库链接对象不为空和没有被关闭的话,关闭数据库链接 */ if ( con != null && !con.isClosed()) con.close(); } catch (SQLException e) { errorHandler.error("Error closing MyJDBCAppender.closeConnection() 's connection",e,ErrorCode.GENERIC_FAILURE); } } @Override protected Connection getConnection() throws SQLException { /* 获取数据库配置property */ MyProperties properties = PropertiesUtil.loadPropertyFile(PropertiesConst.DB_CONFIG); String className = String.valueOf(properties.getProperty("driverClassName","")); String connUrl = String.valueOf(properties.getProperty("db_url","")); String uname = String.valueOf(properties.getProperty("db_user","")); String psw = String.valueOf(properties.getProperty("db_password","")); System.out.println(className); System.out.println(connUrl); System.out.println(uname); System.out.println(psw); Properties result = new Properties(); result.put("driverClassName",className); result.put("url",connUrl); result.put("username",uname); result.put("password",psw); /* 其余配置 天然你也能够本身写property 而后获取set */ result.put("maxActive","30"); result.put("minIdle","3"); try { dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(result); } catch (Exception e) { /* Druid数据库源对象产生失败后,取消初始化 */ try {uninitialize();} catch(Exception e2) {} throw new JdbcException(e); } return dataSource.getConnection(); } /* 取消初始化 */ public void uninitialize() { try { if (dataSource != null) dataSource.close(); } catch (Exception e) { throw new JdbcException(String.format("MyJDBCAppender uninitialize fail (%s)",e)); } finally { super.close(); } } }
值得注意的一点是,泥瓦匠为了方便,因此在其中的地方没有获取druid链接池的配置。而是直接写了下面:
/* 其余配置 天然你也能够本身写property 而后获取set */ result.put("maxActive","30"); result.put("minIdle","3");
其实这样写是很差了,咱们能够写一个druid.properties而后将链接池的配置放入其中。获取set,for循环set便可。这边我就不实现了。很简单哦,泥瓦匠相信大家。
最后我演示下,示例代码:放到tomcat7上,而后运行访问
看到控制台刷出来两条信息,由于我门设置的是log4j.logger.test=INFO, db。
而后咱们去查看数据库,这边我用Navicat:
结论:重构颇有意思,慢慢来,一点一点来,就好了。细节成就将来。
下载连接:
http://pan.baidu.com/s/1hqKN0Le
如以上文章或连接对你有帮助的话,别忘了在文章按钮或到页面右下角点击 “赞一个” 按钮哦。你也能够点击页面右边“分享”悬浮按钮哦,让更多的人阅读这篇文章