0

0

深入Sqlite多线程入库的问题

黄舟

黄舟

发布时间:2016-12-19 14:44:47

|

2178人浏览过

|

来源于php中文网

原创

今天经理给了我一个三十多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);
getConnection().close();
} 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();
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"))); } }

 以上就是深入sqlite多线程入库的问题的内容,更多相关内容请关注php中文网(www.php.cn)! 

ecshop
ecshop

本版本全面兼容php5.6+,并且修复了许多官方程序的低级代码bug。在apache 2.4.17+php5.6.15环境下测试通过,人格保证无毒无木马,仅仅是一名ecshop热爱者心血来潮之作。ecshop编译更新日志:1、加入最新官方补丁。2、修改数据库连接底层为mysqli, 现在完美无缺了。3、再次对所有代码进行细节修复。4、adminers更新至1.1.2, 在线管理数据库的神器。5、测

下载

相关专题

更多
Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

11

2026.01.12

c++主流开发框架汇总
c++主流开发框架汇总

本专题整合了c++开发框架推荐,阅读专题下面的文章了解更多详细内容。

106

2026.01.09

c++框架学习教程汇总
c++框架学习教程汇总

本专题整合了c++框架学习教程汇总,阅读专题下面的文章了解更多详细内容。

64

2026.01.09

学python好用的网站推荐
学python好用的网站推荐

本专题整合了python学习教程汇总,阅读专题下面的文章了解更多详细内容。

139

2026.01.09

学python网站汇总
学python网站汇总

本专题整合了学python网站汇总,阅读专题下面的文章了解更多详细内容。

13

2026.01.09

python学习网站
python学习网站

本专题整合了python学习相关推荐汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.09

俄罗斯手机浏览器地址汇总
俄罗斯手机浏览器地址汇总

汇总俄罗斯Yandex手机浏览器官方网址入口,涵盖国际版与俄语版,适配移动端访问,一键直达搜索、地图、新闻等核心服务。

93

2026.01.09

漫蛙稳定版地址大全
漫蛙稳定版地址大全

漫蛙稳定版地址大全汇总最新可用入口,包含漫蛙manwa漫画防走失官网链接,确保用户随时畅读海量正版漫画资源,建议收藏备用,避免因域名变动无法访问。

480

2026.01.09

php学习网站大全
php学习网站大全

精选多个优质PHP入门学习网站,涵盖教程、实战与文档,适合零基础到进阶开发者,助你高效掌握PHP编程。

52

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQLite参考手册
SQLite参考手册

共0课时 | 0人学习

SQLite经典教程
SQLite经典教程

共51课时 | 22.8万人学习

Java 教程
Java 教程

共578课时 | 45.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号