插入操作后CachedRowset acceptChanges不起作用

时间:2014-09-06 22:18:23

标签: java mysql database java-ee jdbc

我正在使用MySQL数据库,我有一个包含2列的表EmployeeId(Int;主键)和Name(字符串)。我编写了一些代码来在Employee表中插入一行,但acceptChanges无效,代码在acceptChanges处停止。代码如下:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetFactory;
import javax.sql.rowset.RowSetProvider;

public class InsertSynchronizer {

    static CachedRowSet crs = null;

    public static void main(String[] args) {

        try {
            Class.forName("com.mysql.jdbc.Driver");
            Connection c = DriverManager.getConnection("jdbc:mysql://localhost:3306/", "root", "");
            c.setAutoCommit(false);
            RowSetFactory myRowSetFactory = null;
            myRowSetFactory = RowSetProvider.newFactory();
            crs = myRowSetFactory.createCachedRowSet();
            crs.setUrl("jdbc:mysql://localhost:3306/test");
            crs.setUsername("root");
            crs.setPassword("");
            crs.setConcurrency(CachedRowSet.CONCUR_UPDATABLE);
            crs.setCommand("select * from employee");
            crs.execute();
            while (crs.next()) {
                System.out.println(crs.getString("Name"));
            }

            // Inserting rows
            crs.moveToInsertRow();
            crs.updateInt("Id", 5);
            crs.updateString("Name", "E");
            crs.insertRow();

            //Thread.sleep(60000);
            crs.acceptChanges(c); // Updating Data Sources

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

必须在crs.moveToCurrentRow()之后和crs.insertRow()之前添加声明crs.acceptChanges(c)

例如:

 // Inserting rows
crs.moveToInsertRow();
crs.updateInt("Id", 5);
crs.updateString("Name", "E");
crs.insertRow();
crs.moveToCurrentRow(); // NEW STATEMENT
crs.acceptChanges(c); // Updating Data Sources

有关详细信息,请访问:http://docs.oracle.com/javase/tutorial/jdbc/basics/cachedrowset.html#inserting-and-deleting-rows

答案 1 :(得分:0)

您会发现打印出有关异常的所有信息会很有帮助。如果您捕获SQLException而不是通用Exception(通常您应该捕获特定的Exceptions),您将可以访问更多信息,包括SQL state and error codes

我相信在这种情况下,您会发现与连接设置为自动提交更改这一事实有关。我相信CachedRowSet在初始化和执行命令时会创建自己的Connection。它不知道Connection" c"您已创建,直到将其传递给acceptChanges。我认为,这意味着crs'在此期间,connection将autoCommit设置为true。

尝试添加?relaxAutoCommit = true到您的网址字符串,如下所示:

crs.setUrl("jdbc:mysql://localhost:3306/test?relaxAutoCommit=true");

您不需要传递Connection以接受更改,因为它将拥有自己的更改。实际上,您不需要创建另一个Connection,它将始终保持打开状态。 CachedRowSet的重点在于,在进行更改时不要保持连接处于打开状态。