Heim Java javaLernprogramm Eingehende Analyse von Problemen mit SQLite-Multithread-Datenbanken

Eingehende Analyse von Problemen mit SQLite-Multithread-Datenbanken

Dec 19, 2016 pm 02:44 PM

今天经理给了我一个三十多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"))); 
    } 
}
Nach dem Login kopieren

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


Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So erstellen Sie ein Benutzeranmeldesystem mit PHP und SQLite So erstellen Sie ein Benutzeranmeldesystem mit PHP und SQLite Jul 28, 2023 pm 09:27 PM

So erstellen Sie ein Benutzeranmeldesystem mit PHP und SQLite. Im heutigen Internetzeitalter ist ein Benutzeranmeldesystem eine der Grundfunktionen vieler Websites und Anwendungen. In diesem Artikel erfahren Sie, wie Sie mit PHP und SQLite ein einfaches und leistungsstarkes Benutzeranmeldesystem erstellen. SQLite ist eine eingebettete Datenbank-Engine. Es handelt sich um eine serverseitige Datenbank-Engine ohne Konfiguration. PHP ist eine beliebte serverseitige Skriptsprache, die in Verbindung mit SQLite verwendet werden kann, um ein flexibles und effizientes Benutzeranmeldesystem zu erstellen. von

Implementierung von Benutzerberechtigungen und Zugriffskontrolle mit PHP und SQLite Implementierung von Benutzerberechtigungen und Zugriffskontrolle mit PHP und SQLite Jul 29, 2023 pm 02:33 PM

Benutzerberechtigungen und Zugriffskontrolle mit PHP und SQLite implementieren In modernen Webanwendungen sind Benutzerberechtigungen und Zugriffskontrolle ein sehr wichtiger Bestandteil. Mit einer ordnungsgemäßen Berechtigungsverwaltung können Sie sicherstellen, dass nur autorisierte Benutzer auf bestimmte Seiten und Funktionen zugreifen können. In diesem Artikel erfahren Sie, wie Sie mit PHP und SQLite grundlegende Benutzerberechtigungen und Zugriffskontrolle implementieren. Zuerst müssen wir eine SQLite-Datenbank erstellen, um Informationen über Benutzer und ihre Berechtigungen zu speichern. Das Folgende ist die Struktur einer einfachen Benutzertabelle und einer Berechtigungstabelle

PHP und SQLite: So führen Sie Datenkomprimierung und -verschlüsselung durch PHP und SQLite: So führen Sie Datenkomprimierung und -verschlüsselung durch Jul 29, 2023 am 08:36 AM

PHP und SQLite: So komprimieren und verschlüsseln Sie Daten In vielen Webanwendungen sind Datensicherheit und Speicherplatznutzung sehr wichtige Überlegungen. PHP und SQLite sind zwei sehr weit verbreitete Tools. In diesem Artikel erfahren Sie, wie Sie sie zur Datenkomprimierung und -verschlüsselung verwenden. SQLite ist eine leichtgewichtige eingebettete Datenbank-Engine, die keinen separaten Serverprozess hat, sondern direkt mit Anwendungen interagiert. PHP ist eine beliebte serverseitige Skriptsprache, die häufig zum Erstellen dynamischer Dateien verwendet wird

Datendiagramme und Visualisierung mit PHP und SQLite Datendiagramme und Visualisierung mit PHP und SQLite Jul 28, 2023 pm 01:01 PM

Verwendung von PHP und SQLite zur Implementierung von Datendiagrammen und Visualisierungsübersicht: Mit dem Aufkommen des Big-Data-Zeitalters sind Datendiagramme und Visualisierungen zu einer wichtigen Methode zur Anzeige und Analyse von Daten geworden. In diesem Artikel stellen wir vor, wie Sie PHP und SQLite zum Implementieren von Datendiagrammen und Visualisierungsfunktionen verwenden. Nehmen Sie ein Beispiel, um zu zeigen, wie Daten aus einer SQLite-Datenbank gelesen und eine gemeinsame Datendiagrammbibliothek zum Anzeigen der Daten verwendet werden. Vorbereitung: Zunächst müssen Sie sicherstellen, dass PHP- und SQLite-Datenbanken installiert sind. Wenn es nicht installiert ist, können Sie es tun

Erstellen Sie ein einfaches Blog: mit PHP und SQLite Erstellen Sie ein einfaches Blog: mit PHP und SQLite Jun 21, 2023 pm 01:23 PM

Mit der Entwicklung des Internets sind Blogs für immer mehr Menschen zu einer Plattform geworden, auf der sie ihr Leben, Wissen und Ideen teilen können. Wenn Sie auch ein eigenes Blog erstellen möchten, erfahren Sie in diesem Artikel, wie Sie mit PHP und SQLite ein einfaches Blog erstellen. Bestimmen Sie die Anforderungen Bevor wir mit der Erstellung eines Blogs beginnen, müssen wir die Funktionen bestimmen, die wir erreichen möchten. Zum Beispiel: Einen Blog-Beitrag erstellen Einen Blog-Beitrag bearbeiten Einen Blog-Beitrag löschen Eine Liste von Blog-Beiträgen anzeigen Blog-Beitragsdetails anzeigen Benutzerauthentifizierung und Berechtigungskontrolle PHP und SQLite installieren Wir müssen PHP und S installieren

PHP und SQLite: Wie man mit langen Verbindungen und Trennungen und erneuten Verbindungen umgeht PHP und SQLite: Wie man mit langen Verbindungen und Trennungen und erneuten Verbindungen umgeht Jul 29, 2023 am 09:05 AM

PHP und SQLite: Umgang mit langen Verbindungen sowie Trennung und Wiederverbindung Einführung: In der Webentwicklung sind PHP und SQLite zwei häufig verwendete Technologien. Lange Verbindungen sowie das Trennen und erneute Verbinden gehören jedoch zu den Problemen, die bei der Verwendung von PHP und SQLite häufig auftreten. In diesem Artikel wird erläutert, wie mit den Problemen langer Verbindungen und Verbindungsabbrüchen und erneuten Verbindungen in PHP umgegangen werden kann. Außerdem werden einige Beispielcodes bereitgestellt, die Entwicklern dabei helfen sollen, diese Probleme besser zu verstehen und zu lösen. 1. Dauerhaftes Verbindungsproblem Bei der Verwendung von PHP zum Herstellen einer Verbindung zur SQLite-Datenbank kommt es zu einer langen Verbindung (Persis

Verwendung von PHP und SQLite für Volltextsuch- und Indexierungsstrategien Verwendung von PHP und SQLite für Volltextsuch- und Indexierungsstrategien Jul 29, 2023 pm 08:45 PM

Verwendung von PHP und SQLite für Volltextsuch- und Indexierungsstrategien Einführung: In der modernen Anwendungsentwicklung sind Volltextsuchfunktionen in vielen Bereichen unverzichtbar. Ob auf Blogs, Nachrichten-Websites oder E-Commerce-Plattformen, Benutzer sind es gewohnt, für die Suche Schlüsselwörter zu verwenden. Um die Benutzererfahrung zu verbessern und bessere Suchergebnisse bereitzustellen, müssen wir daher Volltextsuchfunktionen mithilfe geeigneter Such- und Indexierungsstrategien bereitstellen. In diesem Artikel erfahren Sie, wie Sie mithilfe von PHP- und SQLite-Datenbanken eine Volltextsuche implementieren

So importieren und exportieren Sie Daten mit PHP und SQLite So importieren und exportieren Sie Daten mit PHP und SQLite Jul 28, 2023 am 11:43 AM

So importieren und exportieren Sie Daten mit PHP und SQLite Das Importieren und Exportieren von Daten ist eine der häufigsten Aufgaben bei der Entwicklung einer Website oder Anwendung. Mit PHP und SQLite können wir problemlos Daten aus externen Dateien in die SQLite-Datenbank importieren und Daten aus der Datenbank in externe Dateien exportieren. In diesem Artikel wird die Verwendung von PHP und SQLite zum Importieren und Exportieren von Daten vorgestellt und entsprechende Codebeispiele bereitgestellt. Datenimport Zunächst müssen wir eine externe Datei vorbereiten, die die zu importierenden Daten enthält. diese Datei

See all articles