快速业务通道

使用增强型PreparedStatement向JDBC代码增加日志功能 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-19

使用增强型PreparedStatement向JDBC代码增加日志功能

时间:2011-02-04 IBM Jens Wyke

在大多数情况下,JDBC PreparedStatements 使执行数据库查询更简便并可以显著提升您整体应用程序的性能。当谈到日志查询语句时 PreparedStatement 接口就显得有些不足了。 PreparedStatement 的优势在于其可变性,但是一个好的日志条目必须正确描述如何将SQL发送到数据库,它将密切关注用实际的参数值来替换所有参数占位符。虽然有多种方法可以解决这一难题,但没有任何一种易于大规模实施并且大部分将扰乱您的程序代码。

在本文中,您将了解到如何扩展JDBC PreparedStatement 接口来进行查询日志。 LoggableStatement 类实现 PreparedStatement 接口,但添加用于获得查询字符串的方法,使用一种适用于记录的格式。使用 LoggableStatement 类可以减少日志代码中发生错误的几率,生成简单且易于管理的代码。

注意:本文假设您有丰富的JDBC和 PreparedStatement 类经验。

典型日志解决方案

表1介绍了数据库查询时通常是如何使用 PreparedStatement (虽然忽略了初始化和错误处理)。在本文中,我们将使用SQL query SELECT 做为例子,但讨论使用其它类型的SQL语句,如 DELETE 、 UPDATE 和 INSERT 。

表1:一个典型的SQL数据库查询

String sql = "select foo, bar from foobar where foo < ? and bar = ?";    String fooValue = new Long(99);    String barValue = "christmas";    Connection conn = dataSource.getConnection();    PreparedStatement pstmt = conn.prepareStatement(sql);    pstmt.setLong(1,fooValue);    pstmt.setString(2,barValue);    ResultSet rs = pstmt.executeQuery();    // parse result...

表1中一个好的查询日志条目看起来应与下面有几分类似:

Executing query: select foo,bar from foobar where foo < 99 and bar=''christmas''

下面是查询的日志代码的一个例子。注意:表1中的问号已经被每个参数的值替换。

System.out.println("Executing query: select foo, bar from foobar where foo < "+fooValue+" and bar = ''+barValue+"''")

一种更好的方法是创建方法,我们称之为 replaceFirstQuestionMark ,它读取查询字符串并用参数值替换问号,如表2所示。这类方法的使用无需创建复制的字符串来描述SQL语句。

表 2:使用replaceFirstQuestionMark来进行字符串替换

// listing 1 goes here     sql = replaceFirstQuestionMark(sql, fooValue);     sql = replaceFirstQuestionMark(sql, barValue);     System.out.println("Executing query: "+sql);

虽然这些解决方案都易于实施,但没有一种是完美的。问题是在更改SQL模板的同时也必须更改日志代码。您将在某一点上犯错几乎是不可避免的。查询将更改但您忘记了更新日志代码,您将结束与将发送到数据库的查询不匹配的日志条目 -- 调试恶梦。

我们真正需要的是一种使我们能够一次性使用每个参数变量(在我们的实例中为 fooValue 和 barValue )的设计方案。我们希望有一种方法,它使我们能够获得查询字符串,并用实际的参数值替换参数占位符。由于 java.sql.PreparedStatement 没有此类方法,我们必须自己实现。

使用增强型PreparedStatement向JDBC代码增加日志功能(2)

时间:2011-02-04 IBM Jens Wyke

定制解决方案

我们的 PreparedStatement 定制实施将做为围绕JDBC驱动器提供的“真实语句(real statement)”的封装器(Wrapper)。封装器语句将转

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号