我使用JDBC来更新MySQL数据库中的一行:
pConnection.setAutoCommit(true);
PreparedStatement pstmt = pConnection.prepareStatement("update mg_build_queue " + //
"set buildsetid=?,locale=?,areacode=?,distversionid=?,platformid=?,version=?," + //
"priority=?,buildstatus=?,computername=?,buildoutput=?,started=?,finished=?, packageid=?, lockcounter=0 where buildid=?" //
);
pstmt.setInt(1, mBuildSet.getId());
pstmt.setString(2, Locale.localesToString(mLocales, ","));
pstmt.setString(3, mAreaCode.toString());
pstmt.setInt(4, mDistVersionId);
pstmt.setInt(5, mPlatform);
pstmt.setInt(6, mVersion);
pstmt.setLong(7, mPriority);
pstmt.setInt(8, mBuildStatus);
pstmt.setString(9, mComputerName);
pstmt.setString(10, mBuildOutput);
pstmt.setTimestamp(11, timeToTimestamp(mStarted));
pstmt.setTimestamp(12, timeToTimestamp(mFinished));
pstmt.setInt(13, mResultPackageId);
pstmt.setInt(14, mBuildId);
LOGGER.debug("Updating data for mg_build_queue: " + pstmt);
pstmt.execute();
LOGGER.debug("Updated " + pstmt.getUpdateCount() + " rows.");
这会产生以下输出:
2012-05-24 09:54:33,211 [Thread-1] DEBUG com.buildmaster.BuildQueueEntryImpl - Updating data for mg_build_queue: com.mysql.jdbc.JDBC4PreparedStatement@35e09eab: update mg_build_queue set buildsetid=201,locale='FR',areacode='XX',distversionid=95,platformid=4604,version=65807,priority=33652480,buildstatus=1,computername='MY_COMPUTER-C:\\BUILDS',buildoutput='',started='2012-05-24 09:54:33',finished='2012-05-24 19:45:27', packageid=0, lockcounter=0 where buildid=122418
2012-05-24 09:54:33,214 [Thread-1] DEBUG com.buildmaster.BuildQueueEntryImpl - Updated 1 rows.
我也不例外。如果我在DBVisualizer中查询条目,我只看到旧值。如果我在DBVisualizer中手动运行命令(从上面复制并粘贴),我可以看到更新的值。
为什么会这样?
答案 0 :(得分:0)
pConnection.commit()
来反映数据库中的更改
pConnection.setAutoCommit(false)
答案 1 :(得分:0)
问题似乎是DBVisualizer正在进行一些结果缓存。我使用DBVisualizer断开连接并重新连接,可以看到更新。感谢所有人的建议。
感谢Hans Bergsten on the DBVisualizer forums,以下是如何防止我的问题:
工具 - >工具属性 - >数据库 - > MySQL - >物理连接
将Transaction Isolation
更改为TRANSACTION_READ_COMMITTED
。
注意我还重新启动了我的MySQL数据库,我认为这不会影响,但值得一提。
答案 2 :(得分:0)
这可能是由MySQL的默认隔离级别“REPEATABLE READ”引起的。
如果您的JDBC语句已正确提交,则还需要在DBVisualizer中结束打开的事务。任何select语句都会启动一个事务,除非你终止,否则你不会看到其他事务所做的任何更改。
另一种选择是将默认隔离级别更改为READ COMMITTED,你应该没问题
答案 3 :(得分:0)
很奇怪,但是当我重新启动Eclipse
时,这个问题就停止了答案 4 :(得分:-1)
if(checkInputs() && txt_id.getText() == null)
{
String UpdateQuery = null;
PreparedStatement ps=null;
Connection con=getConnection();
if(ImgPath == null)
{
try {
UpdateQuery="UPDATE products SET name = ? , price = ? , add_date=? WHERE id=?";
ps=con.prepareStatement(UpdateQuery);
ps.setString(1, txt_name.getText());
ps.setString(2, txt_price.getText());
SimpleDateFormat dateformat=new SimpleDateFormat("dd-MM-yyyy");
String addDate=dateformat.format(btn_date.getDate());
ps.setString(3, addDate);
ps.setInt(4, Integer.parseInt(txt_id.getText()));
ps.executeUpdate();
} catch (SQLException ex) {
Logger.getLogger(Main_window.class.getName()).log(Level.SEVERE, null, ex);
}
}
else
{
try {
//update with image
InputStream img=new FileInputStream(new File(ImgPath));
UpdateQuery="UPDATE products SET name = ? , price = ? ,add_date=? , image = ? WHERE id=?";
ps=con.prepareStatement(UpdateQuery);
ps.setString(1, txt_name.getText());
ps.setString(2, txt_price.getText());
SimpleDateFormat dateformat=new SimpleDateFormat("dd-MM-yyyy");
String addDate=dateformat.format(btn_date.getDate());
ps.setString(3, addDate);
ps.setBlob(4, img);
ps.setInt(5, Integer.parseInt(txt_id.getText()));
ps.executeUpdate();
} catch (FileNotFoundException | SQLException ex)
{
Logger.getLogger(Main_window.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
else
{
JOptionPane.showMessageDialog(null,"One or more fields are empty or wrong");
}