Results 1 to 4 of 4

Thread: Roo performance issue. FULL Database Loaded?

Hybrid View

  1. #1
    Join Date
    Jul 2011
    Posts
    18

    Default Roo performance issue. FULL Database Loaded?

    I'm having a show stopper issue with Roo/Spring/Tiles that I really hope someone can help me get past.
    When I use the clinic.roo script with a minor change to accommodate security/user roles I am running into a Hibernate performance problem.

    Recipe to reproduce with Roo 1.2.1.
    Here is the slightly modified clinic script.

    Code:
    	project --topLevelPackage com.springsource.petclinic
    	
    	jpa setup --provider HIBERNATE --database HYPERSONIC_IN_MEMORY
    	
    	enum type --class ~.reference.PetType
    	enum constant --name Dog
    	enum constant --name Cat
    	enum constant --name Bird
    	
    	enum type --class ~.reference.Specialty
    	enum constant --name Cardiology
    	enum constant --name Dentistry
    	enum constant --name Nutrition
    	
    	entity jpa --class ~.domain.Pet --sequenceName PET_SEQ
    	entity jpa --class ~.domain.Visit --sequenceName VISIT_SEQ
    	entity jpa --class ~.domain.AbstractPerson --abstract
    	entity jpa --class ~.domain.Vet --extends ~.domain.AbstractPerson
    	entity jpa --class ~.domain.Owner --extends ~.domain.AbstractPerson
    	entity jpa --class ~.domain.Auth
    	
    	field string --fieldName firstName --sizeMin 3 --sizeMax 30 --class ~.domain.AbstractPerson
    	field string --fieldName lastName --notNull --sizeMin 3 --sizeMax 30
    	field string --fieldName address --notNull --sizeMax 50 --sizeMin 1
    	field string --fieldName city --notNull --sizeMax 30
    	field string --fieldName telephone --notNull
    	field string --fieldName homePage --sizeMax 30
    	field string --fieldName email --sizeMax 30 --sizeMin 6
    	field date --fieldName birthDay --type java.util.Date --notNull
    	
    	field string --fieldName description --sizeMax 255 --class ~.domain.Visit
    	field date --fieldName visitDate --type java.util.Date --notNull --past
    	field reference --fieldName pet --type ~.domain.Pet --notNull
    	field reference --fieldName vet --type ~.domain.Vet
    	
    	field boolean --fieldName sendReminders --notNull --primitive --class ~.domain.Pet
    	field string --fieldName name --notNull --sizeMin 1
    	field number --fieldName weight --type java.lang.Float --notNull --min 0
    	field reference --fieldName owner --type ~.domain.Owner
    	field enum --fieldName type --type ~.reference.PetType --notNull
    	
    	field date --fieldName employedSince --type java.util.Calendar --notNull --past --class ~.domain.Vet
    	field enum --fieldName specialty --type ~.reference.Specialty --notNull false
    	
    	field string --fieldName name --class ~.domain.Auth
    	field set --fieldName owners --type ~.domain.Owner --cardinality MANY_TO_MANY --fetch LAZY
    	
    	field set --class ~.domain.Owner --fieldName pets --type ~.domain.Pet --mappedBy owner --notNull false --cardinality ONE_TO_MANY
    	field set --fieldName roles --type ~.domain.Auth --cardinality MANY_TO_MANY --fetch LAZY --mappedBy "owners"
    	
    	finder add --finderName findPetsByNameAndWeight --class ~.domain.Pet
    	finder add --finderName findPetsByOwner
    	finder add --finderName findPetsBySendRemindersAndWeightLessThan
    	finder add --finderName findPetsByTypeAndNameLike
    	
    	finder add --finderName findVisitsByDescriptionAndVisitDate --class ~.domain.Visit
    	finder add --finderName findVisitsByVisitDateBetween
    	finder add --finderName findVisitsByDescriptionLike
    	
    	web mvc setup
    	web mvc all --package ~.web
    	web mvc finder all
    Add the following properties to the persistence.xml file to view the Hibernate SQL in the log.

    Code:
    	<property name="hibernate.show_sql" value="true"/> 
    	<property name="hibernate.format_sql" value="true"/>
    Run the server -
    Code:
    	mvn jetty:run
    PROBLEM: If you create an Auth object and a couple Owners with a couple Pets when you view one Pet with /pets/1 you can see in the System Log that there will be lots of SQL that query the curricular references and load the full Database. I have all the related entities as FetchType.LAZY but they are still loaded even though they are not being shown on the page.

    Code:
    	Hibernate: 
    	    select
    		pet0_.id as id3_1_,
    		pet0_.name as name3_1_,
    		pet0_.owner as owner3_1_,
    		pet0_.send_reminders as send3_3_1_,
    		pet0_.type as type3_1_,
    		pet0_.version as version3_1_,
    		pet0_.weight as weight3_1_,
    		owner1_.id as id0_0_,
    		owner1_.address as address0_0_,
    		owner1_.birth_day as birth4_0_0_,
    		owner1_.city as city0_0_,
    		owner1_.email as email0_0_,
    		owner1_.first_name as first7_0_0_,
    		owner1_.home_page as home8_0_0_,
    		owner1_.last_name as last9_0_0_,
    		owner1_.telephone as telephone0_0_,
    		owner1_.version as version0_0_ 
    	    from
    		pet pet0_ 
    	    left outer join
    		abstract_person owner1_ 
    		    on pet0_.owner=owner1_.id 
    	    where
    		pet0_.id=?
    	Hibernate: 
    	    select
    		pets0_.owner as owner0_1_,
    		pets0_.id as id1_,
    		pets0_.id as id3_0_,
    		pets0_.name as name3_0_,
    		pets0_.owner as owner3_0_,
    		pets0_.send_reminders as send3_3_0_,
    		pets0_.type as type3_0_,
    		pets0_.version as version3_0_,
    		pets0_.weight as weight3_0_ 
    	    from
    		pet pets0_ 
    	    where
    		pets0_.owner=?
    	Hibernate: 
    	    select
    		roles0_.owners as owners0_1_,
    		roles0_.roles as roles1_,
    		auth1_.id as id1_0_,
    		auth1_.name as name1_0_,
    		auth1_.version as version1_0_ 
    	    from
    		auth_owners roles0_ 
    	    inner join
    		auth auth1_ 
    		    on roles0_.roles=auth1_.id 
    	    where
    		roles0_.owners=?
    	Hibernate: 
    	    select
    		owners0_.roles as roles1_1_,
    		owners0_.owners as owners1_,
    		owner1_.id as id0_0_,
    		owner1_.address as address0_0_,
    		owner1_.birth_day as birth4_0_0_,
    		owner1_.city as city0_0_,
    		owner1_.email as email0_0_,
    		owner1_.first_name as first7_0_0_,
    		owner1_.home_page as home8_0_0_,
    		owner1_.last_name as last9_0_0_,
    		owner1_.telephone as telephone0_0_,
    		owner1_.version as version0_0_ 
    	    from
    		auth_owners owners0_ 
    	    inner join
    		abstract_person owner1_ 
    		    on owners0_.owners=owner1_.id 
    	    where
    		owners0_.roles=?
    	Hibernate: 
    	    select
    		pets0_.owner as owner0_1_,
    		pets0_.id as id1_,
    		pets0_.id as id3_0_,
    		pets0_.name as name3_0_,
    		pets0_.owner as owner3_0_,
    		pets0_.send_reminders as send3_3_0_,
    		pets0_.type as type3_0_,
    		pets0_.version as version3_0_,
    		pets0_.weight as weight3_0_ 
    	    from
    		pet pets0_ 
    	    where
    		pets0_.owner=?
    	Hibernate: 
    	    select
    		roles0_.owners as owners0_1_,
    		roles0_.roles as roles1_,
    		auth1_.id as id1_0_,
    		auth1_.name as name1_0_,
    		auth1_.version as version1_0_ 
    	    from
    		auth_owners roles0_ 
    	    inner join
    		auth auth1_ 
    		    on roles0_.roles=auth1_.id 
    	    where
    		roles0_.owners=?
    When stepping through the debugger it seems that somewhere in JspTilesRequestContext is touching every property in the Hibernate Entity and causing recursive requests.

    Please help. Thanks,
    Ben

  2. #2
    Join Date
    Jul 2011
    Posts
    18

    Default

    Just keep adding an Owner entities all attached to the same Auth entity and watch the SQL log grow and grow for any view of the /pet/{id} page.

    This is crazy.

  3. #3
    Join Date
    Jul 2011
    Posts
    18

    Default

    After some debugging I added a JIRA issue and the fix here - https://jira.springsource.org/browse/ROO-3112
    This should be fixed ASAP as it gives an unfortunate bad first impression of an amazingly productive product.

    With a database of any size the generated code is unusable.

    I love Roo. Keep up the great work.

  4. #4
    Join Date
    Dec 2005
    Posts
    929

    Default

    Removed the unnecessary c:set "sec_object" for ROO-3112
    Alan Stewart
    Spring Roo Committer
    twitter @alankstewart

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •