1. 程式人生 > >關於mysql百萬級數據的插入和刪除

關於mysql百萬級數據的插入和刪除

只有一個 筆記 style linu xxx 程序 back exceptio ace

這幾天有個朋友讓我幫他優化mysql百萬級操作db的事。於是我就答應了……。優化完個人做個筆記。給大家一個參考……如果有更好的方法,[email protected]

程序員不想做解釋直接上代碼:

public boolean test(String filePath) throws Exception{
        String sql = "LOAD DATA INFILE ‘"+filePath+"‘ REPLACE INTO TABLE t_table FIELDS TERMINATED BY ‘\r\n‘ lines terminated by ‘\r\n‘ (terminal_id)"; 
        PreparedStatement  pstmt  
=jdbcTemplate.getDataSource().getConnection().prepareStatement(sql); pstmt.execute(); return false; }

表裏面也只有一個字段,如果文件有要插入多個字段就要以文件中的分隔符來分隔,註意點 如不懂可以網上查查 LOAD DATA INFILE的用法…… (本文不是給伸手黨準備的,見諒)

這個是springmvc上傳文件上後臺。然後後處理的controller類中的代碼如果下

@RequestMapping(value = "/batchAdd", method = RequestMethod.POST)
    @ResponseBody
    
public void batchAdd(@RequestParam(value="addBatchFile",required = false) MultipartFile uploadfile){ String msg = "批量導入出錯"; try { long start = System.currentTimeMillis(); System.out.println(start); String name="file"+System.currentTimeMillis()+".txt"; File file
= new File(name); uploadfile.transferTo(file); //此處要註意windows和linux的File.separator不一樣…… 這裏還要測一下的 service.test(file.getAbsolutePath().replaceAll("\\\\", "//")); long end = System.currentTimeMillis(); System.out.println(end); System.out.println("共花費" +(end-start)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); }
    ........ }

這個樣插入mysql的500w之內大概3分鐘之內能完成。

==================優美的分隔線==========================================

百萬級的刪除

        @RequestMapping(value = "/batchDelete", method = RequestMethod.POST)
    @ResponseBody
    public void batchDelete(@RequestParam(value="deleteBatchFile",required = false) MultipartFile uploadfile){
    
    List<String> list = new ArrayList<String>();
        try {
        
                CommonsMultipartFile cf= (CommonsMultipartFile)uploadfile; 
                DiskFileItem fi = (DiskFileItem)cf.getFileItem(); 

                File f = fi.getStoreLocation();
                List<String> data =FileUtils.readLines(f);
                service.updateBatchDel("delete from t_table where terminal_id= ?",data);
                long end = System.currentTimeMillis();
                System.out.println(end);
                System.out.println(end-start);
                        
                code = 0;
        }catch (Exception e){
        }
        return "xxxxxxxx";
    }

service 的代碼如下

 public boolean updateBatchDel(String sql,List<String> data){ 
         boolean flag = false; 
         PreparedStatement pstmt = null;
         Connection con = null;
         try {  
             con = jdbcTemplate.getDataSource().getConnection();   
                con.setAutoCommit(false);   
                pstmt = con.prepareStatement(sql);   
                for(int i =0 ;i<data.size();i++){    
                    pstmt.setString(1,data.get(i).trim());   
                    pstmt.addBatch();                  
                }    
                System.out.println("------");
                pstmt.executeBatch(); //批量執行     
                con.commit();//提交事務    
                flag = true;   
            } catch (SQLException e) {   
                try {   
                    con.rollback(); //進行事務回滾    
                } catch (SQLException ex) {  
                    ex.printStackTrace(); 
                }    
            }finally {   
                try {
                    pstmt.close();
                    con.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }  
            }  
            return flag; 
    } 

這樣刪除百萬級的數據也只在2分鐘之內。

關於mysql百萬級數據的插入和刪除