因為工作需求,需要向ORACLE數據插入大量的數據,進而選擇了開啟事務的手動管理,進行大量的數據插入,然而在此就遇到了一個坑,以前經開啟mysql的事務管理進行插入數據,照搬mysql的方法有點行不通,每次插入數據只有299條能插入進去,一開始以為代碼有問題,仔細檢查發現代碼沒有問題,從網上查找原因,使用以下方法能夠在JDBC中開啟ORACLE事務管理,進行批量的插入數據。親測可用:
//向***插入組織數據 public void insertZZ(JSONArray ja) throws SQLException { //連接中間庫 String user = "****"; String password = "*****"; String url = "jdbc:oracle:thin:@ip:port/SID"; String driver = "oracle.jdbc.driver.OracleDriver"; Connection con = null; //一個封裝了TCP長連接 的 數據庫長連接對象 // Statement stmt = null; //一個封裝和管理SQL語句的java對象 PreparedStatement preparedStatement = null; //插入數據 try { Class.forName(driver); con = DriverManager.getConnection(url, user, password); //將事務模式設置為手動提交事務: // con.setAutoCommit(false); //設置事務的隔離級別。 // con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); //運行插入操作 int j = 2; String sql = "INSERT INTO IUFO_UNIT_INFO(DR,LEVEL_CODE,TS,UNIT_CODE,UNIT_ID,UNIT_NAME,UNIT_TYPE) \n" + "values(?,?,?,?,?,?,?)"; preparedStatement = con.prepareStatement(sql); for (int i = 0; i < ja.size(); i++) {
con.setAutoCommit(false)//開啟事務手動提交 JSONObject jo = ja.getJSONObject(i); String dr = (String) jo.get("dr"); String level_code = (String) jo.get("level_code"); String ts = (String) jo.get("ts"); String unit_code = (String) jo.get("code"); String unit_id = (String) jo.get("unit_id"); String unit_name = (String) jo.get("name"); String unit_type = (String) jo.get("unit_type"); // String sql = "INSERT INTO IUFO_UNIT_INFO(DR,LEVEL_CODE,TS,UNIT_CODE,UNIT_ID,UNIT_NAME,UNIT_TYPE) \n" + // "values('"+dr+"','"+level_code+"','"+ts+"','"+unit_code+"','"+unit_id+"','"+unit_name+"','"+unit_type+"')"; preparedStatement.setString(1,dr); preparedStatement.setString(2,level_code); preparedStatement.setString(3,ts); preparedStatement.setString(4,unit_code); preparedStatement.setString(5,unit_id); preparedStatement.setString(6,unit_name); preparedStatement.setString(7,unit_type); preparedStatement.addBatch(); // int resultSet = preparedStatement.executeUpdate(); // System.out.println(j); } preparedStatement.executeBatch(); //提交事務 con.commit(); } catch (Exception e) { // 若事務發生異常,回滾事務 con.rollback(); }finally {
//開啟事務自動提交 con.setAutoCommit(true); try { if (preparedStatement != null) { preparedStatement.close(); } if (con != null) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } }