我们应该将 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...")。哪个更好用?

bootstrap table insertRow,怎样始终在表格最后加一行

使用json数据动态创建表格2(多次绘制第一次简化 var tr=tbody.insertRow();)