jdbc百萬數據批處理遇到的問題和處理

jopen 10年前發布 | 44K 次閱讀 JDBC Java開發

首先總結哈

1 關于PreparedStatement 和statement

更新和插入 一定要用PreparedStatement 防止字段帶有‘’ ,即sql注入  

ex:

StringBuffer sql = new StringBuffer("UPDATE CH_T_SONG_INFO");

sql.append("  set  " );
sql.append(" SEQ=? , SONG_ID=? , CONTENT_NAME=? ,SINGER_ID=?, SINGER=? where SONG_ID='"+ chTMusicSourceInfo.getSongId() + "' and SINGER_ID='" + chTMusicSourceInfo.getSingerId()+ "' and status<>'2'" );

Connection conn = JdbcUtil.getConnection();
        ps = conn.prepareStatement(sql.toString());
ps.setObject(1, chTMusicSourceInfo.getSeq());
ps.setObject(2, chTMusicSourceInfo.getSongId());
ps.setObject(3, chTMusicSourceInfo.getContentName());
ps.setObject(4, chTMusicSourceInfo.getSingerId());

               ps.executeUpdate();

 


查詢用statement

ex:

Statement stm = JdbcUtil.getStm();
ResultSet rs=stm.executeQuery("select SEQ_SONG_ALBUM_INFO.nextval from dual");
if (rs.next())
return rs.getLong(1);

 

推薦用PreparedStatement

 

 

2 出現游標超出問題是因為執行了sql語句,資源沒關閉,

Connect可以執行一個循環時在清理,但是必須得清理,不然也會出現游標問題,而像PreparedStatement 和statement 用一次 必須關一次 否則超出游標


 

</h3>

3 批處理(一定要用事務)

最大一次更新最好不要超過1萬
 static void createBatch() throws SQLException {  
  Connection conn = null;  
  PreparedStatement ps = null;  
  ResultSet rs = null;  
  try {  
   conn = JdbcUtils.getConnection();  
  conn setAutoCommit(false);
   String sql = "insert into person(pid,name,birthday, money) values (?,?, ?, ?) ";  
   ps = conn.prepareStatement(sql);  
   for (int i = 0; i < 100; i++) {  
    ps.setInt(1, 3000+i);  
    ps.setString(2, "person" + i);  
    ps.setDate(3, new Date(System.currentTimeMillis()));  
    ps.setFloat(4, 100f + i);  
    ps.addBatch();  
   }  
   int[] is = ps.executeBatch();  
  JdbcUtil.getConnection().commit();
  } finally {  
   JdbcUtils.free(rs, ps, conn);  
  }  
 }  
} 
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!