【发布时间】: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。 (这是在另一封电子邮件上),并且有 没问题。好像有什么 关于导致 失败。
【问题讨论】:
-
derby或mysql? -
看起来像一个进程或查询 看起来像
A lock could not be obtained within the time requested表格 -
是的,你是对的,但是,我只运行一个更新。我所做的唯一更改是 email = 'chris' 或 'validEmailWants@someDomain.com' 是否都是同一个表中的主键。
-
您可以插入(而不是更新)包含电子邮件的数据吗?什么是数据库结构?你能引用准备好的陈述吗?您想添加更多标签,例如[mysql]?
-
@Yunnosch Derby != mysql,所以这不是一个相关的建议。