Skip to main content

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

Distinct is used to filter possible duplicates.


Thomas Paradies-2 wrote:
> 
> James,
> 
> that was it, thank you for the hint. But what's it with the distinct state
> setting at nested queries?
> 
> Thomas
> 
> 
> 
> ----- Original Message ----
> From: James Sutherland <jamesssss@xxxxxxxxx>
> To: eclipselink-users@xxxxxxxxxxx
> Sent: Monday, October 20, 2008 3:57:40 PM
> Subject: Re: [eclipselink-users] fetch size setting without effect
> 
> 
> I think the issue is the nested query is already prepared, so you need to
> set
> the fetch size into the call, instead of the query.
> 
> q.getCall().setResultSetFetchSize(5000);
> 
> 
> Thomas Paradies-2 wrote:
>> 
>> 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 bs;
>>    
>>     public List 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  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  as = (List ) getServerSession().executeQuery(query);
>>         return as;
>>     }
>> 
>>     public List findAllBsForAs() {
>>         ReadAllQuery query = new ReadAllQuery(B.class);
>>         query.setFetchSize(5000);
>>         query.prepareCall(getServerSession(), null);
>>         List bs = (List) 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
> 


-----
---
http://wiki.eclipse.org/User:James.sutherland.oracle.com James Sutherland 
http://www.eclipse.org/eclipselink/
 EclipseLink ,  http://www.oracle.com/technology/products/ias/toplink/
TopLink 
Wiki:  http://wiki.eclipse.org/EclipseLink EclipseLink , 
http://wiki.oracle.com/page/TopLink TopLink 
Forums:  http://forums.oracle.com/forums/forum.jspa?forumID=48 TopLink , 
http://www.nabble.com/EclipseLink-f26430.html EclipseLink 
Book:  http://en.wikibooks.org/wiki/Java_Persistence Java Persistence 
-- 
View this message in context: http://www.nabble.com/fetch-size-setting-without-effect-tp20032090p20089934.html
Sent from the EclipseLink - Users mailing list archive at Nabble.com.



Back to the top