我看了这些问题,我的问题对他们来说是独一无二的。
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;
}
数据库结构如下所示。带下划线的单词是主键。钻石是关系集。圆圈是属性(列名称)。正方形是表格。
下面是user_account表的打印输出,用于比较传递和失败案例的特定属性值。
[UPDATE]
我运行了一个测试用例,我将字段设置为某些内容 那是非NULL,然后再次设置为NULL。 (这是在另一封电子邮件上),而且有 没问题。似乎有些东西 关于导致该特定的电子邮件 故障。