Java MySQL PreparedStatement.setBoolean用引号括起值

时间:2013-10-10 08:15:32

标签: java mysql prepared-statement

我的问题的简短版本是:

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。

1 个答案:

答案 0 :(得分:0)

嗯,事实证明这实际上是一个未公开的准备好的陈述的问题。 当打开的语句计数在MySQL服务器达到其允许的最大值时,应用程序仍然能够以某种方式继续工作,而不会产生sql错误:

Error Code: 1461 Can’t create more than max_prepared_stmt_count statements

但是在那个模式中,它开始用引号包装布尔值,导致我的所有麻烦都影响到BIT(1)列。