我们应该使用insertRow()和acceptChanges()吗?

时间:2011-07-13 19:52:14

标签: java jdbc resultset cachedrowset

以下是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 个答案:

答案 0 :(得分:2)

当您准备好将更改传播到基础数据源时,可以调用acceptChanges()。但是,如果您正在进行大量更新/插入(对于多行),则应在完成所有acceptChanges()updateRow()后调用insertRow()。原因是当您调用acceptChanges()时,您建立了与数据库的实际连接,这通常很昂贵。因此,每次在每行的insertRow / updateRow之后调用它都不会有效。

在代码中,我会在while块结束后放置acceptChanges()。原因就是我上面提到的 - 在while块中对cacheResult进行了所有更新后,只进行一次数据库连接。