6

以下に示すように、DBManagerクラスを作成しました

public class DBManager {


      public static String DRIVER = "oracle.jdbc.driver.OracleDriver";
      public static String URL = "jdbc:oracle:thin:@//localhost:1521/DB";
      public static String USERNAME = "afsweb";
      public static String PASSWORD = "afsweb";
      public static String DOCDBUSERNAME = "docdb";
      public static String DOCDBPASSWORD = "docdb";
      public static int PORT = 1521;

    //static Logger log = Logger.getLogger(ExcelDBManager.class.getName());
    public static Connection getConnection(String url ,String username, String password){
    try {
        Class.forName(DRIVER);
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    Connection con = null;
    try {
        con = DriverManager.getConnection(url,username,password);
        con.setAutoCommit(false);
        } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    }
    return con;
}

そして、テーブル内の行を切り捨てるメソッドがあります

public static void truncate() throws SQLException{
        conn = DBManager.getConnection(DBManager.URL, DBManager.USERNAME, DBManager.PASSWORD);
        System.out.println(conn.getAutoCommit()  +"");
        Statement pstmnt = null;
        ResultSet rs = null;
        try{    
            pstmnt = conn.createStatement();
            pstmnt.executeQuery("truncate table bd_vehicles_temp_1");
            System.out.println("Query Executed");
        }
        catch(SQLException e){
            e.printStackTrace();
        }
        finally{
            try{
            if(rs !=null){
                rs.close();
            }
            if(pstmnt != null){
                pstmnt.close();
            }
            if(conn != null){
                conn.close();
            }
            }
            catch(SQLException e)
            {
                e.printStackTrace();
            }
        }
    }

今、私は truncate() メソッド内に conn.commit を書いていません。また、Autocommit を false に設定しました。それでも変更はデータベースに反映されます。

上記のメソッドを実行すると、出力が次のようになります

false
Query Executed

これは、接続の自動コミット モードが false であることを意味します。truncate メソッドによる変更はデータベースに反映されます。考えられる理由は何ですか?? Oracle データベースを使用しています。

前もって感謝します !

4

4 に答える 4

4

TRUNCATE TABLE基本的に、通常の方法でのコミット/ロールバックは許可されていません。このドキュメントに従って:

Truncate は DDL であるため、動作する前に COMMIT を発行し、その後に別の COMMIT を発行するため、トランザクションのロールバックは不可能です。

これをトランザクションの一部として実行する場合は、代わりに DML を使用します (通常のDELETE FROM ...ステートメントなど)。

于 2013-08-14T13:58:52.947 に答える
2

自動コミットの動作は、使用する基礎となるデータベースによって異なります。残念ながら、あなたの場合、OracleのJDBCドライバーはデフォルトで close() にコミットします。

于 2013-08-14T13:58:53.760 に答える