PreparedStatement ps;
ps = connection.prepareStatement("Insert into T values (?)");
ps.setBoolean(1, true);
ps.executeUpdate();
此代码示例生成带有引号值的查询的原因是什么?
我的JavaEE应用程序使用普通的JDBC进行数据库交互,最近我注意到我的日志中出现了一些MySQLDataTruncation
例外。尝试将实体保存到DB表中时发生了这些异常,其中boolean列定义为BIT(1)
。这是因为生成的查询看起来像这样:
Insert into T values ('1');
请注意,值包含引号。使用Log4J log.info(ps);
语句从应用程序记录查询。
以前的日志证明那里没有引号。
此外,甚至MySQL服务器日志也开始变得不同了。在此之前,我为每个执行的查询提供了成对的记录:
12345 Prepare Insert into T values (?)
12345 Execute Insert into T values (1)
之后:
12345 Query Insert into T values ('1')
值得注意的是,这些更改不是因为部署新版本的应用程序,甚至重新启动MySQL /应用程序服务器,而且负责查询生成的代码与此问题中的示例一样简单。
应用程序服务器重新启动将问题解决了大约12个小时,然后再次发生。作为临时解决方案,我将BIT
列更改为TINYINT
P.S。检查aplication和MySQL日志允许将出现错误的时间跨度缩短到大约2分钟,但在此期间日志中没有任何异常。
P.P.S。应用服务器是Glassfish 2.1.1,MySQL服务器版本是5.5.31-1~dotdeb,MySQL Connector / J版本是5.0.3。
答案 0 :(得分:0)
嗯,事实证明这实际上是一个未公开的准备好的陈述的问题。 当打开的语句计数在MySQL服务器达到其允许的最大值时,应用程序仍然能够以某种方式继续工作,而不会产生sql错误:
Error Code: 1461 Can’t create more than max_prepared_stmt_count statements
但是在那个模式中,它开始用引号包装布尔值,导致我的所有麻烦都影响到BIT(1)列。