为什么我的JDBC的准备没有更新的数据库语句更新?(Why is my JDBC prepared

2019-09-17 12:07发布

我使用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工具(复制并从上方粘贴)运行命令,我可以看到的更新值。

这究竟是为什么?

Answer 1:

调用pConnection.commit()是必须的,以反映数据库的变化,如果你明确地设置

pConnection.setAutoCommit(false)



Answer 2:

这个问题似乎是,DBVisualizer中做一些结果缓存。 我断开,使用DBVisualizer中,可以看到更新重新连接。 感谢所有为他们的建议。

多亏了汉斯·伯格斯滕在DBVisualizer中的论坛 ,在这里是如何防止我的问题:

工具 - >工具属性 - >数据库 - > MySQL的 - >物理连接

更改Transaction IsolationTRANSACTION_READ_COMMITTED

注:我也重新启动我的MySQL数据库,我不认为受影响的事情,但值得一提的。



Answer 3:

这可能是由于MySQL的默认隔离级别是“可重复读”引起的。

前提是你的JDBC声明承诺正常,你还需要结束DBVisualizer工具打开的事务。 任何select语句启动一个事务,除非你终止,你不会看到其他事务进行任何更改。

另一种选择是更改默认的隔离级别为READ提交,你应该罚款



Answer 4:

奇怪,但这个问题停止,当我重新启动Eclipse的



Answer 5:

    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");

    }


文章来源: Why is my JDBC prepared statement update not updating the database?