记性不如烂笔头14-使用log4jdbc显示完整SQL语句和执行时间

系统在现网环境下运行,有时候会出现响应比较慢的情况,有时候是因为数据库引起的,有时候是由于中间件引起的,也有可能是别的原因引起的,对一个现网系统来说,响应速度是非常重要的,要能够及时方向慢的地方;

还是在现网环境中,特别是一些复杂的数据操作内容,可能不符合数据库的某一些条件导致错误,而我们一般使用ibatis,hibernate,spring这些工具打印的jdbc的sql日志信息,有一点个缺点是占位符与参数是分开打印的,如果想要拷贝sql至PLSQL Developer客户端直接执行,需要自己拼凑sql。

log4jdbc是在jdbc层的一个日志框架,可以将占位符与参数全部合并在一起显示,并且可以显示SQL语句执行的时间,可以方便的解决上面两个问题。

1、在java的应用系统中log4jdbc的基本使用

相关必备包:分别是log4jdbc包,SLF4j包,log4j包;

1.1.选择相关JAR包和版本

log4jdbc3-1.2beta2.jar    for JDBC 3support in JDK 1.4 , JDK 1.5

log4jdbc4-1.2beta2.jar    for JDBC 4support in JDK 1.6 , JDK 1.7

需要使用SLF4j,主要是slf4j-api-1.7.10.jar和slf4j-log4j12-1.7.10.jar

需要log4j对应的包,log4j-1.2.16.jar

1.2.设置jdbc driver

如:在jdbc.properties中将原先的jdbc.driver=oracle.jdbc.driver.OracleDriver

修改为jdbc.driver=net.sf.log4jdbc.DriverSpy

1.3.修改jdbc url

在jdbc.properties中将原先的jdbc.url=jdbc:oracle:thin:@192.168.1.1:1521:ffm

修改为 jdbc.url=jdbc:log4jdbc:oracle:thin:@192.168.1.1:1521:ffm

1.4. 设置logger

如在控制台仅需要输出sql语句的log4j.properties

log4j.logger.jdbc.sqlonly=DEBUG,sql log4j.additivity.jdbc.sqlonly=truelog4j.appender.sql=org.apache.log4j.ConsoleAppenderlog4j.appender.sqlThreshold=debug log4j.appender.sqlTarget=System.out log4j.appender.sqlEncoding=GBKlog4j.appender.sql.layout=org.apache.log4j.PatternLayoutlog4j.appender.sql.layout.ConversionPattern=----->
%d{yyyy-MM-ddHH:mm:ss.SSS} %m%n%n

1.5.其他注意事项

在学习log4jdbc之前,最好有一个能访问数据库的应用,这样改造起来最简单

2、log4jdbc应用的源代码

本质上来说,改变的知识配置文件,而不是源代码

package com.db;

import java.io.IOException;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.SQLException;

import java.util.Properties;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importorg.apache.commons.dbcp.BasicDataSource;

importorg.apache.commons.dbcp.BasicDataSourceFactory;

import org.apache.commons.dbutils.QueryRunner;

/**

*本应用作为servlet简单模拟使用log4jdbc访问数据库,对一个普通的应用来说,只需要在配置上做调整;

*如果用spring等框架,要加在spring的拦截器上;

*@author 范芳铭

*/

public class Log4JDBCTest  extends HttpServlet{

staticConfigurationUsage propManager = null;

privatestatic BasicDataSource dataSourceBM = null;

//bm

publicstatic void initBM() {

if(dataSourceBM != null) {

try{

dataSourceBM.close();

}catch (Exception e) {

e.printStackTrace();

}

dataSourceBM= null;

}

try{

Propertiesp = new Properties();

p.setProperty("driverClassName",propManager.getInstance().getProperty("jdbc.bm.driverClassName"));

p.setProperty("url",propManager.getInstance().getProperty("jdbc.bm.url"));

p.setProperty("password",propManager.getInstance().getProperty("jdbc.bm.username"));

p.setProperty("username",propManager.getInstance().getProperty("jdbc.bm.password"));

p.setProperty("maxActive",propManager.getInstance().getProperty("jdbc.bm.maxActive"));

p.setProperty("maxIdle",propManager.getInstance().getProperty("jdbc.bm.maxIdle"));

p.setProperty("maxWait",propManager.getInstance().getProperty("jdbc.bm.maxWait"));

dataSourceBM= (BasicDataSource) BasicDataSourceFactory

.createDataSource(p);

}catch (Exception e) {

e.printStackTrace();

}

}

publicstatic synchronized Connection getConnBM() throws SQLException {

if(dataSourceBM == null) {

initBM();

}

Connectionconn = null;

if(dataSourceBM != null) {

conn= dataSourceBM.getConnection();

}

returnconn;

}

privateQueryRunner runner = null;

//使用上,和没有用Log4jdbc一样,没有区别

publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException,IOException {

String sql = " select sysdate from dual where rownum < ? ";

Connection con = null;

PreparedStatement pstmt = null;

try {

con = Log4JDBCTest.getConnBM();

pstmt = con.prepareStatement(sql);

pstmt.setString(1, "2");//显示第一条

boolean executeResult =pstmt.execute();

System.out.println("数据库访问完成");

} catch (SQLException e) {

e.printStackTrace();

}finally{

try {

pstmt.close();

con.close();

} catch (SQLException e) {

e.printStackTrace();

}

}

}

public void doPost(HttpServletRequest request, HttpServletResponseresponse)

throws ServletException,IOException {

this.doGet(request, response);

}

}

一个读配置文件的辅助类:

package com.db;

importorg.apache.commons.configuration.CompositeConfiguration;

importorg.apache.commons.configuration.ConfigurationException;

import org.apache.commons.configuration.PropertiesConfiguration;

/**

*@author 范芳铭

*/

public class ConfigurationUsage {

privateConfigurationUsage() {

}

privatestatic ConfigurationUsage propManager;

publicsynchronized static ConfigurationUsage getInstance() {

if(propManager == null) {

propManager= new ConfigurationUsage();

}

returnpropManager;

}

publicstatic CompositeConfiguration config = new CompositeConfiguration();

static{

try{

config.addConfiguration(newPropertiesConfiguration(

"dbconfig.properties"));

}catch (ConfigurationException e) {

e.printStackTrace();

}

}

publicString getProperty(String key) {

returnconfig.getString(key);

}

}

配置文件(修改后):

jdbc.bm.driverClassName=net.sf.log4jdbc.DriverSpy

jdbc.bm.url=jdbc:log4jdbc:oracle:thin:@192.168.1.1:1521:ffm

jdbc.bm.username=ffm

jdbc.bm.password=ffm

jdbc.bm.maxActive=5

jdbc.bm.maxIdle=2

jdbc.bm.maxWait=200

修改前为:

jdbc.bm.driverClassName=
oracle.jdbc.driver.OracleDriver

jdbc.bm.url=jdbc:oracle:thin:@192.168.1.1:1521:ffm

jdbc.bm.username=ffm

jdbc.bm.password=ffm

jdbc.bm.maxActive=5

jdbc.bm.maxIdle=2

jdbc.bm.maxWait=200

3、运行结果

4、2015-02-0214:18:57.376 org.apache.commons.dbcp.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:172)

5、2. select sysdate fromdual where rownum < ‘2‘

6、

7、2015-02-02 14:18:57.521select sysdate from dual where rownum < ‘2‘ {executed in 145 msec}

8、

9、数据库访问完成

我们能看到运行的SQL语句,也可以看到花费的时间(executed in 67msec)

时间: 2024-10-26 15:52:17

记性不如烂笔头14-使用log4jdbc显示完整SQL语句和执行时间的相关文章

pl/sql developer 快捷操作: 显示不可见字符 显示历史sql语句 拷贝整个sql窗口的语句至新的sql窗口

显示不可见字符:可以把空格.回车显示出来: 显示历史sql语句:ctrl+e,不仅仅包含这个数据库的sql语句,还有其他数据库的:必须在sql窗口才可以激活这个功能: 拷贝整个sql语句至新的sql窗口:可以进行快捷的备份.修改:

log4jdbc打印完整SQL

一.log4jdbc简单介绍: log4jdbc是工作在jdbc层的一个日志框架,能够记录SQL及数据库连接执行信息. 一般的SQL日志会把占位符和参数值分开打印,log4jdbc则会记录数据库执行的完整SQL字符串,在数据库应用开发调试阶段非常有用. log4jdbc具有以下特性: 支持JDBC3和JDBC4. 支持现有大部分JDBC驱动. 易于配置(在大部分情况下,只需要改变驱动类名和jdbc的URL,设置好日志输出级别). 能够自动把SQL变量值加到SQL输出日志中,改进易读性和方便调试.

步步为营-46-分页显示的SQL语句

说明:分页显示在实际业务中经常需要用到,其SQL语句分两种 --方法一:跳过多少行,选中多少行 --每页n条,选择第m页--n=2 m=3 --select top(n) * from 表 where 主键 not in (select top(m-1)*n 主键 from 表); select * from UserInfo select top(2) * from UserInfo where Empid not in (select top((3-1)*2) EmpId from User

记性不如烂笔头21-JAVA数据库连接池 DBCP

用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天100万访问量,数据库服务器就需要创建100万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器连接数溢出,并且用户的使用也会很慢,影响用户体验: 对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标. 数据库连接池针对这些问题创建出来.数据库连接池负责分配,管理和释放数据库资源,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个. 数据库连接

记性不如烂笔头22-JAVA数据库连接池 C3P0

C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等.C3P0数据源在项目开发中使用得比较多. 1.c3p0与dbcp区别 dbcp没有自动回收空闲连接的功能 c3p0有自动回收空闲连接功能 c3p0支持更加多的数据库连接池选项. 2.导入相关jar包 c3p0-0.9.0.jar 3.C3P0参数详解 datasource.c3p0.acquireIncrement=10当连接池中的

记性不如烂笔头29-java应用中的过滤器Filter(1)

过滤器(Filter),功能非常的强大,是Servlet中最重要的技术之一,WEB应用的开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter

记性不如烂笔头46-java拦截器-彻底理解动态代理的概念(1)

动态代理技术是整个java技术系统中非常重要的一环,它是我们能够深入学习java框架的基础,是深入了解Spring等框架时要掌握的基础知识之一. 1. JAVA中代理的概念 动态代理技术就是用来产生一个对象的代理对象的.直接说好像也很迷糊,好像用不上的样子. (下面的例子部分来自互联网) 举一个现实生活中的例子:歌星或者明星都有一个自己的经纪人,这个经纪人就是他们的代理人,当我们需要找明星表演时,不能直接找到该明星,只能是找明星的代理人.比如王宝强在现实生活中非常有名,会唱歌,会跳舞,会拍戏.王

记性不如烂笔头33-利用java过滤器实现压缩响应正文内容

在前面的Response的相关内容中,就提到了把数据压缩然后传到浏览器上,通过压缩,能够提升网络文件的传输效率,在很多的场所都需要实用. 如果我们需要在所有的页面都实现压缩,那么是不是把这个加在某一个地方就一起解决了呢?貌似我们能够在过滤器中加载很多的内容,那么是不是也可以把这个也加在过滤器中呢?答案是可以的. 我们可以通过增强HttpServletResponseWrapper对象,压缩响应正文内容. 1. 原理 通过过滤器filter向目标页面传递一个自定义的response对象.在自定义的

iBatis显示运行sql语句的配置

#在log4j.properties中加入以下配置即可: log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG log4j.logger.java.sql.Connection=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.ja