Maison Java javaDidacticiel 深入Sqlite多线程入库的问题

深入Sqlite多线程入库的问题

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"))); 
    } 
}
Copier après la connexion

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


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment créer un système de connexion utilisateur en utilisant PHP et SQLite Comment créer un système de connexion utilisateur en utilisant PHP et SQLite Jul 28, 2023 pm 09:27 PM

Comment créer un système de connexion utilisateur à l'aide de PHP et SQLite À l'ère d'Internet d'aujourd'hui, un système de connexion utilisateur est l'une des fonctions de base de nombreux sites Web et applications. Cet article explique comment créer un système de connexion utilisateur simple et puissant à l'aide de PHP et SQLite. SQLite est un moteur de base de données intégré, sans configuration, côté serveur. PHP est un langage de script côté serveur populaire qui peut être utilisé conjointement avec SQLite pour créer un système de connexion utilisateur flexible et efficace. par

Implémentation des autorisations utilisateur et du contrôle d'accès à l'aide de PHP et SQLite Implémentation des autorisations utilisateur et du contrôle d'accès à l'aide de PHP et SQLite Jul 29, 2023 pm 02:33 PM

Implémentation des autorisations utilisateur et du contrôle d'accès à l'aide de PHP et SQLite Dans les applications Web modernes, les autorisations utilisateur et le contrôle d'accès constituent un élément très important. Avec une gestion appropriée des autorisations, vous pouvez garantir que seuls les utilisateurs autorisés peuvent accéder à des pages et des fonctions spécifiques. Dans cet article, nous apprendrons comment implémenter les autorisations utilisateur de base et le contrôle d'accès à l'aide de PHP et SQLite. Tout d'abord, nous devons créer une base de données SQLite pour stocker des informations sur les utilisateurs et leurs autorisations. Ce qui suit est la structure d'une simple table d'utilisateurs et d'une table d'autorisations

PHP et SQLite : Comment effectuer la compression et le cryptage des données PHP et SQLite : Comment effectuer la compression et le cryptage des données Jul 29, 2023 am 08:36 AM

PHP et SQLite : comment compresser et chiffrer des données Dans de nombreuses applications Web, la sécurité des données et l'utilisation de l'espace de stockage sont des considérations très importantes. PHP et SQLite sont deux outils très largement utilisés, et cet article explique comment les utiliser pour la compression et le chiffrement des données. SQLite est un moteur de base de données intégré léger qui ne dispose pas de processus serveur distinct mais interagit directement avec les applications. PHP est un langage de script côté serveur populaire largement utilisé pour créer des

Création de graphiques et visualisation de données à l'aide de PHP et SQLite Création de graphiques et visualisation de données à l'aide de PHP et SQLite Jul 28, 2023 pm 01:01 PM

Utiliser PHP et SQLite pour implémenter des graphiques de données et un aperçu de la visualisation : avec l'avènement de l'ère du Big Data, les graphiques de données et les visualisations sont devenus un moyen important d'afficher et d'analyser les données. Dans cet article, nous présenterons comment utiliser PHP et SQLite pour implémenter des graphiques de données et des fonctions de visualisation. Prenons un exemple pour montrer comment lire les données d'une base de données SQLite et utiliser une bibliothèque de graphiques de données commune pour afficher les données. Préparation : Tout d'abord, vous devez vous assurer que les bases de données PHP et SQLite ont été installées. S'il n'est pas installé, vous pouvez

Créer un blog simple : en utilisant PHP et SQLite Créer un blog simple : en utilisant PHP et SQLite Jun 21, 2023 pm 01:23 PM

Avec le développement d’Internet, les blogs sont devenus une plateforme permettant à de plus en plus de personnes de partager leur vie, leurs connaissances et leurs idées. Si vous souhaitez également créer votre propre blog, cet article vous expliquera comment utiliser PHP et SQLite pour créer un blog simple. Déterminer les besoins Avant de commencer à créer un blog, nous devons déterminer les fonctions que nous souhaitons réaliser. Par exemple : Créer un article de blog Modifier un article de blog Supprimer un article de blog Afficher une liste d'articles de blog Afficher les détails de l'article de blog Authentification des utilisateurs et contrôle des autorisations Installer PHP et SQLite Nous devons installer PHP et S

PHP et SQLite : Comment gérer les connexions longues, les déconnexions et les reconnexions PHP et SQLite : Comment gérer les connexions longues, les déconnexions et les reconnexions Jul 29, 2023 am 09:05 AM

PHP et SQLite : Comment gérer les connexions longues, les déconnexions et les reconnexions Introduction : Dans le développement Web, PHP et SQLite sont deux technologies couramment utilisées. Cependant, les connexions longues, les déconnexions et les reconnexions font partie des problèmes souvent rencontrés lors de l'utilisation de PHP et SQLite. Cet article présentera comment gérer les problèmes de connexions longues, de déconnexion et de reconnexion en PHP, et fournira quelques exemples de codes pour aider les développeurs à mieux comprendre et résoudre ces problèmes. 1. Problème de connexion persistant Lors de l'utilisation de PHP pour se connecter à la base de données SQLite, connexion longue (Persis

Comment utiliser PHP et SQLite pour les stratégies de recherche et d'indexation en texte intégral Comment utiliser PHP et SQLite pour les stratégies de recherche et d'indexation en texte intégral Jul 29, 2023 pm 08:45 PM

Comment utiliser PHP et SQLite pour les stratégies de recherche et d'indexation en texte intégral Introduction : Dans le développement d'applications modernes, les capacités de recherche en texte intégral sont indispensables dans de nombreux domaines. Que ce soit sur les blogs, les sites d’actualités ou les plateformes de commerce électronique, les utilisateurs ont l’habitude d’utiliser des mots-clés pour effectuer leurs recherches. Par conséquent, pour améliorer l’expérience utilisateur et fournir de meilleurs résultats de recherche, nous devons fournir des capacités de recherche en texte intégral en utilisant des stratégies de recherche et d’indexation appropriées. Dans cet article, nous explorerons comment utiliser les bases de données PHP et SQLite pour implémenter la recherche en texte intégral et

Comment importer et exporter des données en utilisant PHP et SQLite Comment importer et exporter des données en utilisant PHP et SQLite Jul 28, 2023 am 11:43 AM

Comment importer et exporter des données à l'aide de PHP et SQLite L'importation et l'exportation de données sont l'une des tâches courantes lors du développement d'un site Web ou d'une application. En utilisant PHP et SQLite, nous pouvons facilement importer des données de fichiers externes dans la base de données SQLite et exporter des données de la base de données vers des fichiers externes. Cet article explique comment utiliser PHP et SQLite pour importer et exporter des données et fournit des exemples de code correspondants. Importation de données Tout d'abord, nous devons préparer un fichier externe contenant les données à importer. ce fichier

See all articles