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.
Wenn Sie einfach schreiben, was Sie tun möchten
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);
}
}
}
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)
Ü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).
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");
}
}
}
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