我们应该将 insertRow() 与 acceptChanges() 一起使用吗?
Posted
技术标签:
【中文标题】我们应该将 insertRow() 与 acceptChanges() 一起使用吗?【英文标题】:Should we use insertRow() with acceptChanges()? 【发布时间】:2011-07-13 19:52:14 【问题描述】:下面是java中的示例代码:
try
/* create connection */
Connection conn = DriverManager.getConnection(url, username, password);
Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
/* create a CachedRowSet */
CachedRowSet cachedResult = new com.sun.rowset.CachedRowSetImpl();
/* set connection information */
cachedResult.setUrl(url);
cachedResult.setUsername(username);
cachedResult.setPassword(password);
ResultSet result = stmt.executeQuery("SELECT * FROM tbl");
/* populate CachedRowSet */
cachedResult.populate(result);
/* close connection */
result.close();
stmt.close();
conn.close();
/* now we edit CachedRowSet */
while (cachedResult.next())
if (cachedResult.getInt("id") == 12)
cachedResult.moveToInsertRow();
/* use some updateXXX() functions */
cachedResult.insertRow();
cachedResult.moveToCurrentRow();
catch (SQLException e)
e.printStackTrace();
现在我的问题是:
1.我应该使用insertRow()
吗?还是我应该改用acceptChanges()
?或者两者兼而有之?
2. 这段代码中acceptChanges()
应该放在哪里?
【问题讨论】:
【参考方案1】:当您准备好将更改传播到基础数据源时,您可以调用 acceptChanges()
。但是,如果您正在执行许多更新/插入(针对多行),那么您应该在完成所有 updateRow()
和 insertRow()
之后调用 acceptChanges()
。原因是当您调用acceptChanges()
时,您建立了与数据库的实际连接,这通常会很昂贵。所以每次在每次insertRow/updateRow后调用多行效率不高。
在您的代码中,我会在 while 块结束后添加 acceptChanges()
。原因就是我上面提到的 - 在 while 块中对 cacheResult 进行所有更新后,只建立一次数据库连接。
【讨论】:
那么为什么insertRow()
的javadoc 说将插入行的内容插入到这个ResultSet 对象和数据库中?如果我们不调用acceptChanges
,它实际上不会将它放入数据库,对吗?它只会将其插入行集中。 updateRow
也是如此。以上是关于我们应该将 insertRow() 与 acceptChanges() 一起使用吗?的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的类型错误:无法读取未定义的属性“insertRow”
带有字符串格式json的jeasyui datagrid insertrow
QTreeView & QAbstractItemModel & insertRow
ResultSet.insertRow() VS Statement.executeUpdate("INSERT INTO...")。哪个更好用?