diff -r 85df38eb4012 -r df88fead2976 buildframework/helium/sf/java/jpa/src/com/nokia/helium/jpa/ORMReader.java --- 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