Java 插入操作后CachedRowset acceptChanges不工作
我使用的是MySQL数据库,我有一个表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
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。这就解释了一切:)它不起作用了。您能修改我的代码以准确反映它的工作方式吗?可能是我做了些不正确的事。