14 Replies Latest reply on Dec 30, 2005 7:30 PM by Emmanuel Bernard

    Performance problem with mapping -

    Mark Brazil Newbie

      Any help would be great.

      jboss403sp1, using either PostgreSQL 8.1 or Oracle 9i

      When I do a query without any mapping a simply query takes 1 second for 1700 rows.

      I add in a onetoone mapping to another entity which in inself has onetoone and onetomany mappings and suddently the query takes nearly 2 minutes ! (obviously not acceptable)

      If run out of ideas and have tried everything, any suggestions ?




      @OneToOne
      @JoinColumn(name="baleid_fk")
      public Bale getBale() {
      return bale;
      }
      public void setBale(Bale bale) {
      this.bale=bale;
      }


      Bidirectional mapping so the other side has

      @OneToOne(mappedBy="bale")
      public Neps getNeps() {
      return neps;
      }
      public void setNeps(Neps neps) {
      this.neps = neps;
      }


        • 2. Re: Performance problem with mapping -
          Mark Brazil Newbie

           

          "epbernard" wrote:
          fetch=LAZY



          Thanks for the reply.

          I have put the following


          @OneToOne(targetEntity=apps.ejb3.par.Bale.class, fetch=FetchType.LAZY)
          @JoinColumn(name="baleid_fk")
          public Bale getBale() {
          return bale;
          }
          public void setBale(Bale bale) {
          this.bale=bale;
          }



          On the parent side I have

          @OneToOne(mappedBy="bale", targetEntity=apps.ejb3.par.Neps.class, fetch=FetchType.LAZY)
          public Neps getNeps() {
          return neps;
          }
          public void setNeps(Neps neps) {
          this.neps = neps;
          }




          I have tried with and without the targetEntity (makes no difference!)


          I get the following error



          Exception in thread "pool-8-thread-2" java.lang.NoClassDefFoundError: net/sf/cglib/proxy/MethodInterceptor
          at java.lang.ClassLoader.defineClass1(Native Method)
          at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
          at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
          at com.sun.jnlp.JNLPClassLoader.defineClass(JNLPClassLoader.java:314)
          at com.sun.jnlp.JNLPClassLoader.access$100(JNLPClassLoader.java:53)
          at com.sun.jnlp.JNLPClassLoader$1.run(JNLPClassLoader.java:254)
          at java.security.AccessController.doPrivileged(Native Method)
          at com.sun.jnlp.JNLPClassLoader.findClass(JNLPClassLoader.java:247)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
          at com.sun.jnlp.JNLPClassLoader.loadClass(JNLPClassLoader.java:600)
          at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
          at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
          at org.hibernate.proxy.SerializableProxy.readResolve(SerializableProxy.java:55)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:585)




          However I can see from the server.log that all the records where loaded just failed trying to send to the remote client.


          I can't see what I'm doing wrong, but I'm sure its something simple.

          Any ideas ?

          Thanks,
          Mark.

          • 4. Re: Performance problem with mapping -
            Mark Brazil Newbie

            Found the answer, missing another few library's for the remote client.

            For anyone interested :
            I added cglib-2.1_2jboss.jar to the remote clients list of jar's (getting big now!) and the error went away.

            • 5. Re: Performance problem with mapping -
              Mark Brazil Newbie

               

              "epbernard" wrote:
              fetch=LAZY



              Finally now in a position to test this LAZY option.

              I have the following

              Neps - OneToOne mapping to bale

              bale - ManyToOne mapping to module

              LAZY fetch turned on for neps to bale and bale to neps

              EAGER fetch turned on for bale to module and module to bale

              (also tried
              LAZY fetch turned on for bale to module and module to bale )


              I'm getting the follow error


              30/11/2005 18:00:22 org.hibernate.LazyInitializationException
              SEVERE: could not initialize proxy - no Session
              org.hibernate.LazyInitializationException: could not initialize proxy - no Session
              at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:53)
              at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:98)
              at org.hibernate.proxy.CGLIBLazyInitializer.intercept(CGLIBLazyInitializer.java:133)
              at apps.ejb3.par.Bale$$EnhancerByCGLIB$$9018b5df.getModule()
              at apps.client.NepsClient$TableModel.getValueAt(Unknown Source)
              at apps.TableSorter.getValueAt(Unknown Source)
              at javax.swing.JTable.getValueAt(JTable.java:1852)
              at javax.swing.JTable.prepareRenderer(JTable.java:3902)
              at javax.swing.plaf.basic.BasicTableUI.paintCell(BasicTableUI.java:1985)
              at javax.swing.plaf.basic.BasicTableUI.paintCells(BasicTableUI.java:1887)
              at javax.swing.plaf.basic.BasicTableUI.paint(BasicTableUI.java:1810)
              at javax.swing.plaf.ComponentUI.update(ComponentUI.java:142)
              at javax.swing.JComponent.paintComponent(JComponent.java:742)
              at javax.swing.JComponent.paint(JComponent.java:1005)
              at javax.swing.JComponent.paintChildren(JComponent.java:842)
              at javax.swing.JComponent.paint(JComponent.java:1014)
              at javax.swing.JViewport.paint(JViewport.java:728)
              at javax.swing.JComponent.paintChildren(JComponent.java:842)
              at javax.swing.JComponent.paint(JComponent.java:1014)
              at javax.swing.JComponent.paintWithOffscreenBuffer(JComponent.java:4963)
              at javax.swing.JComponent.paintDoubleBuffered(JComponent.java:4916)
              at javax.swing.JComponent._paintImmediately(JComponent.java:4859)
              at javax.swing.JComponent.paintImmediately(JComponent.java:4666)
              at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:451)
              at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:114)
              at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
              at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
              at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
              at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
              at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
              at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
              at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

              • 6. Re: Performance problem with mapping -
                Mark Brazil Newbie

                Am I doing something wrong. It seems this should be simple ?

                Simply trying to have

                A mapped to B

                B mapped to C
                B mapped to D

                Querying C and getting details from B and A.

                Fetch=EAGER gives terrible response times, i.e. a couple of minutes for a simple query. Or Fetch=LAZY throws exception !


                Anyone ?

                • 7. Re: Performance problem with mapping -
                  Mark Brazil Newbie

                  I know now that fetch=LAZY is not an option for remote clients.

                  However I still have the following

                  A mapped to B
                  A mapped to F

                  B mapped to C
                  B mapped to D
                  B mapped to E

                  Querying C and getting details from B and A.


                  When I run this query it fetches 1696 rows. This however issues 3392 sql queries one for C-b-a and one for the other joins from b.

                  Is there a way I can fetch groups of records with ejb3. I could do this with xdoclet & ejb2.1 with the read-ahead page-size option.

                  Is there a similar option for ejb3 ?

                  I don't really want to be excuting this number of sql statments against the database.

                  Regards,
                  Mark.

                  • 8. Re: Performance problem with mapping -
                    Mark Brazil Newbie

                     

                    "markbrazil" wrote:
                    I know now that fetch=LAZY is not an option for remote clients.

                    However I still have the following

                    A mapped to B
                    A mapped to F

                    B mapped to C
                    B mapped to D
                    B mapped to E

                    Querying C and getting details from B and A.


                    When I run this query it fetches 1696 rows. This however issues 3392 sql queries one for C-b-a and one for the other joins from b.

                    Is there a way I can fetch groups of records with ejb3. I could do this with xdoclet & ejb2.1 with the read-ahead page-size option.

                    Is there a similar option for ejb3 ?

                    I don't really want to be excuting this number of sql statments against the database.

                    Regards,
                    Mark.




                    @BatchSize(size=100)

                    This has helped but there are still 1716 sql statments issued.
                    and each statment includes all tables a,b,c,d,e,f (with outer joins).

                    I also changed my query to include the 3 tables I want

                    "select c from C as c join c.b as b left join b.a as a"

                    Is it possible to limit the query to just this, rather than jboss adding in all outer joins to tables d,e,f ?




                    • 9. Re: Performance problem with mapping -
                      Gavin King Master

                      You need to learn Hibernate.

                      I recommend you just get Hibernate in Action and save yourself hours of randomly pressing different switches without really understanding how the whole machine fits together.

                      • 10. Re: Performance problem with mapping -
                        Mark Brazil Newbie

                         

                        "gavin.king@jboss.com" wrote:
                        You need to learn Hibernate.

                        I recommend you just get Hibernate in Action and save yourself hours of randomly pressing different switches without really understanding how the whole machine fits together.


                        rtfm in the user forum, that's helpful.



                        • 11. Re: Performance problem with mapping -
                          Darran Lofthouse Master

                           

                          "markbrazil" wrote:

                          rtfm in the user forum, that's helpful.


                          Just because this is a user forum does not mean you should skip reading the manual.

                          • 12. Re: Performance problem with mapping -
                            Mark Brazil Newbie

                            fyi, I've read what's available online, I searched forums I've googled. The book mentioned is not available.

                            Our app works we just have a few performance problems with ejb3.

                            I though the thing to do was to post a question on the user forum, after all most other people do the same !

                            But instead of getting help we get nothing.

                            Whats the point in having a user forum if a user cannot post a question without getting told to read the damn manual.







                            "darranl" wrote:
                            "markbrazil" wrote:

                            rtfm in the user forum, that's helpful.


                            Just because this is a user forum does not mean you should skip reading the manual.


                            • 13. Re: Performance problem with mapping -
                              Scott Stark Master

                              As a guide to what is required to get more than an rtfm, see:
                              http://wiki.jboss.org/wiki/Wiki.jsp?page=JBossHelp