Java MySQL PreparedStatement.setBoolean将值用引号括起来 简而言之,我的问题是:
此代码示例生成带引号的值的查询的原因是什么 我的问题是: 我有一个JavaEE应用程序,带有用于DB交互的普通JDBC,最近我注意到在我的日志中出现了一些Java MySQL PreparedStatement.setBoolean将值用引号括起来 简而言之,我的问题是:,java,mysql,prepared-statement,Java,Mysql,Prepared Statement,此代码示例生成带引号的值的查询的原因是什么 我的问题是: 我有一个JavaEE应用程序,带有用于DB交互的普通JDBC,最近我注意到在我的日志中出现了一些MySQLDataTruncation异常。这些异常是在试图将实体保存到数据库表中时发生的,该数据库表的布尔列定义为位(1)。这是因为生成的查询如下所示: Insert into T values ('1'); 请注意,值是用引号括起来的。使用Log4Jlog.info(ps)从应用程序记录查询语句。 以前的日志表明,没有引用 此外,甚至My
MySQLDataTruncation
异常。这些异常是在试图将实体保存到数据库表中时发生的,该数据库表的布尔列定义为位(1)
。这是因为生成的查询如下所示:
Insert into T values ('1');
请注意,值是用引号括起来的。使用Log4Jlog.info(ps)从应用程序记录查询代码>语句。
以前的日志表明,没有引用
此外,甚至MySQL服务器日志也开始看起来不一样了。在此之前,我为每个执行的查询提供了成对的记录:
12345 Prepare Insert into T values (?)
12345 Execute Insert into T values (1)
及之后:
12345 Query Insert into T values ('1')
值得注意的是,这些更改并不是部署新版本的应用程序,甚至不是重新启动MySQL/ApplicationServer的结果,负责查询生成的代码与本问题中的示例一样简单
Application server restart在大约12小时内修复了该问题,然后再次发生。作为临时解决方案,我将BIT
列更改为TINYINT
另外,通过检查应用程序和MySQL日志,可以将出现问题的时间缩短到2分钟左右,但这段时间的日志中没有任何异常
p.p.S.应用服务器是Glassfish 2.1.1,MySQL服务器版本是5.5.31-1~dotdeb,MySQL Connector/J版本是5.0.3。事实证明,这实际上是未关闭的准备语句的问题。
当MySQL服务器上打开的语句数达到允许的最大值时,应用程序仍然能够以某种方式继续工作,而不会产生sql错误:
Error Code: 1461 Can’t create more than max_prepared_stmt_count statements
但在这种模式下,它开始用引号将布尔值括起来,这导致我所有的麻烦都影响了位(1)列
Error Code: 1461 Can’t create more than max_prepared_stmt_count statements