[JAVA] DB-Programmierung mit EclipseLink Teil1

Am Anfang

Ich habe versucht, die DB mit EclipseLink zu programmieren, da dies für das Geschäft notwendig zu sein scheint

Beispielprogramm

Ich habe ein Programm geschrieben, um die Seriennummer 1 in die Datenbank einzufügen

InsertLogic.java


package logic;

import java.util.Date;
import java.util.stream.Stream;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import entiry.SequeceNum;


public class InsertLogic {
	public static void main(String args[]){
		new InsertLogic().doLogic();
	}

	public void doLogic(){
		EntityManagerFactory factory = Persistence.createEntityManagerFactory("myUnitInPersistenceXML");
		EntityManager em = factory.createEntityManager();
		long start =System.currentTimeMillis();
		System.out.println("insert start");
		em.getTransaction().begin();
		
    	Stream.iterate(1l, s->s+1)
    	.limit(1000000000000l)
    	.map(i->createSequeceNum(i))
    	.forEach(o->doInsert(em,o));
		System.out.println("insert End");
		long ends =System.currentTimeMillis();
		System.out.println(String.format("Zeit genommen%d", (ends - start)));
    	
	}
	
	private static SequeceNum createSequeceNum(long i){
		SequeceNum myEntity = new SequeceNum();
		myEntity.setId(i);
		return myEntity;
	}
	private static void doInsert(EntityManager em,SequeceNum entity){
		em.persist(entity);
		if(entity.getId()%100000 == 0){
			em.getTransaction().commit();
			em.getTransaction().begin();
		}
	}
}

SequeceNum.java


package entiry;

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class SequeceNum {
	@Id
	private long id;

	public long getId() {
		return id;
	}

	public void setId(long id) {
		this.id = id;
	}
}

Wenn Sie es so ausführen, wie es ist, wird der folgende Fehler angezeigt

[EL Info]: 2017-12-03 21:56:37.505--ServerSession(336400944)--EclipseLink, version: Eclipse Persistence Services - 2.5.1.v20130918-f2b9fc5
[EL Info]: connection: 2017-12-03 21:56:38.156--ServerSession(336400944)--file:/C:/Users/takayoshi/workspace/Pazzle/bin/_myUnitInPersistenceXML login successful
insert start
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
	at org.eclipse.persistence.internal.descriptors.ObjectBuilder.createObjectChangeSet(ObjectBuilder.java:2872)
	at org.eclipse.persistence.descriptors.changetracking.DeferredChangeDetectionPolicy.createObjectChangeSetThroughComparison(DeferredChangeDetectionPolicy.java:155)
	at org.eclipse.persistence.descriptors.changetracking.DeferredChangeDetectionPolicy.createObjectChangeSet(DeferredChangeDetectionPolicy.java:146)
	at org.eclipse.persistence.descriptors.changetracking.DeferredChangeDetectionPolicy.calculateChanges(DeferredChangeDetectionPolicy.java:91)
	at org.eclipse.persistence.descriptors.changetracking.DeferredChangeDetectionPolicy.calculateChangesForExistingObject(DeferredChangeDetectionPolicy.java:56)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:664)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitToDatabaseWithChangeSet(UnitOfWorkImpl.java:1516)
	at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.commitRootUnitOfWork(RepeatableWriteUnitOfWork.java:277)
	at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.commitAndResume(UnitOfWorkImpl.java:1169)
	at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.commit(EntityTransactionImpl.java:132)
	at logic.InsertLogic.doInsert(InsertLogic.java:43)
	at logic.InsertLogic.lambda$2(InsertLogic.java:28)
	at logic.InsertLogic$$Lambda$6/2137034273.accept(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(Unknown Source)
	at java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.util.stream.SliceOps$1$1.accept(Unknown Source)
	at java.util.Spliterators$IteratorSpliterator.tryAdvance(Unknown Source)
	at java.util.stream.ReferencePipeline.forEachWithCancel(Unknown Source)
	at java.util.stream.AbstractPipeline.copyIntoWithCancel(Unknown Source)
	at java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)
	at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)
	at java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.util.stream.ReferencePipeline.forEach(Unknown Source)
	at logic.InsertLogic.doLogic(InsertLogic.java:28)
	at logic.InsertLogic.main(InsertLogic.java:15)
[EL Info]: connection: 2017-12-03 22:23:39.469--ServerSession(336400944)--file:/C:/Users/takayoshi/workspace/Pazzle/bin/_myUnitInPersistenceXML logout successful

Anscheinend scheint das Ergebnis der Ausführung im Speicher im Cache zu bleiben, und der Heap-Bereich scheint erschöpft zu sein. Übrigens ist die Anzahl der Zeilen, die in den DB eingefügt werden, wenn der Heap erschöpft ist, wie folgt.

  COUNT(*)
----------
   2400001

Wenn Sie die Insert-Anweisung ohne Einfallsreichtum ausführen, tritt anscheinend auch bei einer einfachen Datenstruktur ein Fehler bei etwa 250.000 auf. Ich werde im nächsten Eintrag einen Verbesserungsplan schreiben

Recommended Posts

DB-Programmierung mit EclipseLink Teil1
Versuchen Sie es mit Talend Teil 2
DB-Zugriff mit Exposed
Versuchen Sie es mit Talend Teil 1
[Vollständige Programmierung] §2 Versuchen Sie es mit Ruby
Schreiben Sie Ruby-Methoden mit C (Teil 1)
[Vollständige Programmierung] §3 Berechnen wir mit Ruby!
Greifen Sie über das Repository mit Spring Data auf die Datenbank zu.
Zusammenfassung der objektorientierten Programmierung mit Java