最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入Sqlite多線程入庫的問題

 更新時間:2013年05月16日 09:45:01   作者:  
本篇文章是對Sqlite多線程入庫的問題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
今天經(jīng)理給了我一個三十多M的sql文件,讓我測試數(shù)據(jù)定位的問題。按照慣例,我使用navicat for sqlite創(chuàng)建一個表,然后將sql文件導(dǎo)入。我然后去干其他事兒了,大約過了一個多小時,我想數(shù)據(jù)應(yīng)該導(dǎo)入的差不多了吧。我打開一看,汗,死在那兒了。我關(guān)掉軟件又重新導(dǎo)入一遍,還是那個德行。又得知經(jīng)理曾經(jīng)自己也導(dǎo)過,沒有成功??磥恚霉ぞ邔?dǎo)入的方法行不通了。

但是,想想就十多萬條數(shù)據(jù),就是十多萬條insert sql語句,有那么難嗎?于是,我想還是自己寫一個程序?qū)氚?。雖然中間也遇到一些小插曲,但是還是成功地把數(shù)據(jù)導(dǎo)進(jìn)去了。
程序的代碼如下:
復(fù)制代碼 代碼如下:

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;
    }
    //創(chuàng)建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
            }           
        }
        //最后執(zhí)行 剩余的sql
        if(batchSql.length()>0){
            System.out.println("finalSQL:"+batchSql);
            Runnable r=new SQLiteBatchHandler(batchSql);
            service.execute(r);
        };
        try {
            //關(guān)閉線程池
            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  執(zhí)行批量更新操作
     *        由于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("執(zhí)行失敗:"+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   主函數(shù)入口
     * */
    public  static  void main(String[] args) throws FileNotFoundException, IOException{
        BatchTool s=new BatchTool();
        s.readBatchSQL(new FileInputStream(new File("c:\\poi.sql")));
    }
}

相關(guān)文章

  • Spring-Boot中如何使用多線程處理任務(wù)方法

    Spring-Boot中如何使用多線程處理任務(wù)方法

    這篇文章主要介紹了Spring-Boot中如何使用多線程處理任務(wù)方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • org.slf4j.Logger中info()方法的使用詳解

    org.slf4j.Logger中info()方法的使用詳解

    這篇文章主要介紹了org.slf4j.Logger中info()方法的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java RateLimiter的限流詳解

    Java RateLimiter的限流詳解

    這篇文章主要為大家詳細(xì)介紹了Java RateLimiter的限流,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 詳解Spring的autowire-candidate設(shè)計

    詳解Spring的autowire-candidate設(shè)計

    現(xiàn)在的Spring應(yīng)用通常都是基于注解開發(fā),但是對Spring感興趣的同學(xué)可以借助Spring早期基于Xml配置的各種運用來加深對Spring框架內(nèi)部的理解和體會Spring框架的設(shè)計之妙。這篇文章我們就來談?wù)刋ml配置之default-autowire-candidates
    2021-06-06
  • Java實例項目零錢通的實現(xiàn)流程

    Java實例項目零錢通的實現(xiàn)流程

    本篇文章為你帶來Java的一個新手實戰(zhàn)項目,是一個零錢通系統(tǒng),項目來自于B站韓順平老師,非常適合新手入門練習(xí),感興趣的朋友快來看看吧
    2022-03-03
  • 最新評論

    昌邑市| 个旧市| 达孜县| 普兰店市| 翁牛特旗| 重庆市| 北京市| 丘北县| 娄烦县| 鄄城县| 威远县| 浪卡子县| 阳东县| 高淳县| 海林市| 策勒县| 伊金霍洛旗| 兴业县| 临高县| 浏阳市| 广宗县| 建昌县| 广元市| 内江市| 寿阳县| 准格尔旗| 城市| 治多县| 革吉县| 泗洪县| 莎车县| 洪江市| 包头市| 云梦县| 馆陶县| 安化县| 固原市| 克东县| 鄂州市| 昭觉县| 洱源县|