准备好的语句的 Java ExecuteUpdate 方法挂起

Posted

技术标签:

【中文标题】准备好的语句的 Java ExecuteUpdate 方法挂起【英文标题】:Java ExecuteUpdate method for prepared statement hangs 【发布时间】:2015-04-24 15:28:44 【问题描述】:

所以我一直在努力尝试让某个准备好的语句能够将值插入到我的数据库中。作为参考,我使用 mysql 服务器 5.5 和 Connector/J 作为我的数据库 + 驱动程序。

我尝试运行以下代码:

     sql = "INSERT INTO event "
+ "( ename, description, edatetime, location, is_public_e,sponsored_by)"+"VALUES ( ?, ?, ?, ?, ?,?);";                          
                        PreparedStatement a1 = con.prepareStatement(sql);                                           
                        a1.setString(1, ename.toString());
                        a1.setString(2, desc.toString());
                        a1.setString(3, date);
                        a1.setString(4, location.toString());
                        a1.setInt(5, pub);
                        a1.setString(6, clubid.toString());
                        a1.executeUpdate();

其中 ename、description 和 location 是字符串,edatetime 是日期时间,is_public 是布尔值,赞助商是整数。无论我使用什么数据通过 Eclipse 运行此代码,都会导致 executeUpdate() 行无限期挂起。

但是,使用相同的数据,我可以通过服务器命令行插入事件。更奇怪的是,其他插入语句完美无缺。我认为问题可能是日期时间转换,但将日期时间硬编码到语句中仍然导致挂起。

谁能提供任何关于为什么会发生这种情况的见解?

现在我唯一的想法是这是我的服务器 + 驱动程序配置,但我在笔记本电脑上重新下载了该软件,但问题仍然存在,所以我认为这不是问题。我还假设我可以在准备好的语句中使用的通配符没有限制,但如果有可能会导致问题?此外,在代码的前面,我将连接设置为自动提交,但我不确定我的驱动程序是否支持它,并且鉴于我的其他插入工作我不确定这是否是问题。

感谢您的帮助!

【问题讨论】:

它无限期挂起,你没有得到任何错误?尝试在调试模式下运行,看看发生了什么:它真的是挂起的数据库代码吗?数据库锁可能会导致插入挂起。确保正确关闭之前的语句(插入、更新、读取)。 我认为问题不在于您向我们展示的代码。我们能看到更多吗? @OP:如果您使用Statement 而不是PreparedStatement,在这个特定的插入中,行为如何? 语句在这种情况下给出了相同的行为。今天晚些时候我回家后会添加更多代码。也没有错误,它只是粘在那条线上,即使我有它是第一个执行它的插入,它仍然挂起,所以我不相信应该有锁,但我回家时会检查. 【参考方案1】:

所以我通过准备我的陈述解决了这个问题:

a1.setString(1, ename);
a1.setString(2, desc);
a1.setString(3, date + " " + time);
a1.setString(4, location);
a1.setInt(5, 1);
a1.setInt(6, cid);

我认为这是通过将日期时间重新格式化为 yyyy-mm-dd hh:mm:ss 格式来解决的,我认为这是被格式化并且没有正确抛出 sqlException。

【讨论】:

为什么不使用 setDate 在数据库中存储日期/时间信息?您应该让数据库自行决定应该如何存储它【参考方案2】:

尝试使用ps.executeQuery() 而不是ps.executeUpdate()。它适用于我的情况。

编辑:请原谅我之前的回答。

【讨论】:

executeQuery() 返回一个 ResultSet 和更好的 select 查询。 docs.oracle.com/javase/7/docs/api/java/sql/… 您会收到一条错误消息SQLException: Can not issue data manipulation statements with executeQuery()

以上是关于准备好的语句的 Java ExecuteUpdate 方法挂起的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中将动态 SQL 查询转换为准备好的语句

java准备好的语句

在 Java 中转义 MySQL 字符串...没有准备好的语句

设置准备好的语句参数 where NOT NULL java

java - 如何在java中为mysql的JSON数据类型使用准备好的语句?

如何在 Java 中使用准备好的语句进行选择查询?