PrepareStatement 挂在 executeUpdate 函数上

Posted

技术标签:

【中文标题】PrepareStatement 挂在 executeUpdate 函数上【英文标题】:PrepareStatement hangs on the executeUpdate function 【发布时间】:2012-06-25 10:18:34 【问题描述】:

我的数据库添加功能出现问题。以下代码挂在 ExecuteUpdate 语句上,它不会抛出异常,所以我不知道哪里出了问题。

public static boolean addUser(User userToAdd) throws Exception 
    boolean isAdded = false;

    if (checkConnection()) 
        try 
            if (isUnique(userToAdd.getIdCardNumber())) 
                PreparedStatement pstmt = connection.prepareStatement("INSERT INTO users SET "
                        + "idCardNr = ?,nationality = ?,name = ?,"
                        + "address = ?,photo = ?,status = ?,gender = ?,"
                        + "nationalNr = ?,birthDate = ?,birthPlace = ?,"
                        + "created = ?, country = ?");

                pstmt.setString(1, userToAdd.getIdCardNumber());
                pstmt.setString(2, userToAdd.getNationality());
                pstmt.setString(3, userToAdd.getFullName());
                pstmt.setString(4, userToAdd.getAddress());
                pstmt.setString(5, userToAdd.getPhotoPath());
                pstmt.setString(6, userToAdd.getStatus());
                pstmt.setString(7, userToAdd.getGender());
                pstmt.setString(8, userToAdd.getRegisterNumber());
                pstmt.setString(9, userToAdd.getBirthday());
                pstmt.setString(10, userToAdd.getBirthPlace());
                java.sql.Timestamp current = new java.sql.Timestamp(System.currentTimeMillis());
                userToAdd.setCreated(current);
                pstmt.setTimestamp(11, userToAdd.getCreated());
                pstmt.setString(12, userToAdd.getCountry());


                int rowsAffected;
                try 
                   rowsAffected = pstmt.executeUpdate();
                 catch (SQLException e) 
                    throw new Exception("Exception while executing update: " + e.getMessage());
                


                if (rowsAffected != 0) 
                    isAdded = true;
                    pstmt.close();
                

             else 
                System.out.println("User already in database");
            
         catch (Exception ex) 
            ex.printStackTrace();
        
    
    return isAdded;

有人可以帮我调试一下吗?

【问题讨论】:

插入使用的连接和isUnique方法使用的连接是一样的吧? (想排除您自己的代码之间的一些阻塞)。另外:您是否尝试从某些 SQL 客户端手动执行插入? 【参考方案1】:

您的 SQL 格式错误,您正在尝试使用 UPDATE 的语法插入。

这是标准 INSERT 的外观

INSERT INTO users (idCardNr,nationality,name,address,photo,status,gender,nationalNr,birthDate,birthPlace,created,country) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)

在将 SQL 放入代码之前手动测试它总是一个好主意。

【讨论】:

感谢,与小组一起为小组项目工作。我没有检查查询,正在尝试执行。真的谢谢,已经解决了。 我怀疑这是问题所在。根据dev.mysql.com/doc/refman/5.5/en/insert.html查询有效。如果是语法问题,它不会挂起。它会抛出异常。该语句可能等待释放锁(例如忘记提交一些更新) @JBNizet 确实,我不知道 mysql 允许这样做。 +1 @JBNizet。此外,万一其他人遇到这个问题,我的 Java 代码很好,但我同时打开了 SQL Devloper 来检查结果,而 IT 导致了锁定!仅供参考。 @JBNizet 你能扩展 SQL Developer 的问题吗?我和你遇到同样的问题,我需要完全关闭 SQL Developer 吗?【参考方案2】:

快速回答:

遇到了同样的问题。 更新/插入在 96% 的时间里无缘无故地挂起。 设置:旧 Java 虚拟机:Windows 上的 JRockit 1.5 + Weblogic 10.0 在preparedStatement.execute() 上挂了,甚至两次崩溃了整个JVM!

原因(JVM Vendor 没那么重要)

JVM 时区数据已过时,在存在 Date 参数的情况下弄乱了日期序列化。 tzdata 是从 2006 年回来的!我们现在是 2013 年!

解决方案

使用 JDK 或支持页面中的 TimeZone Updater Tool。 Here 用于 JRockit JDK 或 here 用于 Oracle JDK。 重新启动您的应用程序。

【讨论】:

以上是关于PrepareStatement 挂在 executeUpdate 函数上的主要内容,如果未能解决你的问题,请参考以下文章

How to get service execuable path

电子构建失败并出现 ERR_ELECTRON_BUILDER_CANNOT_EXECUTE

JDBC PrepareStatement对象执行批量处理实例

jdbc 中prepareStatement对sql中的占位符赋值问题

prepareStatement与Statement的区别

JDBC中使用的java中**Connection接口**的**prepareStatement**的实现在哪里?