我有以下Java 7代码来创建CachedRowSet

CachedRowSet crs = RowSetProvider.newFactory().createCachedRowSet();


有没有办法从CachedRowSet对象获取Connection对象?我想在调用autoCommit上的acceptChanges()之前在Connection对象上将CachedRowSet设置为false,因为调用acceptChanges()时出现以下异常。

javax.sql.rowset.spi.SyncProviderException: Can't call commit when autocommit=true


COMMIT_ON_ACCEPT_CHANGES上有一个CachedRowSet字段,但已弃用。

最佳答案

好吧,我花了一些时间才重现此问题。通过autoCommitConnectionconn.setAutoCommit(false);值设置为false解决了此问题。

以下是示例工作程序:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.sql.rowset.CachedRowSet;
import javax.sql.rowset.RowSetProvider;

public class CRSetChecker {
    public static void main(String[] args) {
        String connectString = "jdbc:oracle:thin:scott/tiger" +
                "@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)" +
                "(HOST=myorahost)(PORT=5521))" +
                "(CONNECT_DATA=(SID=myorasid)))";

        //Get DB connection
        Connection conn = (new CRSet()).getConnection(connectString);
        if (conn == null) {
            System.out.println("Connection failed");

            System.exit(0);
        } else {
            System.out.println("Connection established successfully!");

            try {
                CachedRowSet crs =
                              RowSetProvider.newFactory().createCachedRowSet();
                String query="select ename from emp";
                crs.setCommand(query);
                crs.execute(conn);
                //Set auto commit false
                conn.setAutoCommit(false);
                int count = 0;
                while(crs.next()){
                    String name = crs.getString(1);
                    count++;
                    System.out.println(name);
                    if(count==1){
                        crs.updateString(1, "COOPER");
                        crs.updateRow();
                        crs.acceptChanges(conn);
                        System.out.println("After update:"+crs.getString(1));
                    }
                }
                conn.close();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }
    }

    public Connection getConnection(String connectString)
      {
        Connection con = null;
        try {
          try {
            Class.forName("oracle.jdbc.OracleDriver");
          } catch (ClassNotFoundException e) {
            e.printStackTrace();
          }

          con = DriverManager.getConnection(connectString);
        } catch (SQLException ex) {
          ex.printStackTrace();
        }

        return con;
      }
}

08-27 23:32