buildframework/helium/sf/java/jpa/src/com/nokia/helium/jpa/ORMReader.java
branchhelium-9.0
changeset 618 df88fead2976
parent 587 85df38eb4012
--- a/buildframework/helium/sf/java/jpa/src/com/nokia/helium/jpa/ORMReader.java	Tue Apr 27 08:33:08 2010 +0300
+++ b/buildframework/helium/sf/java/jpa/src/com/nokia/helium/jpa/ORMReader.java	Thu Jul 22 17:08:43 2010 +0300
@@ -22,7 +22,7 @@
 import org.apache.log4j.Logger;
 import java.util.List;
 import javax.persistence.Query;
-
+import javax.persistence.FlushModeType;
 /**
  * This class provides an interface to read data from the 
  * database using JPA.
@@ -36,11 +36,14 @@
     private ORMEntityManager manager;
     
     private int startPos;
+    
+    private String dbPath;
 
     /**Constructor:
      * @param dbPath - path of the database to connect to.
      */
-    public ORMReader(String dbPath) {
+    public ORMReader(String path) {
+        dbPath = path;
         ORMUtil.initializeORM(dbPath);
         manager = ORMUtil.getEntityManager(dbPath);
     }
@@ -54,28 +57,32 @@
      */
     public List executeNativeQuery(String queryString, String type) {
         int maxResults = READ_CACHE_LIMIT;
-        String queryWithSubSet = queryString + " OFFSET " + startPos +
-                " ROWS FETCH FIRST " + maxResults + " ROW ONLY";
-        Query query = null;
-        if (type != null) {
-            try {
-                query = manager.getEntityManager().createNativeQuery(queryWithSubSet,
-                        Class.forName(type));
-            } catch (ClassNotFoundException ex) {
-                log.debug("Exception during native query", ex);
+        Object mutexObject = ORMUtil.getMutexObject();
+        synchronized (mutexObject) {
+            String queryWithSubSet = queryString + " OFFSET " + startPos +
+                    " ROWS FETCH FIRST " + maxResults + " ROW ONLY";
+            Query query = null;
+            if (type != null) {
+                try {
+                    query = manager.getEntityManager().createNativeQuery(queryWithSubSet,
+                            Class.forName(type));
+                } catch (ClassNotFoundException ex) {
+                    log.debug("Exception during native query", ex);
+                }
+            } else {
+                query = manager.getEntityManager().createNativeQuery(queryWithSubSet);
             }
-        } else {
-            query = manager.getEntityManager().createNativeQuery(queryWithSubSet);
+            query.setHint("eclipselink.maintain-cache", "false");
+            query.setFlushMode(FlushModeType.COMMIT);
+            List results = query.getResultList();
+            int resultsSize = results.size();
+            if (resultsSize == 0 || resultsSize < READ_CACHE_LIMIT) {
+                startPos += resultsSize;
+            } else {
+                startPos += maxResults;
+            }
+            return results;
         }
-        query.setHint("eclipselink.maintain-cache", "false");
-        List results = query.getResultList();
-        int resultsSize = results.size();
-        if (resultsSize == 0 || resultsSize < READ_CACHE_LIMIT) {
-            startPos += resultsSize;
-        } else {
-            startPos += maxResults;
-        }
-        return results;
     }
 
     /**
@@ -85,20 +92,23 @@
      * @return an Object of return type.
      */
     public Object  executeSingleResult(String queryString, String type) {
-        log.debug("executeSingleResult: " + queryString);
-        Query query = manager.getEntityManager().createQuery(queryString);
-        query.setHint("eclipselink.persistence-context.reference-mode", "WEAK");
-        query.setHint("eclipselink.maintain-cache", "false");
-        query.setHint("eclipselink.read-only", "true");
-        Object obj = null;
-        try {
-            obj = query.getSingleResult();
-        } catch (javax.persistence.NoResultException nex) {
-            log.debug("no results:", nex);
-        } catch (javax.persistence.NonUniqueResultException nux) {
-            log.debug("more than one result returned:", nux);
+        Object mutexObject = ORMUtil.getMutexObject();
+        synchronized (mutexObject) {
+            Query query = manager.getEntityManager().createQuery(queryString);
+            query.setHint("eclipselink.persistence-context.reference-mode", "WEAK");
+            query.setHint("eclipselink.maintain-cache", "false");
+            query.setHint("eclipselink.read-only", "true");
+            query.setFlushMode(FlushModeType.COMMIT);
+            Object obj = null;
+            try {
+                obj = query.getSingleResult();
+            } catch (javax.persistence.NoResultException nex) {
+                log.debug("no results:", nex);
+            } catch (javax.persistence.NonUniqueResultException nux) {
+                log.debug("more than one result returned:", nux);
+            }
+            return obj;
         }
-        return obj;
     }
 
     /**
@@ -107,21 +117,34 @@
      * @return List of objects read from database.
      */
     public List executeQuery (String queryString) {
-        int maxResults = READ_CACHE_LIMIT;
-        Query query = manager.getEntityManager().createQuery(queryString);
-        query.setHint("eclipselink.persistence-context.reference-mode", "WEAK");
-        query.setHint("eclipselink.maintain-cache", "false");
-        query.setHint("eclipselink.read-only", "true");
-        query.setFirstResult(startPos);
-        query.setMaxResults(maxResults);
-        List results = (List) query.getResultList();
-        int resultsSize = results.size();
-        log.debug("result size: " + resultsSize);
-        if (results.size() == 0 || resultsSize < READ_CACHE_LIMIT) {
-            startPos += resultsSize;
-        } else {
-            startPos += maxResults;
+        Object mutexObject = ORMUtil.getMutexObject();
+        synchronized (mutexObject) {
+            int maxResults = READ_CACHE_LIMIT;
+            log.debug("executeSingleResult: " + queryString);
+            Query query = manager.getEntityManager().createQuery(queryString);
+            query.setHint("eclipselink.persistence-context.reference-mode", "WEAK");
+            query.setHint("eclipselink.maintain-cache", "false");
+            query.setHint("eclipselink.read-only", "true");
+            query.setFirstResult(startPos);
+            query.setMaxResults(maxResults);
+            query.setFlushMode(FlushModeType.COMMIT);
+            List results = (List) query.getResultList();
+            int resultsSize = results.size();
+            log.debug("result size: " + resultsSize);
+            if (results.size() == 0 || resultsSize < READ_CACHE_LIMIT) {
+                startPos += resultsSize;
+            } else {
+                startPos += maxResults;
+            }
+            return results;
         }
-        return results;
+    }
+    
+    
+    public void close() {
+        Object mutexObject = ORMUtil.getMutexObject();
+        synchronized (mutexObject) {
+            ORMUtil.finalizeORM(dbPath);
+        }
     }
 }
\ No newline at end of file