[JAVA] Einfügen von Eijiros Wörterbuchdaten in Oracle DB Teil2

Am Anfang

Die Vorgehensweise beim Einfügen von Eijiros Wörterbuchdaten in eine Oracle-Tabelle wird beschrieben. Dieses Mal werde ich die Wortinformationen aus der zuletzt erstellten HTML-Datei extrahieren und in die Datenbank einfügen.

Informationsanalyse von HTML-Dateien

Was du machen willst

Wenn Sie einfach schreiben, was Sie tun möchten

  1. Verwenden Sie Jsoup, um die zum tr-Tag-Element gehörenden Textinformationen abzurufen
  2. Konvertieren Sie die in 1. erhaltenen Textinformationen in einen Typ (Object []), der mit der Batch-Methode von CherryRunner ausgeführt werden kann.
  3. Fügen Sie 10.000 Listen mit List \ <Objects [] > ein, die in 1. und 2 erstellt wurden. ist

Implementierung

WordInserter.java


package word;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.jsoup.Jsoup;
import word.sql.WordDictionarySql;

public class WordInserter {

	private static String WORD_DICTIONARY =
			"C:/Users/*****/Desktop/puisan_102.txt";
	private static int LIMMIT = 10000;

	public static void main(String args[])throws Exception{
    	long start = System.currentTimeMillis();
    	System.out.println("Der Listenerstellungsprozess beginnt");
		List <Object[]>list =getDictionarySource()
				.stream().collect(Collectors.toList());
		long end = System.currentTimeMillis();
    	System.out.println("Der Listenerstellungsprozess ist abgeschlossen");
		System.out.println(String.format("Verarbeitungszeit%d Sekunden",(end-start)/1000));
		
    	start = System.currentTimeMillis();
    	System.out.println("Starten Sie die DB-Verarbeitung");
		OperateDB.createConnection();
		operateList(list);
		end = System.currentTimeMillis();
    	System.out.println("Der DB-Erstellungsprozess ist abgeschlossen");
		System.out.println(String.format("Verarbeitungszeit%d Sekunden",(end-start)/1000));
		OperateDB.closeConnection();
	}
	
	//Eine Funktion, die Jsoup verwendet, um HTML-Tags zu analysieren und die Ergebnisse aufzulisten
	public static List<Object[]> getDictionarySource(){
		try{
			return Jsoup.parse(new File(WORD_DICTIONARY),"UTF-8")
					//Holen Sie sich alle untergeordneten Elemente, die zum Tag tr gehören
					.getElementsByTag("tr") 
					.stream()
					//Ruft den Text des untergeordneten Elements ab, das zum Tag tr und gehört
					//Datenstruktur, die mit der Map-Funktion in die DB eingefügt werden kann
					//(In diesem Fall Objekt[])Konvertieren zu
					.map(s->new DictionaryWord(
							s.getAllElements().eachText()).params)
					//Liste, damit es mit einem Stapel von QueryLinner eingefügt werden kann<Object[]>
					//Aggregieren zu
					.collect(Collectors.toList());
		}catch(Exception e){
			e.printStackTrace();
			return new ArrayList<Object[]>();
		}
    }
	
	//Führen Sie die Einfügeverarbeitung in Einheiten von 10.000 für die als Argument übergebene Liste aus
	public static void operateList(List<Object[]> word){
    	Stream.iterate(1, s->s+1)
    	.limit((int)Math.ceil(word.size()/LIMMIT))
    	.forEach(i->executeSQL(word,i));
	}
	
    public static void executeSQL(List<Object[]>list,int from){
    	if(list.size()<((from+1)*LIMMIT))
    		WordDictionarySql.insertToWordDictionary(
    				list.subList(from*LIMMIT, list.size()));
    	else 
    		WordDictionarySql.insertToWordDictionary(
    				list.subList((from-1)*LIMMIT, from*LIMMIT));
    }
	
	public static class DictionaryWord{
		public long wordIndex;
		public int wordLevel;
		public String word;
		public String searchWord;
		public String meaning;
		public String shortVer;
		public Object[] params=new Object[6];
		
		public DictionaryWord(List<String>list){
			this.wordIndex = Long.parseLong(list.get(1));
			params[0] = this.wordIndex;
			this.wordLevel = Integer.parseInt(list.get(3).replaceAll("■", ""));
			params[1] = this.wordLevel;
			this.word = list.get(2);
			params[2] = this.word;
			this.searchWord = list.get(2).toLowerCase();
			params[3] = this.word;
			this.meaning = list.get(4);
			params[4] = this.meaning;
			this.shortVer = list.get(4).length()>1000?
					list.get(4).substring(0,1000):list.get(4);
			params[5] = this.shortVer;
		}
		public String toString(){
			String format = "wordIndex=%d  wordLevel=%d "
					+ "word=%s meaning=%s shortVer=%s ";
			return String.format(format,this.wordIndex,this.wordLevel, 
					this.word,this.meaning,this.shortVer);
		}
	}
}

Verschiedene Gefühle

Ich bin überrascht, dass das aufgrund der Analyse von Jsoup erstellte DOM und die Java 8 Stream-Funktion zu kompatibel sind. Ohne die Stream-Funktion wäre es nicht großartig, aber vielleicht hätte ich nicht gedacht, dass ich sie in Java implementieren würde (In diesem Fall habe ich Rubin verwendet)

Einfügevorgang in DB

Was du machen willst

Übergeben Sie einfach die Liste der als Argument erhaltenen Liste \ <Ojbect [] > an OperateDB # insert, die in [Vorheriger Artikel] erstellt wurde (http://qiita.com/triple4649/items/cd6d4e654e9c00de7e42).

Implementierung

WordDictionarySql.java


package word.sql;

import java.util.List;
import word.OperateDB;

public class WordDictionarySql {
	
    public static String INSERT_SQL = "insert into WORD_DICTIONAY "
    		+ "(WORD_INDEX,WORD_LEVEL,WORD,SEARCH_WORD,MEANING,SHORT_VER) values(?,?,?,?,?,?)";
    
    public static void insertToWordDictionary(List<Object[]> word){
    	try{
    		OperateDB.insert(word,INSERT_SQL);
    	}catch(Exception e){
    		e.printStackTrace();
    		throw new RuntimeException("Bei der Verarbeitung der DB-Einfügung ist ein Fehler aufgetreten");
    	}
    }
}

Impressionen

Ich habe ungefähr 330.000 Daten in die Oracle-Tabelle eingefügt, aber die Ausführungszeit betrug ungefähr 102 Sekunden. Übrigens, als Autocommit aktiviert war, war die Ausführungszeit ungefähr doppelt so lang wie 230 Sekunden. Ich konnte anhand der Zahlen erkennen, dass das Aktivieren von Autocommit die Leistung verringert.

Recommended Posts

Einfügen von Eijiros Wörterbuchdaten in Oracle DB Teil2
Fügen Sie die Wörterbuchdaten von Eijiro in eine Oracle-Tabelle ein
Fügen Sie Daten mithilfe der Yaml-Datei in die Datenbank ein
Bis INSERT S3-Objekt in EC2 DB mit Lambda @ java: Java [Teil 2]
Bis das S3-Objekt mit Lambda @ java in Java eingefügt wird: Java [Teil 1]
Versuchen Sie, viele Daten in Cosmos DB zu speichern
Richten Sie einen Db2-DB-Container ein und fügen Sie ein paar Daten ein