찾다
Javajava지도 시간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"))); 
    } 
}

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


성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
如何使用PHP和SQLite创建用户登录系统如何使用PHP和SQLite创建用户登录系统Jul 28, 2023 pm 09:27 PM

如何使用PHP和SQLite创建用户登录系统在当今互联网时代,用户登录系统是许多网站和应用程序的基本功能之一。本文将介绍如何使用PHP和SQLite创建一个简单而强大的用户登录系统。SQLite是一个嵌入式数据库引擎,它是一个零配置的、服务器端的数据库引擎。PHP是一种流行的服务器端脚本语言,它与SQLite结合使用可以创建出灵活且高效的用户登录系统。通过以

使用PHP和SQLite实现用户权限和访问控制使用PHP和SQLite实现用户权限和访问控制Jul 29, 2023 pm 02:33 PM

使用PHP和SQLite实现用户权限和访问控制在现代的web应用程序中,用户权限和访问控制是非常重要的一部分。通过正确的权限管理,可以确保只有经过授权的用户能够访问特定的页面和功能。在本文中,我们将学习如何使用PHP和SQLite来实现基本的用户权限和访问控制。首先,我们需要创建一个SQLite数据库来存储用户和其权限的信息。下面是简单的用户表和权限表的结构

PHP和SQLite:如何进行数据压缩和加密PHP和SQLite:如何进行数据压缩和加密Jul 29, 2023 am 08:36 AM

PHP和SQLite:如何进行数据压缩和加密在许多Web应用程序中,数据的安全性和存储空间的利用率是非常重要的考虑因素。PHP和SQLite是两个非常广泛使用的工具,本文将介绍如何使用它们来进行数据压缩和加密。SQLite是一种轻量级的嵌入式数据库引擎,它没有独立的服务器进程,而是直接与应用程序进行交互。PHP是一种流行的服务器端脚本语言,被广泛用于构建动态

创建一个简单的博客:使用PHP和SQLite创建一个简单的博客:使用PHP和SQLiteJun 21, 2023 pm 01:23 PM

随着互联网的发展,博客成为越来越多人分享自己生活、知识和想法的平台。如果你也想创建一个自己的博客,那么本文将介绍如何使用PHP和SQLite来创建一个简单的博客。确定需求在开始创建博客之前,我们需要确定自己想要实现的功能。例如:创建博客文章编辑博客文章删除博客文章显示博客文章列表显示博客文章详情用户认证和权限控制安装PHP和SQLite我们需要安装PHP和S

如何使用PHP和SQLite进行数据导入和导出如何使用PHP和SQLite进行数据导入和导出Jul 28, 2023 am 11:43 AM

如何使用PHP和SQLite进行数据导入和导出导入和导出数据是在开发网站或应用程序时常见的任务之一。使用PHP和SQLite,我们可以轻松地将数据从外部文件导入到SQLite数据库中,并从数据库导出数据到外部文件。本文将介绍如何使用PHP和SQLite进行数据导入和导出,并提供相应的代码示例。数据导入首先,我们需要准备一个包含要导入的数据的外部文件。这个文件

使用PHP和SQLite实现数据图表和可视化使用PHP和SQLite实现数据图表和可视化Jul 28, 2023 pm 01:01 PM

使用PHP和SQLite实现数据图表和可视化概述:随着大数据时代的到来,数据图表和可视化成为了展示和分析数据的重要方式。在本文中,将介绍如何使用PHP和SQLite实现数据图表和可视化的功能。以一个实例为例,展示如何从SQLite数据库中读取数据,并使用常见的数据图表库来展示数据。准备工作:首先,需要确保已经安装了PHP和SQLite数据库。如果没有安装,可

PHP和SQLite:如何处理长连接和断线重连PHP和SQLite:如何处理长连接和断线重连Jul 29, 2023 am 09:05 AM

PHP和SQLite:如何处理长连接和断线重连引言:在Web开发中,PHP和SQLite是两个常用的技术。然而,长连接和断线重连是在使用PHP和SQLite时经常遇到的一些问题。本文将介绍如何在PHP中处理长连接和断线重连的问题,并提供一些实例代码,以帮助开发者更好地理解和解决这些问题。一、长连接问题在使用PHP连接SQLite数据库时,长连接(Persis

如何使用PHP和SQLite进行全文搜索和索引策略如何使用PHP和SQLite进行全文搜索和索引策略Jul 29, 2023 pm 08:45 PM

如何使用PHP和SQLite进行全文搜索和索引策略引言:在现代的应用程序开发中,全文搜索功能在许多领域中都是不可或缺的。无论是在博客、新闻网站还是在电子商务平台上,用户都习惯使用关键字进行搜索。因此,为了提高用户体验并提供更好的搜索结果,我们需要使用适当的搜索和索引策略来提供全文搜索功能。在本文中,我们将探讨如何使用PHP和SQLite数据库来实现全文搜索和

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는