【问题标题】:Unable to execute update using email address as primary key in Derby无法在 Derby 中使用电子邮件地址作为主键执行更新
【发布时间】:2017-03-28 06:58:24
【问题描述】:

我看了这些问题,我的问题是他们独有的。

JDBC Update Statement not working in Netbeans but working in SQL

Why is my JDBC prepared statement update not updating the database?

每当我使用有效的“电子邮件”更新 user_account 表中的行时,语句就会锁定,然后我会收到以下异常:

java.sql.SQLTransactionRollbackException: 在请求的时间内无法获得锁

对于这个输入它工作正常:

电子邮件:克里斯
名称:空
电话:空
地址:空

当我使用真实输入时:

电子邮件:validEmailWants@someDomain.com
名称:空
电话:空
地址:空

发生故障。

[编辑]

但是,下面的输入可以正常工作:

电子邮件:chris@localhost.com
名称:空
电话:空
地址:空

因此不能是电子邮件地址中的特殊字符 导致问题。

我使用的是准备好的语句,所以我很确定我不需要“转义”电子邮件地址中的任何特殊字符。但我可能是错的。

方法如下:

public boolean setInfo(InfoBean p){

    ////  NOT USING THE PASSED IN INFOBEAN  //////////
    ////  BECAUSE I HAD TO ISOLATE THE BUG  //////////


    InfoBean proto = new InfoBean();

    //FAIL
    proto.setEmail("validEmailWants@someDomain.com"); 

    //PASS
    //proto.setEmail("chris@localhost.com");


    //PASS
    //proto.setEmail("validEmailHasWanted@someDomain.com");

    // PASS
    //proto.setEmail("validEmailWantsHasWanted@someDomain.com"); 



    System.out.println("EMAIL:"   + proto.getEmail());
    System.out.println("NAME:"    + proto.getName());
    System.out.println("PHONE:"   + proto.getPhoneNumber());
    System.out.println("ADDRESS:" + proto.getAddress());


    Connection c = null;

    try{  
        c = this.dataSource.getConnection();

        String s = "update user_account "
                +  "set name = ?, "
                +  "phone = ?, "
                +  "address = ?, "
                +  "image = ?"
                +  "where email = ?";

        PreparedStatement ps = c.prepareStatement(s);

        if(proto.getName() == null)
            ps.setString(1, ""); 
        else
            ps.setString(1, proto.getName());


        ps.setString(2, proto.getPhoneNumber());
        ps.setString(3, proto.getAddress());

        BufferedImage image = proto.getImage();
        if(image != null){
            ByteArrayOutputStream outStream = new ByteArrayOutputStream();
            ImageIO.write(image, "png", outStream);
            ps.setBlob(4, new ByteArrayInputStream(outStream.toByteArray()));
        }
        else{
            ps.setNull(4, java.sql.Types.BLOB);
        }

        ps.setString(5, proto.getEmail());

        ps.executeUpdate();

        ps.close();
        c.close();
        return true;
}
    catch(Exception e){
        System.out.println("\n\n SOME KIND OF EXCEPTION \n\n");
        e.printStackTrace();            
    }
    finally{
        //System.out.println("\n\n SOME KIND OF EXCEPTION \n\n");
        closeConnection(c);
    }
    return false;

}

数据库结构如下图所示。带下划线的单词是主键。钻石是关系集。圆圈是属性(列名)。正方形是桌子。

下面是 user_account 表的打印输出,用于比较通过和失败案例的特定属性值。

[更新]

我运行了一个测试用例,在其中将字段设置为 那不是 NULL,然后再次将后面设置为 NULL。 (这是在另一封电子邮件上),并且有 没问题。好像有什么 关于导致 失败。

【问题讨论】:

  • derbymysql?
  • 看起来像一个进程或查询 看起来像A lock could not be obtained within the time requested 表格
  • 是的,你是对的,但是,我只运行一个更新。我所做的唯一更改是 email = 'chris' 或 'validEmailWants@someDomain.com' 是否都是同一个表中的主键。
  • 您可以插入(而不是更新)包含电子邮件的数据吗?什么是数据库结构?你能引用准备好的陈述吗?您想添加更多标签,例如[mysql]?
  • @Yunnosch Derby != mysql,所以这不是一个相关的建议。

标签: java jdbc derby


【解决方案1】:

我发现了问题。我在一个单独的请求中登录用户(我忘记了),之后没有正确关闭连接。

(另一种方法中的简单connection.close() 解决了这个问题)。

【讨论】:

  • 这不是我的专业领域,所以我找错人了。但是,其中一位大师不会同意这个问题/答案对是明确且有用的吗? IE。请根据您的专业知识考虑投票。
  • 这是一个常见的错误。我相信这里已经解决了类似的案例。虽然这是一个很好的例子,说明为什么在完成后关闭数据库连接如此重要。 (对我来说是几个小时的折磨)。
猜你喜欢
  • 2011-04-17
  • 2020-08-12
  • 2013-12-08
  • 2012-12-03
  • 1970-01-01
  • 2012-04-08
  • 2023-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多