Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 插入操作后CachedRowset acceptChanges不工作_Java_Mysql_Database_Jakarta Ee_Jdbc - Fatal编程技术网

Java 插入操作后CachedRowset acceptChanges不工作

Java 插入操作后CachedRowset acceptChanges不工作,java,mysql,database,jakarta-ee,jdbc,Java,Mysql,Database,Jakarta Ee,Jdbc,我使用的是MySQL数据库,我有一个表Employee,有两列:Id(Int;主键)和Name(字符串)。我已经编写了一些代码,在Employee表中插入一行,但是acceptChanges不起作用,代码在acceptChanges处停止。代码如下: import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import javax.sql.rowset.CachedRowS

我使用的是MySQL数据库,我有一个表
Employee
,有两列:
Id
(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();
        }
    }
}

您会发现打印出有关异常的所有信息很有帮助。如果捕获的是SQLException而不是泛型异常(通常,您应该捕获特定的异常),则可以访问更多信息,包括

我相信在这种情况下,您会发现这是一个与连接设置为自动提交更改相关的错误。我相信当您初始化并执行其命令时,CachedRowSet正在建立自己的连接。它不知道您创建的连接“c”,直到您将其传递给acceptChanges。我认为,这意味着crs的连接在这段时间内自动提交设置为true

尝试将?relaxAutoCommit=true添加到url字符串中,如下所示:

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

您无需向其传递连接即可接受更改,因为它有自己的连接。事实上,您不需要创建另一个连接,它将一直保持打开状态。CachedRowSet的全部要点是,在进行更改时,您不会保持连接处于打开状态。

语句
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

有关更多信息,请访问:

非常感谢。成功了。但我不明白为什么需要这样的声明。如果你不介意的话,你能解释一下这句话的意义吗?当你调用moveToInsertRow时,你不能接受更改,你必须回到记忆中的位置。调用方法moveToInsertRow时,方法moveToCurrentRow将光标移动到光标所在的行。例如,您可以在迭代行集时插入行:while(crs.next()){/*在此处插入行*/}。因此,如果不移回当前行,则无法继续,因为要插入的行不是行集的一部分。调用moveToInsertRow类似于进入一些特殊的房间来做某事,而您必须离开房间才能继续迭代。非常感谢Dmytro。这就解释了一切:)它不起作用了。您能修改我的代码以准确反映它的工作方式吗?可能是我做了些不正确的事。