On 3.8.2010 0:27, jsloyer wrote:
I am using WebSphere Application Server.  When a request comes to a servlet,
the servlet calls my Broker Class.  Inside the broker class I have the
entity manager and some transaction (below).  I am running into issues where
multiple transactions are going on at once.  How can I fix this?

You are using Singleton pattern to access entity manager, which means that in a multi-threaded environment multiple threads might access the same EM at the same time. JPA specification says this is wrong:

"An entity manager may not be shared among multiple concurrently executing threads. Entity managers may only be accessed in a single-threaded manner."

Since you are using JavaEE AS, look at the resource injection capabilities (annotation @PersistenceContext), and use stateless session beans instead of singleton (annotation @Stateless).

-Ognjen



Call from the servlet.
Broker.getInstance().getAllSegments();  //this returns a list of POJO
objects

Broker
public class Broker {
         private EntityManagerFactory factory;
         private EntityManager em;
         private static Broker instance = new Broker();
        
         public Broker() {
             factory = Persistence.createEntityManagerFactory("myFactory",
System.getProperties());
             em = factory.createEntityManager();
         }
         public static Broker getInstance() {
             return instance;
         }
.....

public List<Segment>  getAllSegments() {
                 Query q = em.createQuery("SELECT segment FROM Segment segment 
ORDER BY
segment.name");
                 return (List<Segment>) q.getResultList();
         }

Reply via email to