Je veux écrire rapidement de java vers sqlite

Aperçu

J'avais l'habitude de sauvegarder la collecte de données de tweet dans sqlite en utilisant python, Un mémo que j'ai recherché de différentes manières car je voulais le faire à grande vitesse tout en multi-threading avec java.

Bibliothèque

Lorsque vous traitez avec sqlite Utiliser sqlite-jdbc est facile, alors prenez-le de maven et utilisez-le.

J'étais accro à

Au départ, je collectais des données sur le disque dur,

** Quoi qu'il en soit, lent. ** **

Je me suis demandé pourquoi c'était si lent et qu'il fallait beaucoup de temps pour ajouter des bases de données plutôt que de les collecter.

Solution

J'ai cherché la cause.

  1. Lors de l'ajout de données, elles ont été ajoutées une par une avec ʻexecuteUpdate`
  2. ʻINSERT OR UPDATE` pour éviter la duplication des données (tweets)
  3. Dans le paramètre par défaut, il est écrit dans le fichier db-jornal, puis ajouté au fichier DB, de sorte qu'un accès supplémentaire au disque se produit. En outre, il est lent car il a un indicateur de synchronisation avec DB.

Résolvez un par un

  1. à la bibliothèque appropriée peut être réservé ou insérer à l'avance quel genre de choses comme données dans le prepareStatement
  2. A ce propos, il semble que ʻUPDATE prenne beaucoup de temps, alors changez-le en ʻINSERT OR IGNORE.
  3. Jouez avec le mode pragma. Spécifiquement, définissez journal_mode sur MEMORY et définissez sync_mode sur ʻOFF`.

Exemple d'implémentation

Exemple d'enregistrement du tweet qui a été dit en premier

DataBase.java


    /**
     *Enregistrement du conducteur
     */
    public static void dbInit() {
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     *paramètres pragma
     *Ici 3.Jornal_mode et synchronisation_le mode est défini
     */
    public static Properties getProperties() {
        Properties prop = new Properties();
        prop.put("journal_mode", "MEMORY");
        prop.put("sync_mode", "OFF");
        return prop;
    }
    /**
     *Traitement à ajouter à la base de données
     *Si vous ne mettez pas synchronisé, un verrou mort se produira lors de l'écriture dure avec multi-thread
     */
    public static synchronized void putTweet2SQL(File dbFile, List<Status> tweet) {
        Statement stmt;
        String dbHeader = "jdbc:sqlite:" + dbFile.getAbsolutePath();
        PreparedStatement pstmt;
        dbInit();
        try (Connection conn = DriverManager.getConnection(dbHeader, getProperties())) { //try-with-resources
            conn.setAutoCommit(false);
            stmt = conn.createStatement();
            //Créez si vous n'avez pas de base de données
            stmt.executeUpdate("CREATE TABLE IF NOT EXISTS tweets (tweet_id INTEGER PRIMARY KEY, user_id INTEGER, user_screen_name TEXT,tweet_text TEXT)");
            //ID Tweet, ID utilisateur, nom d'écran, texte tweet
            //2.Se préparer à ajouter des données en masse
            pstmt = conn.prepareStatement("INSERT OR IGNORE INTO tweets VALUES (?, ?, ?, ?)");
            for (Status status : tweet) {
                place = status.getPlace().getFullName();
                pstmt.setLong(1, status.getId());
                pstmt.setLong(2, status.getUser().getId());
                pstmt.setString(3, status.getUser().getScreenName());
                pstmt.setString(4, status.getText());
                pstmt.addBatch();//1.Ajouter au traitement
            }
            pstmt.executeBatch();//1.Le processus d'ajout de base de données réel se fait ici
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

prime

Même lors de la lecture à partir de la base de données, setFetchSize appellera le numéro spécifié à la fois, donc il sera confortable dans une certaine mesure.

DataBase.java


    /**
     *Recevez des tweets
     *Si vous extrayez d'énormes données, le tas sera insuffisant, donc dans ce cas, réécrivez correctement
     * @retourner la liste de Tweet
     */
    public static List<Status> getTweetsFromSQL(File dbFile) {
        String dbHeader = "jdbc:sqlite:" + dbFile.getAbsolutePath();
        PreparedStatement pstmt;
        List<Status> userDetails = new ArrayList<>();//Liste appropriée
        dbInit();
        try (Connection conn = DriverManager.getConnection(dbHeader, getProperties())) {
            pstmt = conn.prepareStatement("SELECT * FROM tweets");
            pstmt.setFetchSize(1000);//Si vous définissez 5000 billions ou quelque chose du genre, vous obtiendrez tout en même temps
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {//ID Tweet, ID utilisateur, nom d'écran, texte tweet
                Status status = new status();
                status.setId(rs.getLong(1));
                status.setUserId(rs.getLong(2));
                status.setScreenName(rs.getString(3));
                status.setTweetText(rs.getString(4));
                
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return userDetails;
    }

Impressions

C'est beaucoup plus rapide et je suis content car je pourrais acheter plus de SSD

Recommended Posts

Je veux écrire rapidement de java vers sqlite
Exécuter R à partir de Java Je veux exécuter rJava
[Java] Je souhaite calculer la différence par rapport à la date
[JDBC] J'ai essayé d'accéder à la base de données SQLite3 depuis Java.
Je veux écrire un joli build.gradle
Je veux écrire un test unitaire!
Je veux arrêter complètement les mises à jour Java
Je veux juste écrire Java en utilisant Eclipse sur mon Mac
Changements de Java 8 à Java 11
Somme de Java_1 à 100
Je souhaite envoyer un e-mail en Java.
Je souhaite terminer correctement l'installation de npm [2020]
Je veux utiliser java8 forEach avec index
Je veux écrire une simple répétition d'une chaîne de caractères
rsync4j --Je veux toucher rsync en Java.
Je veux faire quelque chose comme "cls" en Java
Comment écrire Scala du point de vue de Java
6 fonctionnalités que j'ai manquées après mon retour de Scala à Java
Je veux faire des transitions d'écran avec kotlin et java!
Migration de Cobol vers JAVA
Je veux convertir des caractères ...
Nouvelles fonctionnalités de Java7 à Java8
Comment rédiger un commentaire java
Connectez-vous de Java à PostgreSQL
Passer de SQLite3 à PostgreSQL
De Java inefficace à Java efficace
Je souhaite créer une applet Java sans utiliser d'IDE
Je souhaite utiliser l'API Java 8 DateTime lentement (maintenant)
Comment écrire et noter lors de la migration de VB vers JAVA
Je veux implémenter diverses fonctions avec kotlin et java!
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit
Je souhaite simplifier l'instruction if-else de la branche conditionnelle en Java
En Java, je souhaite couper plusieurs caractères spécifiés uniquement du début et de la fin.
Je veux écrire une boucle qui fait référence à un index avec l'API Stream de Java 8
[Java] Je souhaite écrire un traitement asynchrone à l'aide de Promise dans Java-Trial of Promise-like syntax of JavaScript-
Je veux renvoyer un type différent de l'élément d'entrée avec Java8 StreamAPI Reduce ()
Étudier Java # 6 (Comment écrire des blocs)
J'ai essayé d'interagir avec Java
Java sera impliqué dès aujourd'hui
De Java à VB.NET - Écriture de notes de contraste
Comment écrire une déclaration de variable Java
J'ai essayé de résumer l'apprentissage Java (1)
La route de JavaScript à Java
J'ai essayé de résumer Java 8 maintenant
[Java] Conversion d'un tableau à une liste
Je veux pouvoir penser et écrire moi-même des expressions régulières. ..
Je veux revenir à l'écran précédent avec kotlin et java!
Si vous souhaitez modifier l'environnement de développement Java d'Eclipse
[Android] Je souhaite obtenir l'auditeur à partir du bouton de ListView
Ce à quoi j'ai pensé lorsque j'ai commencé à migrer de Java vers Kotlin
Je souhaite développer une application web!
Je souhaite éliminer les messages d'erreur en double
Je veux créer une application ios.android
J'ai essayé de résumer les expressions Java lambda
Je veux afficher des images avec REST Controller de Java et Spring!
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!