I do read your Instructions "Keep the test as simple as possible - remove unnecessary code"!
Ok, Class of Nodes:
package fpg;
import java.util.List;
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
@DiscriminatorColumn(discriminatorType=DiscriminatorType.INTEGER,name="type")
@DiscriminatorValue(value="0")
public class Nodes {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
@ManyToOne
@JoinColumn(name="parent")
protected Nodes parent;
@OneToMany(mappedBy="parent",fetch=FetchType.EAGER)
protected List<Nodes> Sons;
public int getId() {
return id;
}
public Nodes getParent() {
return parent;
}
public List<Nodes> getSons() {
return Sons;
}
public void setId(int id) {
this.id = id;
}
public void setParent(Nodes parent) {
this.parent = parent;
}
public void setSons(List<Nodes> Sons) {
this.Sons = Sons;
}
@Override
public String toString() {
return getId()+"";
}
}
test codes:
package src.run;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import fpg.Nodes;
/**
* @author [email protected]
*
*/
public class testNodes {
private static EntityManager em = SingleManager.getEntityManager();
private static int iBlock;
private static Random rd;
private static EntityTransaction trans = SingleManager.getTrans();
private static int iBegin = 0;
private static void generateBtree(final int iLevel) {
long start = System.currentTimeMillis();
LinkedList<Nodes> queue = new LinkedList<Nodes>();
trans.begin();
Nodes parent = new Nodes();
em.persist(parent);
queue.add(parent);
int iNum = 0;
int iCnt = 0;
while (queue.size()>0){
Nodes cur = queue.pop();
Nodes left = new Nodes();
left.setParent(cur);
em.persist(left);
++iNum;
Nodes right = new Nodes();
right.setParent(cur);
em.persist(right);
++iNum;
if (iLevel>iCnt ){
queue.add(left);
queue.add(right);
iCnt += 2;
}
if ( (iNum & 0xFFF) ==0){
System.out.printf("%d @ %s %n", iNum, (System.currentTimeMillis()-start)/1000f);
trans.commit();
em.clear();
trans.begin();
}
}
trans.commit();
System.out.printf("Total: %d, Level:%d %n", iNum, iLevel);
float timecost = (System.currentTimeMillis()-start)/1000f;
System.out.printf("Insert: %f objects per second %n", iNum/timecost);
}
private static void getSons0() {
System.out.printf("===========%n");
int iSum = 0;
for (int i=0;i<3*iBlock;i++){
long start = System.currentTimeMillis();
Nodes o = em.find(Nodes.class, i+1);
System.out.printf("find time @ %f %n", (System.currentTimeMillis()-start)/1000f);
if (null== o){
System.out.printf("%s is not Nodes %n", o);
continue;
}
em.refresh(o);
start = System.currentTimeMillis();
List<Nodes> sons = o.getSons();
System.out.printf("getSons time @ %f %n", (System.currentTimeMillis()-start)/1000f);
if (null==sons) continue;
int iCnt = sons.size();
System.out.printf("%d : type:Nodes, sons:%d %n",i+1, iCnt);
iSum += iCnt;
start = System.currentTimeMillis();
Iterator<Nodes> it = sons.iterator();
while (it.hasNext()){
Nodes en = it.next();
System.out.printf("child : %d %n", en.getId());
}
System.out.printf("Iterator time @ %f %n", (System.currentTimeMillis()-start)/1000f);
}
System.out.printf("The sum : %d %n", iSum);
System.out.println();
}
public static void main(String[] args) {
rd = new Random();
iBlock = 3;
generateBtree(1<<11);
getSons0();
SingleManager.close();
}
}
Results:
4096 @ 0.204
8192 @ 0.329
12288 @ 0.391
16384 @ 0.422
Total: 16386, Level:8192
Insert: 36092.511719 objects per second
===========
find time @ 213.406006
getSons time @ 0.000000
1 : type:Nodes, sons:2
child : 2
child : 3
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
2 : type:Nodes, sons:2
child : 4
child : 5
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
3 : type:Nodes, sons:2
child : 6
child : 7
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
4 : type:Nodes, sons:2
child : 8
child : 9
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
5 : type:Nodes, sons:2
child : 10
child : 11
Iterator time @ 2.219000
find time @ 0.000000
getSons time @ 0.000000
6 : type:Nodes, sons:2
child : 12
child : 13
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
7 : type:Nodes, sons:2
child : 14
child : 15
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
8 : type:Nodes, sons:2
child : 16
child : 17
Iterator time @ 0.000000
find time @ 0.000000
getSons time @ 0.000000
9 : type:Nodes, sons:2
child : 18
child : 19
Iterator time @ 0.000000
The sum : 18
Error opening zip file or JAR manifest missing: /E:/projects/ObjectDB/bin/objectdb.jar