Thanks - I thought that this is (was) a bug. Jan
2010/2/19 Clinton Begin <clinton.be...@gmail.com> > That might have been a bug just recently fixed. Try out the trunk. The > lazy loader was heavily optimized for both performance and memory usage. > > Clinton > > 2010/2/18 Ing. Jan Novotný <novotn...@gmail.com> > >> Thank you for answer. I understand now why all data were loaded at the >> first touch to the object and not at time when particular property is >> needed. But I still don't undestand why iBatis make two same select queries >> to the database (see the log please) - this might hit a performance in some >> cases. I still don't see the point. >> Thanks. >> >> Jan >> >> 2010/2/18 Clinton Begin <clinton.be...@gmail.com> >> >>> This was a topic of much debate. It does that to allow internal >>> references to private fields. But some people don't like that behavior, so >>> in the next release (or in trunk if you want to check it out and build it), >>> there's a configuration switch. The docs are already updated, so look for >>> the aggressiveLazyLoad setting. >>> >>> >>> Clinton >>> >>> 2010/2/18 Ing. Jan Novotný <novotn...@gmail.com> >>> >>>> Hello again, >>>> >>>> >>>> I've found that for lazily loaded objects triggers multiple >>>> unnecessary selects and are executed all at load time not at the time, when >>>> I touch the property. I use 3-beta-9 and my settings are following: >>>> >>>> <settings> >>>> <setting name="cacheEnabled" value="true"/> >>>> <setting name="lazyLoadingEnabled" value="true"/> >>>> <setting name="multipleResultSetsEnabled" value="true"/> >>>> <setting name="useColumnLabel" value="true"/> >>>> <setting name="useGeneratedKeys" value="false"/> >>>> </settings> >>>> >>>> <resultMap id="thinProductLazyLoaded" type="product"> >>>> <id property="id" column="id"/> >>>> <result property="name" column="name"/> >>>> <association property="group" column="idGroup" javaType="group" >>>> >>>> select="cz.novoj.ibatis.ProductGroupMapper.getGroupById"/> >>>> </resultMap> >>>> >>>> <select id="getLazyProductById" parameterType="int" >>>> resultMap="thinProductLazyLoaded"> >>>> select * from product where id = #{id} >>>> </select> >>>> >>>> <select id="getGroupById" parameterType="int" resultType="group"> >>>> select * from productGroup where id = #{id} >>>> </select> >>>> >>>> Test: >>>> >>>> @Test >>>> public void testGetLazyProductById() throws Exception { >>>> Product product = productMapper.getLazyProductById(1); >>>> assertNotNull(product); >>>> System.out.println("#1"); >>>> assertEquals(1, (int)product.getId()); >>>> System.out.println("#2"); >>>> assertEquals("Lenovo ThinkCentre 250GB Serial ATA Hard Disk >>>> Drive", product.getName()); >>>> assertNotNull(product.getGroup()); >>>> System.out.println("#3"); >>>> assertEquals("HDD", product.getGroup().getName()); >>>> assertEquals("HARDWARE", product.getGroup().getGroupType()); >>>> assertNull(product.getTags()); >>>> } >>>> >>>> Output: >>>> >>>> DEBUG [main][2010-02-18 14:42:34,140][java.sql.Connection]: ooo >>>> Connection Opened >>>> DEBUG [main][2010-02-18 14:42:34,234][java.sql.PreparedStatement]: ==> >>>> Executing: select * from product where id = ? >>>> DEBUG [main][2010-02-18 14:42:34,234][java.sql.PreparedStatement]: ==> >>>> Parameters: 1(Integer) >>>> DEBUG [main][2010-02-18 14:42:34,250][java.sql.ResultSet]: <== >>>> Columns: ID, NAME, IDGROUP >>>> DEBUG [main][2010-02-18 14:42:34,250][java.sql.ResultSet]: <== >>>> Row: 1, Lenovo ThinkCentre 250GB Serial ATA Hard Disk Drive, 1 >>>> DEBUG [main][2010-02-18 14:42:34,359][java.sql.Connection]: xxx >>>> Connection Closed >>>> #1 >>>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.Connection]: ooo >>>> Connection Opened >>>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.PreparedStatement]: ==> >>>> Executing: select * from productGroup where id = ? >>>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.PreparedStatement]: ==> >>>> Parameters: 1(Integer) >>>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.ResultSet]: <== >>>> Columns: ID, NAME, GROUPTYPE >>>> DEBUG [main][2010-02-18 14:42:34,375][java.sql.ResultSet]: <== >>>> Row: 1, HDD, HARDWARE >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.Connection]: xxx >>>> Connection Closed >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.Connection]: ooo >>>> Connection Opened >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.PreparedStatement]: ==> >>>> Executing: select * from productGroup where id = ? >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.PreparedStatement]: ==> >>>> Parameters: 1(Integer) >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.ResultSet]: <== >>>> Columns: ID, NAME, GROUPTYPE >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.ResultSet]: <== >>>> Row: 1, HDD, HARDWARE >>>> DEBUG [main][2010-02-18 14:42:34,390][java.sql.Connection]: xxx >>>> Connection Closed >>>> #2 >>>> #3 >>>> >>>> Could someone explain how lazy really loading works? As I see, the >>>> lazy loading paradigm has changed a lot since iBatis 2.x >>>> >>>> Jan >>>> >>>> -- >>>> -------------------------------------------------------------- >>>> Ing. Jan Novotný >>>> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >>>> http://blog.novoj.net >>>> Myšlenky dne otce Fura >>>> -------------------------------------------------------------- >>>> >>> >>> >> >> >> -- >> -------------------------------------------------------------- >> Ing. Jan Novotný >> @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ >> http://blog.novoj.net >> Myšlenky dne otce Fura >> -------------------------------------------------------------- >> > > -- -------------------------------------------------------------- Ing. Jan Novotný @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ http://blog.novoj.net Myšlenky dne otce Fura --------------------------------------------------------------