diff flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnValue.java @ 478:db430bd9e0e0

Implemented a WstColumnValue cache to speed up inserting WST files into database. flys-backend/trunk@1734 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 20 Apr 2011 07:21:03 +0000
parents 29a408f80a89
children 67fd63e4ef66
line wrap: on
line diff
--- a/flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnValue.java	Mon Apr 18 17:01:00 2011 +0000
+++ b/flys-backend/src/main/java/de/intevation/flys/importer/ImportWstColumnValue.java	Wed Apr 20 07:21:03 2011 +0000
@@ -6,17 +6,23 @@
 
 import java.math.BigDecimal;
 
+import org.apache.log4j.Logger;
+
 import org.hibernate.Session;
-import org.hibernate.Query;
 
-import java.util.List;
+import java.util.Map;
+
 
 public class ImportWstColumnValue
 {
+    protected Logger logger = Logger.getLogger(ImportWstColumnValue.class);
+
     protected BigDecimal      position;
     protected BigDecimal      w;
     protected ImportWstColumn wstColumn;
 
+    protected Map<WstColumnValueKey, WstColumnValue> cache;
+
     protected WstColumnValue  peer;
 
     public ImportWstColumnValue() {
@@ -25,11 +31,13 @@
     public ImportWstColumnValue(
         ImportWstColumn wstColumn,
         BigDecimal      position,
-        BigDecimal      w
+        BigDecimal      w,
+        Map<WstColumnValueKey, WstColumnValue> cache
     ) {
         this.wstColumn = wstColumn;
         this.position  = position;
         this.w         = w;
+        this.cache     = cache;
     }
 
     public BigDecimal getPosition() {
@@ -59,22 +67,25 @@
     public WstColumnValue getPeer(River river) {
         if (peer == null) {
             WstColumn c = wstColumn.getPeer(river);
+
+            // check the cache before we fire a db query
+            WstColumnValue value = cache.get(new WstColumnValueKey(
+                c.getId(),
+                position.doubleValue(),
+                w.doubleValue()));
+
+            if (value != null) {
+                peer = value;
+                return peer;
+            }
+
             Session session = Importer.sessionHolder.get();
-            Query query = session.createQuery(
-                "from WstColumnValue where " +
-                "wstColumn=:c and position=:p and w=:w");
-            query.setParameter("c", c);
-            query.setParameter("p", position);
-            query.setParameter("w", w);
-            List<WstColumnValue> values = query.list();
-            if (values.isEmpty()) {
-                peer = new WstColumnValue(c, position, w);
-                session.save(peer);
-            }
-            else {
-                peer = values.get(0);
-            }
+            peer = new WstColumnValue(c, position, w);
+            session.save(peer);
+
+            cache.put(new WstColumnValueKey(peer), peer);
         }
+
         return peer;
     }
 }

http://dive4elements.wald.intevation.org