Ich möchte schnell von Java nach SQLite schreiben

Überblick

Ich habe die Tweet-Datenerfassung in SQLite mit Python gespeichert. Ein Memo, das ich auf verschiedene Weise recherchiert habe, weil ich es mit hoher Geschwindigkeit beim Multithreading mit Java machen wollte.

Bibliothek

Beim Umgang mit SQLite Wenn Sie sqlite-jdbc verwenden, ist es einfach zu verwenden. Nehmen Sie es also von maven und verwenden Sie es.

Ich war süchtig nach

Anfangs sammelte ich Daten auf der Festplatte,

** Wie auch immer langsam. ** **.

Ich fragte mich, warum es so langsam war und es viel Zeit in Anspruch nahm, DBs hinzuzufügen, anstatt sie zu sammeln.

Lösung

Ich habe nach der Ursache gesucht.

  1. Beim Hinzufügen von Daten wurden diese einzeln mit "executeUpdate" hinzugefügt
  2. INSERT OR UPDATE wurde durchgeführt, um Doppelarbeit (Tweets) zu vermeiden.
  3. In der Standardeinstellung wird es in die db-jornal-Datei geschrieben und dann zur DB-Datei hinzugefügt, sodass zusätzlicher Festplattenzugriff erfolgt. Außerdem ist es langsam, da es ein Synchronisationsflag mit DB hat.

Löse eins nach dem anderen

  1. in die entsprechende Bibliothek kann reserviert werden oder im Voraus welche Art von Dingen als Daten in das "prepareStatement" einfügen
  2. In Bezug darauf scheint es, dass "UPDATE" lange dauert, also ändern Sie es in "INSERT OR IGNORE".
  3. Spielen Sie mit dem Pragma-Modus. Setzen Sie "journal_mode" auf "MEMORY" und "sync_mode" auf "OFF".

Implementierungsbeispiel

Beispiel für das Speichern des zuerst genannten Tweets

DataBase.java


    /**
     *Fahrerregistrierung
     */
    public static void dbInit() {
        try {
            Class.forName("org.sqlite.JDBC");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     *Pragma-Einstellungen
     *Hier 3.Jornal_Modus und Synchronisierung_Modus ist eingestellt
     */
    public static Properties getProperties() {
        Properties prop = new Properties();
        prop.put("journal_mode", "MEMORY");
        prop.put("sync_mode", "OFF");
        return prop;
    }
    /**
     *Verarbeitung zum Hinzufügen zur Datenbank
     *Wenn Sie nicht synchronisieren, tritt beim Schreiben mit Multithread eine Dead Lock auf
     */
    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();
            //Erstellen Sie, wenn Sie keine Datenbank haben
            stmt.executeUpdate("CREATE TABLE IF NOT EXISTS tweets (tweet_id INTEGER PRIMARY KEY, user_id INTEGER, user_screen_name TEXT,tweet_text TEXT)");
            //Tweet ID, Benutzer ID, Bildschirmname, Tweet Text
            //2.Vorbereiten des Hinzufügens von Daten in großen Mengen
            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.Zur Verarbeitung hinzufügen
            }
            pstmt.executeBatch();//1.Der eigentliche Datenbankzusatzprozess wird hier durchgeführt
            conn.commit();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

Bonus

Selbst beim Lesen aus der Datenbank ruft setFetchSize die angegebene Nummer sofort auf, so dass es bis zu einem gewissen Grad bequem ist.

DataBase.java


    /**
     *Holen Sie sich Tweets
     *Wenn Sie große Datenmengen abrufen, ist der Heap nicht ausreichend. Schreiben Sie in diesem Fall entsprechend neu
     * @Tweet-Liste zurückgeben
     */
    public static List<Status> getTweetsFromSQL(File dbFile) {
        String dbHeader = "jdbc:sqlite:" + dbFile.getAbsolutePath();
        PreparedStatement pstmt;
        List<Status> userDetails = new ArrayList<>();//Geeignete Liste
        dbInit();
        try (Connection conn = DriverManager.getConnection(dbHeader, getProperties())) {
            pstmt = conn.prepareStatement("SELECT * FROM tweets");
            pstmt.setFetchSize(1000);//Wenn Sie 5000 Billionen oder so etwas einstellen, erhalten Sie alles auf einmal
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {//Tweet ID, Benutzer ID, Bildschirmname, Tweet Text
                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;
    }

Impressionen

Es ist viel schneller und ich bin glücklich, weil ich mehr SSDs kaufen könnte

Recommended Posts

Ich möchte schnell von Java nach SQLite schreiben
R von Java ausführen Ich möchte rJava ausführen
[Java] Ich möchte die Differenz zum Datum berechnen
[JDBC] Ich habe versucht, von Java aus auf die SQLite3-Datenbank zuzugreifen.
Ich möchte ein schönes build.gradle schreiben
Ich möchte einen Unit Test schreiben!
Ich möchte Java-Updates insgesamt stoppen
Ich möchte nur Java mit Eclipse auf meinem Mac schreiben
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Ich möchte eine E-Mail in Java senden.
Ich möchte von npm richtig abschließen [2020]
Ich möchte Java8 für jeden mit Index verwenden
Ich möchte eine einfache Wiederholung einer Zeichenkette schreiben
rsync4j - Ich möchte rsync in Java berühren.
Ich möchte so etwas wie "cls" in Java machen
Wie schreibe ich Scala aus der Perspektive von Java
6 Funktionen, die ich nach meiner Rückkehr von Scala nach Java verpasst habe
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Migration von Cobol nach JAVA
Ich möchte Zeichen konvertieren ...
Neue Funktionen von Java7 bis Java8
Wie schreibe ich einen Java-Kommentar
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Wechseln Sie von SQLite3 zu PostgreSQL
Von ineffektivem Java zu effektivem Java
Ich möchte Java Applet ohne Verwendung einer IDE erstellen
Ich möchte die Java 8 DateTime-API (jetzt) langsam verwenden.
Schreiben und Notizen bei der Migration von VB zu JAVA
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
[Java] Ich möchte Standardeingabe und Standardausgabe mit JUnit testen
Ich möchte die if-else-Anweisung für bedingte Verzweigungen in Java vereinfachen
In Java möchte ich mehrere angegebene Zeichen nur von Anfang bis Ende abschneiden.
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
[Java] Ich möchte eine asynchrone Verarbeitung mit Promise in der Java-Testversion der Promise-ähnlichen Syntax von JavaScript schreiben.
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
Java # 6 studieren (Wie man Blöcke schreibt)
Ich habe versucht, mit Java zu interagieren
Java soll ab heute dabei sein
Von Java zu VB.NET-Writing Kontrastmemo-
So schreiben Sie eine Java-Variablendeklaration
Ich habe versucht, das Java-Lernen zusammenzufassen (1)
Der Weg von JavaScript nach Java
Ich habe jetzt versucht, Java 8 zusammenzufassen
[Java] Konvertierung von Array zu Liste
Ich möchte in der Lage sein, selbst reguläre Ausdrücke zu denken und zu schreiben. ..
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Wenn Sie die Java-Entwicklungsumgebung von Eclipse aus ändern möchten
[Android] Ich möchte den Listener über die Schaltfläche in ListView abrufen
Woran ich dachte, als ich anfing, von Java nach Kotlin zu migrieren
Ich möchte eine Webanwendung entwickeln!
Ich möchte doppelte Fehlermeldungen beseitigen
Ich möchte eine ios.android App machen
Ich habe versucht, Java-Lambda-Ausdrücke zusammenzufassen
Ich möchte Bilder mit REST Controller von Java und Spring anzeigen!
Ich möchte DBViewer mit Eclipse 2018-12 verwenden! !!