Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[eclipselink-users] fetch size setting without effect

Hi,

it seems that fetch size setting at an embedded batch query wouldn't have the expected effect.

To demonstrate the issue I've constructed a very simple szenario with two entities A and B with an One(A)ToMany(B) relationship between them. 

@Entity @Table(name = "T0")
public class A {
    @Id @Column(name = "A_ID")
    private long id;
    
    @OneToMany(mappedBy = "a")
    private List<B> bs;
    
    public List<B> getBs() { return bs; }
}

@Entity @Table(name = "T1")
public class B {
    @Id @Column(name = "B_ID")
    private long id;

    @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "A_ID")
    private A a;
    
    public A getA() { return a; }
}

The code fragment below shows two findAll methods - one should retrieve all As and as result all related Bs and the other should get all Bs with all related As (but just lazy).
....   
    public List<A> findAllAs() {
        ReadAllQuery query = new ReadAllQuery(A.class);
        query.setFetchSize(500);
        query.addBatchReadAttribute(builder.get("bs"));
        query.prepareCall(getServerSession(), null);
        Map map = query.getBatchReadMappingQueries();
        if (map != null) {
            for (Object key : map.keySet()) {
                if (key.equals("bs")) {
                    ReadAllQuery q = (ReadAllQuery) map.get(key);
                    q.setFetchSize(5000);
                }
            }
        }
        List<A> as = (List<A>) getServerSession().executeQuery(query);
        return as;
    }

    public List<B> findAllBsForAs() {
        ReadAllQuery query = new ReadAllQuery(B.class);
        query.setFetchSize(5000);
        query.prepareCall(getServerSession(), null);
        List<B> bs = (List<B>) getServerSession().executeQuery(query);
        return bs;
    }
....

With the profiling done for each of the methods using PerformanceProfiler and EclipseLink log I got the following outputs (for clarification only the relevant parts are shown)

- for findAllAs() the profiler output for embedded batch query
....
Begin profile of{ReadAllQuery(com.mons.entity.B)
[EL Fine]: 2008.10.17 09:46:59.422--Connection(26188661)--SELECT t0.B_ID FROM T0 t0, T1 t1 WHERE (t0.A_ID = t1.A_ID)
Profile(ReadAllQuery,
    class=com.mons.entity.B,
    number of objects=4721,
    total time=33733,
    local time=33733,
    profiling time=16,
    row fetch=33139,
    object building=267,
    cache=111,
    logging=32,
    sql execute=265,
    time/object=7,
    objects/second=139,
)
}End profile
....

- for findAllBsForAs() the profiler output for main query
....
Begin profile of{ReadAllQuery(com.mons.entity.B)
[EL Fine]: 2008.10.17 09:49:33.102--Connection(19351067)--SELECT t0.B_ID FROM T0 t0, T1 t1 WHERE  (t1.A_ID = t0.A_ID))
Profile(ReadAllQuery,
    class=com.mons.entity.B,
    number of objects=4721,
    total time=1530,
    local time=1530,
    cache=173,
    sql prepare=172,
    row fetch=63,
    sql execute=921,
    object building=343,
    logging=31,
    objects/second=3085,
)
....

The query string for findAllAs() equals the query string of findAllBsForAs() and the fetch size setting is even for both of them. Nevertheless the "row fetch" value in the profile of the batch query is 33139 (near 33733 for "total time" so I'm assuming the unit is ms) but only 63 (1530 total) for the direct query. With an fetch size of 5000 for 4721 retrieved objects the second value but not the first is as I would expecting...

My question is: Am i doing something wrong, am I missing something, or maybe this is a bug?

I'm grateful for any idea or suggestion, 

Thomas


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 



Back to the top