J'ai essayé la programmation DB en utilisant EclipseLink car cela semble nécessaire pour les entreprises
J'ai écrit un programme pour insérer le numéro de série de 1 dans la base de données
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("Temps pris%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;
}
}
Si vous l'exécutez tel quel, l'erreur suivante apparaîtra
[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
Apparemment, le résultat de l'exécution en mémoire semble rester dans le cache et la zone de tas semble épuisée. À propos, le nombre de lignes insérées dans la base de données lorsque le tas est épuisé est le suivant.
COUNT(*)
----------
2400001
Apparemment, si vous exécutez l'instruction Insert sans aucune ingéniosité, une erreur se produira dans environ 250 000, même avec une structure de données simple. J'écrirai un plan d'amélioration dans la prochaine entrée
Recommended Posts