当前位置: 首页 > 面试题库 >

用Java记录PreparedStatement

刘弘新
2023-03-14
问题内容

一直很麻烦的一件事是,当您具有PreparedStatement而不是查询本身时,记录SQL(JDBC)错误。

您总是会收到以下消息:

2008-10-20 09:19:48,114 ERROR LoggingQueueConsumer-52 [Logger.error:168] Error 
executing SQL: [INSERT INTO private_rooms_bans (room_id, name, user_id, msisdn, 
nickname) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE room_id = ?, name = ?, 
user_id = ?, msisdn = ?, nickname = ?]

当然,我可以编写一个辅助方法来检索值并用实际值解析/替换问号(如果我没有得到这个问题的结果,很可能会走这条路),但是我只是想知道是否此问题已由其他人解决,并且/或者是否有任何通用的日志记录帮助程序可以自动为我完成此任务。

经过几个答案编辑:

到目前为止提供的库似乎适合记录调试语句,这无疑是有用的。但是,我正在寻找一种采取PreparedStatement本身(而不是某些子类)并在发生错误时记录其SQL语句的方法。我不想使用PreparedStatement的替代实现来部署生产应用程序

我猜我在寻找实用程序类,而不是PreparedStatement专业化类。

谢谢!


问题答案:

我尝试了log4jdbc,它为我做了工作。

安全说明:截至2011年8月今天,执行log4jdbc准备好的语句的记录结果并不安全。 它们可以用于分析,但绝不应该反馈到DBMS中。

实施例 通过logjdbc生成的日志的:

2010/08/12 16:30:56 jdbc.sqlonly
org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)8.插入A_TABLE(ID_FILE,CODE1,ID_G,ID_SEQUENCE,REF,NAME,BAR
,DRINK_ID,AMOUNT,DESCRIPTION,STATUS,CODE2,REJECT_DESCR,ID_CUST_REJ)值(2,‘123’,1,‘2’,’aa’,’awe’,null,‘0123’,4317.95,’Rccc’,’
0’,null,null,null)


该库很容易设置:

我的 HSQLDB 配置:

jdbc.url=jdbc:log4jdbc:hsqldb:mem:sample

使用 Oracle

jdbc.url=jdbc:log4jdbc:oracle:thin:@mybdd:1521:smt
jdbc.driverClass=net.sf.log4jdbc.DriverSpy

logback.xml:

<logger name="jdbc.sqlonly" level="DEBUG"/>

不幸的是,它不在Maven存储库中,但仍然很有用。
根据我的尝试,如果您设置

您只会得到错误的语句,但是,我不知道该库是否对性能有影响。



 类似资料:
  • 问题内容: 构造之后,使用标准的Java日志记录API(导入java.util.logging.Logger): 我已经可以登录了。由于它没有FileHandler,因此不会向磁盘写入任何内容。 它写入(不是全部)日志消息以输出。如何禁用此功能?在此先感谢Agostino 问题答案: 如果您不知道Java util日志记录的默认配置,就会出现问题。体系结构事实:0)每个记录器(无论其名称是什么)都

  • 友邦咨询科技 1.简单介绍一下整个项目使用了哪些技术? 2.对springboot的理解? 3.Sprinboot 核心注解 4.通过spring boot怎么处理异常 5.SpringMVC的bean的生命周期 6.Java中创建对象的方式 7.Hashmap和hashtable的区别 8.Scheduler定时器是怎么做的? 9.使用定时器,数据同步时什么时候跑完有没有做过检测? 10.Thr

  • 本文向大家介绍Java记录级别,包括了Java记录级别的使用技巧和注意事项,需要的朋友参考一下 示例 Java Logging Api具有7个级别。级别降序为: SEVERE (最高值) WARNING INFO CONFIG FINE FINER FINEST (最低值) 默认级别为INFO(但这取决于系统和使用的虚拟机)。 注意:也有两个级别OFF(可用于关闭登录)和ALL(的相反OFF)。

  • 问题内容: 我正在尝试获取在请求中发送的确切JSON。这是我的代码: 但是我只在日志中看到: 考虑到删除了Retrofit 1 ()以及我们以前使用的Retrofit 1 ,我应该如何正确记录? 问题答案: 在Retrofit 2中,你应该使用HttpLoggingInterceptor。 将依赖项添加到。截至2019年10月的最新版本是: 创建一个Retrofit如下所示的对象: 如果有弃用警告

  • 问题内容: 我在MySQL中用一个表创建了一个数据库: 我尝试使用Java插入记录: 输出似乎成功返回: 但是,当我从MySQL中选择时,插入的记录为空: 为什么插入空白记录? 问题答案: 不,这是行不通的(不适用于真实数据): 更改为: 使用该sql创建一个PreparedStatment,并使用索引插入值:

  • 我在测试中有一段代码,使用Hamcrest 2.2检查结果列表是否包含某些属性: 当是一个普通的类时,这个工作非常好。但是在我将它更改为之后,Hamcrest的抱怨没有名为的属性: 是否有其他匹配器可以用来实现与之前相同的匹配?或者其他解决方法可以用来让它与记录一起工作?