无法使用电子邮件地址作为Derby

时间:2017-03-28 06:58:24

标签: java jdbc derby

我看了这些问题,我的问题对他们来说是独一无二的。

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: 在请求的时间内无法获得锁定

对于此输入,它可以正常工作:

EMAIL:克里斯
名称:空
电话:空
地址:null

当我使用真实输入时:

EMAIL:validEmailWants@someDomain.com
名称:空
电话:空
地址:null

失败发生。

[编辑]

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

EMAIL:chris@localhost.com
名称:空
电话:空
地址:null

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

我正在使用准备好的声明,所以我很确定我不需要“逃避”电子邮件地址中的任何特殊字符。但我可能是错的。

方法如下:

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;

}

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

enter image description here

下面是user_account表的打印输出,用于比较传递和失败案例的特定属性值。 enter image description here

[UPDATE]

我运行了一个测试用例,我将字段设置为某些内容 那是非NULL,然后再次设置为NULL。 (这是在另一封电子邮件上),而且有 没问题。似乎有些东西 关于导致该特定的电子邮件 故障。

1 个答案:

答案 0 :(得分:0)

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

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