Git Repositories

Évite les dépassements de mémoire à l'insertion en base
authorCyrille Pontvieux <cyrille@enialis.net>
Wed, 2 Nov 2016 21:29:52 +0000 (22:29 +0100)
committerCyrille Pontvieux <cyrille@enialis.net>
Wed, 2 Nov 2016 21:29:52 +0000 (22:29 +0100)
Corrige un problème à la con avec Hibernate et les caractères { et } même avec une requête native. Vieux problème connu par Hibernate mais pas corrigé voire pire ignoré par les dev.

README.txt [new file with mode: 0644]
src/main/java/com/viseo/xerox/elastic/Main.java

diff --git a/README.txt b/README.txt
new file mode 100644 (file)
index 0000000..e4dbf53
--- /dev/null
@@ -0,0 +1,31 @@
+Installation
+============
+
+ElasticSearch
+-------------
+
+Télécharger et décompresser une version 2.x
+Créer le répertoire analysis dans le répertoire config d'ES
+Copier le fichier synonym.txt dans celui-ci
+Lancer ES avec le fichier bin/elasticsearch
+
+Kibana (optionnel)
+------------------
+
+Télécharger et décompresser une version 4.6.x
+Installer le plugin sense avec bin/kibana plugin --install elastic/search
+Lancer Kibana avec le fichier bin/kibana
+
+Le projet
+---------
+
+JDK 8 nécessaire
+Créer le paquet avec maven :
+  mvn package
+Créer la base de données :
+  java -jar target/xerox-elastic-poc-1.0-shaded.jar create
+Indexer les données :
+  java -jar target/xerox-elastic-poc-1.0-shaded.jar index
+Faire des recherches :
+  java -jar target/xerox-elastic-poc-1.0-shaded.jar query
+
index d6274ed..105e5f2 100644 (file)
@@ -1,13 +1,14 @@
 package com.viseo.xerox.elastic;
 
-import org.apache.commons.io.IOUtils;
 import org.hibernate.Session;
 import org.hibernate.Transaction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import javax.persistence.EntityManager;
+import java.io.BufferedReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -68,12 +69,31 @@ public class Main {
     }
 
     private void createDb() throws IOException {
-        String sql = IOUtils.toString(getClass().getResourceAsStream("/insert_data.sql"), StandardCharsets.UTF_8.name());
-        Session session = ((Session) em.getDelegate()).getSession();
+        final Session session = ((Session) em.getDelegate()).getSession();
+        try (BufferedReader br = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("/insert_data.sql"), StandardCharsets.UTF_8.name()))) {
+            final int maxLines = 100;
+            final List<String> lines = new ArrayList<>(maxLines);
+            String line;
+            while ((line = br.readLine()) != null) {
+                lines.add(line);
+                if (lines.size() == maxLines) {
+                    execSql(session, lines);
+                    lines.clear();
+                }
+            }
+            if (lines.size() != 0) {
+                execSql(session, lines);
+                lines.clear();
+            }
+        }
+        session.close();
+    }
+
+    private void execSql(Session session, List<String> lines) {
         Transaction tx = session.beginTransaction();
+        String sql = String.join("\n", lines).replace("{", "'||CHAR(123)||'").replace("}", "'||CHAR(125)||'");
         session.createNativeQuery(sql).executeUpdate();
         tx.commit();
-        session.close();
     }
 
     private void indexDb() throws IOException {
@@ -81,7 +101,7 @@ public class Main {
         dropIndex(esRequest);
         createIndexAndAnalyzer(esRequest);
         paramMappings(esRequest, InterrestPoint.class, MobilityPoint.class);
-        int bulkCount = 100;
+        final int bulkCount = 100;
         List<Point> points = new ArrayList<>(bulkCount);
         for (InterrestPoint point : em.createQuery("select p from InterrestPoint p", InterrestPoint.class).getResultList()) {
             points.add(point);