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)!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP와 SQLite를 사용하여 사용자 로그인 시스템을 만드는 방법 오늘날의 인터넷 시대에 사용자 로그인 시스템은 많은 웹사이트와 애플리케이션의 기본 기능 중 하나입니다. 이 기사에서는 PHP와 SQLite를 사용하여 간단하고 강력한 사용자 로그인 시스템을 만드는 방법을 소개합니다. SQLite는 구성이 필요 없는 서버측 데이터베이스 엔진입니다. PHP는 유연하고 효율적인 사용자 로그인 시스템을 만들기 위해 SQLite와 함께 사용할 수 있는 널리 사용되는 서버측 스크립팅 언어입니다. ~에 의해

PHP 및 SQLite를 사용하여 사용자 권한 및 액세스 제어 구현 최신 웹 애플리케이션에서 사용자 권한 및 액세스 제어는 매우 중요한 부분입니다. 적절한 권한 관리를 통해 승인된 사용자만 특정 페이지와 기능에 액세스할 수 있도록 할 수 있습니다. 이 기사에서는 PHP 및 SQLite를 사용하여 기본 사용자 권한 및 액세스 제어를 구현하는 방법을 알아봅니다. 먼저 사용자 및 해당 권한에 대한 정보를 저장하기 위해 SQLite 데이터베이스를 만들어야 합니다. 다음은 간단한 사용자 테이블과 권한 테이블의 구조이다.

PHP 및 SQLite: 데이터를 압축하고 암호화하는 방법 많은 웹 애플리케이션에서 데이터 보안과 저장 공간 활용은 매우 중요한 고려 사항입니다. PHP와 SQLite는 매우 널리 사용되는 두 가지 도구이며, 이 기사에서는 데이터 압축 및 암호화에 이를 사용하는 방법을 소개합니다. SQLite는 별도의 서버 프로세스가 없지만 애플리케이션과 직접 상호 작용하는 경량 임베디드 데이터베이스 엔진입니다. PHP는 동적 구축에 널리 사용되는 널리 사용되는 서버 측 스크립팅 언어입니다.

PHP 및 SQLite를 사용하여 데이터 차트 및 시각화 개요 구현: 빅 데이터 시대가 도래하면서 데이터 차트 및 시각화는 데이터를 표시하고 분석하는 중요한 방법이 되었습니다. 이 기사에서는 PHP와 SQLite를 사용하여 데이터 차트 및 시각화 기능을 구현하는 방법을 소개합니다. SQLite 데이터베이스에서 데이터를 읽고 일반 데이터 차트 라이브러리를 사용하여 데이터를 표시하는 방법을 보여주는 예제를 예로 들어 보겠습니다. 준비: 먼저 PHP 및 SQLite 데이터베이스가 설치되었는지 확인해야 합니다. 설치되어 있지 않은 경우 다음을 수행할 수 있습니다.

인터넷의 발달로 블로그는 점점 더 많은 사람들이 자신의 삶과 지식, 아이디어를 공유하는 플랫폼이 되었습니다. 자신만의 블로그를 만들고 싶다면 이 기사에서는 PHP와 SQLite를 사용하여 간단한 블로그를 만드는 방법을 소개합니다. 요구 사항 결정 블로그 만들기를 시작하기 전에 달성하려는 기능을 결정해야 합니다. 예: 블로그 게시물 작성 블로그 게시물 편집 블로그 게시물 삭제 블로그 게시물 목록 표시 블로그 게시물 세부 정보 표시 사용자 인증 및 권한 제어 PHP 및 SQLite 설치 PHP 및 S를 설치해야 합니다.

PHP 및 SQLite: 긴 연결과 연결 해제 및 재연결을 처리하는 방법 소개: 웹 개발에서 PHP와 SQLite는 일반적으로 사용되는 두 가지 기술입니다. 그러나 긴 연결과 연결 해제 및 재연결은 PHP 및 SQLite를 사용할 때 자주 발생하는 문제 중 일부입니다. 이 기사에서는 PHP에서 긴 연결 문제와 연결 해제 및 재연결 문제를 처리하는 방법을 소개하고 개발자가 이러한 문제를 더 잘 이해하고 해결하는 데 도움이 되는 몇 가지 예제 코드를 제공합니다. 1. 지속적인 연결 문제 PHP를 사용하여 SQLite 데이터베이스에 연결할 때 연결이 오래 걸립니다(Persis

전체 텍스트 검색 및 인덱싱 전략을 위해 PHP 및 SQLite를 사용하는 방법 소개: 최신 애플리케이션 개발에서 전체 텍스트 검색 기능은 여러 분야에서 필수 불가결합니다. 블로그, 뉴스 웹사이트, 전자상거래 플랫폼 등에서 사용자는 키워드를 사용하여 검색하는 데 익숙합니다. 따라서 사용자 경험을 개선하고 더 나은 검색 결과를 제공하려면 적절한 검색 및 색인 전략을 사용하여 전체 텍스트 검색 기능을 제공해야 합니다. 이 기사에서는 PHP 및 SQLite 데이터베이스를 사용하여 전체 텍스트 검색을 구현하는 방법을 살펴보겠습니다.

PHP 및 SQLite를 사용하여 데이터를 가져오고 내보내는 방법 데이터 가져오기 및 내보내기는 웹 사이트나 애플리케이션을 개발하는 동안 일반적인 작업 중 하나입니다. PHP와 SQLite를 사용하면 외부 파일의 데이터를 SQLite 데이터베이스로 쉽게 가져오고 데이터베이스의 데이터를 외부 파일로 내보낼 수 있습니다. 이 기사에서는 PHP 및 SQLite를 사용하여 데이터를 가져오고 내보내는 방법을 소개하고 해당 코드 예제를 제공합니다. 데이터 가져오기 먼저 가져올 데이터가 포함된 외부 파일을 준비해야 합니다. 이 파일
