程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 深刻Sqlite多線程入庫的成績

深刻Sqlite多線程入庫的成績

編輯:關於JAVA

深刻Sqlite多線程入庫的成績。本站提示廣大學習愛好者:(深刻Sqlite多線程入庫的成績)文章只能為提供參考,不一定能成為您想要的結果。以下是深刻Sqlite多線程入庫的成績正文


明天司理給了我一個三十多M的sql文件,讓我測試數據定位的成績。依照通例,我應用navicat for sqlite創立一個表,然後將sql文件導入。我然後去干其他事兒了,年夜約過了一個多小時,我想數據應當導入的差不多了吧。我翻開一看,汗,逝世在那兒了。我關失落軟件又從新導入一遍,照樣誰人德性。又得知司理已經本身也導過,沒有勝利。看來,用對象導入的辦法行欠亨了。

然則,想一想就十多萬條數據,就是十多萬條insert sql語句,有那末難嗎?因而,我想照樣本身寫一個法式導入吧。固然中央也碰到一些小插曲,然則照樣勝利地把數據導出來了。
法式的代碼以下:

package com.geoway.pad.common.tool;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
 * @author likehua
 * @note   SQLite建庫和批量入庫
 * */
public class BatchTool{
    //ddl  
    private static String ddl="CREATE TABLE IF NOT EXISTS pbeijing_point (OBJECTID  INTEGER,NAME  TEXT,ADDRESS  TEXT,PHONE TEXT,FAX  TEXT,TYPE TEXT,CITYCODE TEXT,URL  TEXT,EMAIL  TEXT,NAME2  TEXT,X  INTEGER,Y  INTEGER)";
    Connection jCon=null;
    //get connection
    public synchronized Connection  getConnection(){    
        if(jCon==null){
//          json=
                Statement state=null;
                try {
                    Class.forName("org.sqlite.JDBC");
                    jCon=DriverManager.getConnection("jdbc:sqlite:c:\\newD.db");
                    state=jCon.createStatement();
                    state.executeUpdate(ddl);                   
                } catch (SQLException e) {
                    e.printStackTrace();
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                }
        }
        return jCon;
    }
    //創立500個線程
    ExecutorService  service=Executors.newFixedThreadPool(500);
    //讀取sql文件     每五百個insert 語句由一個線程批量操作  
    public  void   readBatchSQL(InputStream is) throws IOException{
        BufferedReader bufferReader=new BufferedReader(new InputStreamReader(is,"UTF-8"));
        String line;
        String one="";
        int tag=0;
        String  batchSql="";
        while((line=bufferReader.readLine())!=null){
            one+=line;
            if(one.indexOf(";")!=-1){
                batchSql+=one;
                one="";//reset
                tag++;
            };
            //相符前提   開拓一個線程
            if(tag!=0&&tag/500!=0){
                service.execute(new SQLiteBatchHandler(batchSql));
                batchSql="";//reset
                tag=0;//reset
            }           
        }
        //最初履行 殘剩的sql
        if(batchSql.length()>0){
            System.out.println("finalSQL:"+batchSql);
            Runnable r=new SQLiteBatchHandler(batchSql);
            service.execute(r);
        };
        try {
            //封閉線程池
            this.service.shutdown();            
        this.service.awaitTermination(1, TimeUnit.HOURS);<BR>                getConnection().close();<BR>       } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (SQLException e) {
            e.printStackTrace();
        }

    };
    /**
     * @note  朋分sql
     * */
    private static String[] splitSQL(String batchSQl){
        if(batchSQl!=null){
            return batchSQl.split(";");
        };
        return null;
    }
    /**
     * @note  履行批量更新操作
     *        因為connection.comit 操作時   假如存在 statement沒有close  就會報錯   是以將此辦法加上同步    。
     * */
    private  synchronized  void  exucteUpdate(String batch){
        Statement ste=null;
        Connection con=null;
        try{
        con=getConnection();
        con.setAutoCommit(false);
        ste=con.createStatement();
        String[] sqls=this.splitSQL(batch);
        for(String sql:sqls){
            if(sql!=null){
                ste.addBatch(sql);
            };
        };
        ste.executeBatch();<BR>                ste.close();
        con.commit();//提交       
        }catch(Exception e){
            e.printStackTrace();
            System.out.println("履行掉敗:"+batch);
            try {
                con.rollback();//回滾
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
        }finally{
            if(ste!=null){
                try {
                    ste.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    /**
     * @author likehua
     * @note   入庫線程
     * */
    private  class SQLiteBatchHandler implements Runnable{
        private String batch;
        public  SQLiteBatchHandler(String sql){
            this.batch=sql;
        };
        @SuppressWarnings("static-access")
        @Override
        public void run() {         
            try {
                Thread.currentThread().sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if(this.batch.length()>0){
                exucteUpdate(batch);

            };

        }       
    }
    /**
     * @author likehua
     * @note   主函數進口
     * */
    public  static  void main(String[] args) throws FileNotFoundException, IOException{
        BatchTool s=new BatchTool();
        s.readBatchSQL(new FileInputStream(new File("c:\\poi.sql")));
    }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved