openjpa-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rick Curtis <curti...@gmail.com>
Subject Re: N+1 select problem for Map no matter what I try
Date Thu, 17 Feb 2011 16:26:31 GMT
Heno -

It looks like this is the expected behavior. Keep an eye on OPENJPA-1920 for
any changes that we may try to make in this area.

Thanks,
Rick

On Thu, Feb 17, 2011 at 8:37 AM, Henno Vermeulen <henno@huizemolenaar.nl>wrote:

> That's great, thank you for your time!
>
> Heno
>
> -----Oorspronkelijk bericht-----
> Van: Rick Curtis [mailto:curtisr7@gmail.com]
> Verzonden: donderdag 17 februari 2011 15:36
> Aan: users@openjpa.apache.org
> Onderwerp: Re: N+1 select problem for Map no matter what I try
>
> Ok, now I was able to recreate the behavior that you reported... I'll dig
> into this a little more and get back with you.
>
> Thanks,
> Rick
>
> On Thu, Feb 17, 2011 at 4:25 AM, Henno Vermeulen <henno@huizemolenaar.nl
> >wrote:
>
> > Thank you for your reply! I tried and it unfortunately doesn't work. I
> > stripped my example down to the bare minimum. I am using OpenJPA 2.0.0
> > (downloaded openjpa-all using Maven).
> > In my real application I use compile time enhancement and mssql server, I
> > am running this test with hsqldb and openjpa as javaagent
> >
> (-javaagent:C:/Users/h.vermeulen/.m2/repository/org/apache/openjpa/openjpa-all/2.0.0/openjpa-all-2.0.0.jar).
> >
> > Here are my classes and settings:
> >
> > Persistence.xml:
> > <persistence xmlns="http://java.sun.com/xml/ns/persistence"
> >        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
> >        xsi:schemaLocation="
> http://java.sun.com/xml/ns/persistencepersistence_1_0.xsd"
> >        version="1.0">
> >
> >        <persistence-unit name="testPU">
> >
> >  <provider>org.apache.openjpa.persistence.PersistenceProviderImpl
> >                </provider>
> >                <class>entities.TestEntity</class>
> >                <exclude-unlisted-classes>true</exclude-unlisted-classes>
> >                <properties>
> >                        <property name="openjpa.jdbc.SynchronizeMappings"
> > value="buildSchema" />
> >                        <property name="openjpa.ConnectionDriverName"
> > value="org.hsqldb.jdbcDriver" />
> >                        <property name="openjpa.ConnectionURL"
> > value="jdbc:hsqldb:mem:test" />
> >                        <property name="openjpa.ConnectionUserName"
> > value="sa" />
> >                        <property name="openjpa.ConnectionPassword"
> value=""
> > />
> >                        <property name="openjpa.Log"
> > value="DefaultLevel=TRACE" />
> >                </properties>
> >        </persistence-unit>
> > </persistence>
> >
> > TestEntity.java:
> > package entities;
> >
> > import java.util.HashMap;
> > import java.util.Map;
> >
> > import javax.persistence.CascadeType;
> > import javax.persistence.Entity;
> > import javax.persistence.FetchType;
> > import javax.persistence.GeneratedValue;
> > import javax.persistence.Id;
> >
> > import org.apache.openjpa.persistence.PersistentMap;
> >
> > @Entity
> > public class TestEntity {
> >
> >        @Id
> >        @GeneratedValue
> >        private Long id;
> >
> >        @PersistentMap(elementCascade = CascadeType.PERSIST, fetch =
> > FetchType.EAGER)
> >         private Map<String, String> strings = new HashMap<String,
> > String>();
> >
> >        public TestEntity() {
> >        }
> >
> >        public Long getId() {
> >                return id;
> >        }
> >
> >        public Map<String, String> getStrings() {
> >                return strings;
> >        }
> >
> > }
> >
> > MapPerformanceTest.java:
> > import java.util.List;
> >
> > import javax.persistence.EntityManagerFactory;
> > import javax.persistence.Persistence;
> >
> > import org.apache.openjpa.persistence.OpenJPAEntityManager;
> >
> > import entities.TestEntity;
> >
> > public class MapPerformanceTest {
> >        private EntityManagerFactory factory;
> >
> >        public void createEntityManagerFactory() {
> >                factory = Persistence.createEntityManagerFactory("testPU",
> > System
> >                                .getProperties());
> >        }
> >
> >        private void persistInTransaction(TestEntity item) {
> >                OpenJPAEntityManager em = (OpenJPAEntityManager) factory
> >                                .createEntityManager();
> >                em.getTransaction().begin();
> >                em.persist(item);
> >                em.getTransaction().commit();
> >                em.close();
> >        }
> >
> >        private void createEntities() {
> >                for (int i = 0; i < 100; i++) {
> >                        TestEntity entity = new TestEntity();
> >                        entity.getStrings().put("a", "test " + i);
> >                        entity.getStrings().put("b", "another test " + i);
> >                        persistInTransaction(entity);
> >                }
> >        }
> >
> >        private List<TestEntity> findAllEntities() {
> >                OpenJPAEntityManager em = (OpenJPAEntityManager) factory
> >                                .createEntityManager();
> >                em.getTransaction().begin();
> >                String query = "SELECT z FROM " +
> > TestEntity.class.getSimpleName()
> >                                + " z";
> >                List<TestEntity> result = em.createQuery(query,
> > TestEntity.class)
> >                                .getResultList();
> >                em.getTransaction().commit();
> >                em.close();
> >                return result;
> >        }
> >
> >        public static void main(String[] args) {
> >                MapPerformanceTest t = new MapPerformanceTest();
> >                t.createEntityManagerFactory();
> >                t.createEntities();
> >                System.err.println("----------- find all -----------");
> >                t.findAllEntities();
> >        }
> > }
> >
> >
> > Henno Vermeulen
> >
> > -----Oorspronkelijk bericht-----
> > Van: Rick Curtis [mailto:curtisr7@gmail.com]
> > Verzonden: woensdag 16 februari 2011 16:49
> > Aan: users@openjpa.apache.org
> > Onderwerp: Re: N+1 select problem for Map no matter what I try
> >
> > Can you try using  @PersistentMap(elementCascade =
> > CascadeType.PERSIST,fetch=FetchType.EAGER) rather than
> @ElementCollection?
> > I
> > don't see the N+1 select problem in my tests when using the persistentmap
> > annotation.
> >
> > Thanks,
> > Rick
> >
> > On Wed, Feb 16, 2011 at 8:36 AM, Henno Vermeulen <henno@huizemolenaar.nl
> > >wrote:
> >
> > > When I have a Map inside a TestEntity (mapped either with @OneToMany or
> > > @ElementCollection), OpenJPA 2 always performs N + 1 selects when I do
> > the
> > > simple query "SELECT z FROM TestEntity z".
> > >
> > > A solution to this would of course be great, but I would also be very
> > happy
> > > if an OpenJPA developer could quickly try this out and confirm to me
> > whether
> > > or not this is indeed an issue with OpenJPA or that it is simply
> expected
> > > behavior.
> > >
> > > Regards,
> > > Henno Vermeulen
> > >
> > > (p.s. I have tried many settings and the problem occurs no matter what
> I
> > > try. See https://issues.apache.org/jira/browse/OPENJPA-1920 and my
> > > unanswered post "preventing N+1 select performance problem on maps").
> > >
> > >
> >
>

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message