diff flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java @ 973:c30ada285d45

Reuse the compiled statements in meta data service. flys-artifacts/trunk@2399 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sat, 23 Jul 2011 18:47:08 +0000
parents 0c8aca463bd4
children
line wrap: on
line diff
--- a/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java	Fri Jul 22 16:55:36 2011 +0000
+++ b/flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/meta/CompiledStatement.java	Sat Jul 23 18:47:08 2011 +0000
@@ -31,9 +31,118 @@
 
     protected Map<String, List<Integer>> positions;
 
-    protected PreparedStatement preparedStatement;
+    protected int numVars;
 
-    protected int numVars;
+    public class Instance {
+
+        protected PreparedStatement preparedStatement;
+
+        public Instance() {
+        }
+
+        protected ResultData executeCached(
+            Cache       cache,
+            Connection  connection,
+            StackFrames frames
+        )
+        throws SQLException
+        {
+            Object [] values = new Object[numVars];
+
+            StringBuilder sb = new StringBuilder(original);
+
+            for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) {
+                String key   = entry.getKey();
+                Object value = frames.get(key);
+                sb.append(';').append(key).append(':').append(value);
+                for (Integer index: entry.getValue()) {
+                    values[index] = value;
+                }
+            }
+
+            // XXX: Maybe too many collisions?
+            // String key = original + Arrays.hashCode(values);
+            String key = sb.toString();
+
+            Element element = cache.get(key);
+
+            if (element != null) {
+                return (ResultData)element.getValue();
+            }
+
+            if (preparedStatement == null) {
+                preparedStatement = connection.prepareStatement(statement);
+            }
+
+            for (int i = 0; i < values.length; ++i) {
+                preparedStatement.setObject(i+1, values[i]);
+            }
+
+            ResultData data;
+
+            ResultSet result = preparedStatement.executeQuery();
+            try {
+                data = new ResultData(preparedStatement.getMetaData())
+                    .addAll(result);
+            }
+            finally {
+                result.close();
+            }
+
+            element = new Element(key, data);
+            cache.put(element);
+
+            return data;
+        }
+
+        protected ResultData executeUncached(
+            Connection  connection,
+            StackFrames frames
+        ) 
+        throws SQLException
+        {
+            if (preparedStatement == null) {
+                preparedStatement = connection.prepareStatement(statement);
+            }
+
+            for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) {
+                Object value = frames.get(entry.getKey());
+                for (Integer index: entry.getValue()) {
+                    preparedStatement.setObject(index+1, value);
+                }
+            }
+
+            ResultSet result = preparedStatement.executeQuery();
+            try {
+                return new ResultData(preparedStatement.getMetaData())
+                    .addAll(result);
+            }
+            finally {
+                result.close();
+            }
+        }
+
+        public ResultData execute(Connection connection, StackFrames frames)
+        throws SQLException
+        {
+            Cache cache = CacheFactory.getCache(DATACAGE_DB_CACHE);
+
+            return cache != null
+                ? executeCached(cache, connection, frames)
+                : executeUncached(connection, frames);
+        }
+
+        public void close() {
+            if (preparedStatement != null) {
+                try {
+                    preparedStatement.close();
+                }
+                catch (SQLException sqle) {
+                }
+                preparedStatement = null;
+            }
+        }
+    } // class Instance
 
     public CompiledStatement() {
     }
@@ -75,108 +184,5 @@
     public String getStatement() {
         return statement;
     }
-
-    protected ResultData executeCached(
-        Cache       cache,
-        Connection  connection,
-        StackFrames frames
-    )
-    throws SQLException
-    {
-        Object [] values = new Object[numVars];
-
-        StringBuilder sb = new StringBuilder(original);
-
-        for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) {
-            String key   = entry.getKey();
-            Object value = frames.get(key);
-            sb.append(';').append(key).append(':').append(value);
-            for (Integer index: entry.getValue()) {
-                values[index] = value;
-            }
-        }
-
-        // XXX: Maybe too many collisions?
-        // String key = original + Arrays.hashCode(values);
-        String key = sb.toString();
-
-        Element element = cache.get(key);
-
-        if (element != null) {
-            return (ResultData)element.getValue();
-        }
-
-        if (preparedStatement == null) {
-            preparedStatement = connection.prepareStatement(statement);
-        }
-
-        for (int i = 0; i < values.length; ++i) {
-            preparedStatement.setObject(i+1, values[i]);
-        }
-
-        ResultData data;
-
-        ResultSet result = preparedStatement.executeQuery();
-        try {
-            data = new ResultData(preparedStatement.getMetaData())
-                .addAll(result);
-        }
-        finally {
-            result.close();
-        }
-
-        element = new Element(key, data);
-        cache.put(element);
-
-        return data;
-    }
-
-    protected ResultData executeUncached(
-        Connection  connection,
-        StackFrames frames
-    ) 
-    throws SQLException
-    {
-        if (preparedStatement == null) {
-            preparedStatement = connection.prepareStatement(statement);
-        }
-
-        for (Map.Entry<String, List<Integer>> entry: positions.entrySet()) {
-            Object value = frames.get(entry.getKey());
-            for (Integer index: entry.getValue()) {
-                preparedStatement.setObject(index+1, value);
-            }
-        }
-
-        ResultSet result = preparedStatement.executeQuery();
-        try {
-            return new ResultData(preparedStatement.getMetaData())
-                .addAll(result);
-        }
-        finally {
-            result.close();
-        }
-    }
-
-    public ResultData execute(Connection connection, StackFrames frames)
-    throws SQLException
-    {
-        Cache cache = CacheFactory.getCache(DATACAGE_DB_CACHE);
-
-        return cache != null
-            ? executeCached(cache, connection, frames)
-            : executeUncached(connection, frames);
-    }
-
-    public void close() {
-        if (preparedStatement != null) {
-            try {
-                preparedStatement.close();
-            }
-            catch (SQLException sqle) {
-            }
-            preparedStatement = null;
-        }
-    }
 }
 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org