ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sboi...@apache.org
Subject [2/2] incubator-ignite git commit: # IGNITE-32 WIP: Dialects.
Date Mon, 19 Jan 2015 10:20:34 GMT
# IGNITE-32 WIP: Dialects.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/7046d70e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/7046d70e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/7046d70e

Branch: refs/heads/ignite-32
Commit: 7046d70e2cb9c59e6689822145fb907bb3eff464
Parents: cde7a33
Author: AKuznetsov <akuznetsov@gridgain.com>
Authored: Mon Jan 19 17:21:04 2015 +0700
Committer: AKuznetsov <akuznetsov@gridgain.com>
Committed: Mon Jan 19 17:21:04 2015 +0700

----------------------------------------------------------------------
 .../grid/cache/store/auto/AutoCacheStore.java   | 81 +++++++++++---------
 .../cache/store/auto/dialect/DB2Dialect.java    | 68 ++++++++++++++++
 .../cache/store/auto/dialect/H2Dialect.java     | 11 ++-
 .../cache/store/auto/dialect/MySQLDialect.java  |  9 ---
 .../cache/store/auto/dialect/OracleDialect.java | 72 +++++++++++++++++
 .../store/auto/dialect/SQLServerDialect.java    | 67 ++++++++++++++++
 .../grid/cache/store/auto/dialect/package.html  | 24 ++++++
 .../gridgain/grid/cache/store/auto/package.html | 24 ++++++
 8 files changed, 306 insertions(+), 50 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
index b76a9a5..363cdd3 100644
--- a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/AutoCacheStore.java
@@ -40,8 +40,8 @@ import java.util.concurrent.atomic.*;
 import static org.gridgain.grid.kernal.GridComponentType.*;
 
 /**
- * Base {@link GridCacheStore} implementation backed by JDBC.
- * This implementation stores objects in underlying database using mapping description.
+ * Base {@link GridCacheStore} implementation backed by JDBC. This implementation stores
objects in underlying database
+ * using mapping description.
  */
 public abstract class AutoCacheStore<K, V> implements GridCacheStore<K, V> {
     /**
@@ -75,13 +75,13 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
         /** Max key count for load query per statement. */
         protected final int maxKeysPerStmt;
 
-        /** Database key columns.  */
+        /** Database key columns. */
         private final Collection<String> keyCols;
 
-        /** Database value columns.  */
+        /** Database value columns. */
         private final Collection<String> valCols;
 
-        /** Database unique value columns.  */
+        /** Database unique value columns. */
         private final Collection<String> uniqValCols;
 
         /** Type metadata. */
@@ -138,6 +138,7 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
 
         /**
          * Construct query for select values with key count less or equal {@code maxKeysPerStmt}
+         *
          * @param keyCnt Key count.
          */
         protected String loadQuery(int keyCnt) {
@@ -163,7 +164,7 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
         }
 
         /**
-         *  Gets key fields type descriptors.
+         * Gets key fields type descriptors.
          *
          * @return Key fields type descriptors.
          */
@@ -263,17 +264,20 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
             closeConnection(conn);
         }
 
-        if ("H2".equals(dbProductName) )
+        if ("H2".equals(dbProductName))
             return new H2Dialect();
 
-        if ("MySQL".equals(dbProductName) )
+        if ("MySQL".equals(dbProductName))
             return new MySQLDialect();
 
-//        if (dbProductName.startsWith("Microsoft SQL Server"))
-//            return new SQLServerDialect();
-//
-//        if ("Oracle".equals(dbProductName) )
-//            return new OracleDialect();
+        if (dbProductName.startsWith("Microsoft SQL Server"))
+            return new SQLServerDialect();
+
+        if ("Oracle".equals(dbProductName))
+            return new OracleDialect();
+
+        if (dbProductName.startsWith("DB2/"))
+            return new DB2Dialect();
 
         return new JdbcDialect();
     }
@@ -434,6 +438,7 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
 
     /**
      * Extract database column names from {@link GridCacheQueryTypeDescriptor}.
+     *
      * @param dsc collection of {@link GridCacheQueryTypeDescriptor}.
      */
     protected static Collection<String> databaseColumns(Collection<GridCacheQueryTypeDescriptor>
dsc) {
@@ -496,37 +501,37 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
         for (final QueryCache type : entryQtyCache.values())
             futs.add(exec.submit(new Callable<Void>() {
                 @Override public Void call() throws Exception {
-                Connection conn = null;
-
-                try {
-                    PreparedStatement stmt = null;
+                    Connection conn = null;
 
                     try {
-                        conn = connection(null);
+                        PreparedStatement stmt = null;
+
+                        try {
+                            conn = connection(null);
 
-                        stmt = conn.prepareStatement(type.loadCacheQry);
+                            stmt = conn.prepareStatement(type.loadCacheQry);
 
-                        ResultSet rs = stmt.executeQuery();
+                            ResultSet rs = stmt.executeQuery();
 
-                        while (rs.next()) {
-                            K key = buildObject(type.keyType(), type.keyDescriptors(), rs);
-                            V val = buildObject(type.valueType(), type.valueDescriptors(),
rs);
+                            while (rs.next()) {
+                                K key = buildObject(type.keyType(), type.keyDescriptors(),
rs);
+                                V val = buildObject(type.valueType(), type.valueDescriptors(),
rs);
 
-                            clo.apply(key, val);
+                                clo.apply(key, val);
+                            }
+                        }
+                        catch (SQLException e) {
+                            throw new IgniteCheckedException("Failed to load cache", e);
+                        }
+                        finally {
+                            U.closeQuiet(stmt);
                         }
-                    }
-                    catch (SQLException e) {
-                        throw new IgniteCheckedException("Failed to load cache", e);
                     }
                     finally {
-                        U.closeQuiet(stmt);
+                        closeConnection(conn);
                     }
-                }
-                finally {
-                    closeConnection(conn);
-                }
 
-                return null;
+                    return null;
                 }
             }));
 
@@ -541,7 +546,8 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
      * @param key Key object.
      * @return Next index for parameters.
      */
-    protected int fillKeyParameters(PreparedStatement stmt, int i, QueryCache type, K key)
throws IgniteCheckedException {
+    protected int fillKeyParameters(PreparedStatement stmt, int i, QueryCache type,
+        K key) throws IgniteCheckedException {
         for (GridCacheQueryTypeDescriptor field : type.keyDescriptors()) {
             Object fieldVal = extractField(type.keyType(), field.getJavaName(), key);
 
@@ -714,9 +720,9 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
 
                 futs.add(exec.submit(new Callable<Void>() {
                     @Override public Void call() throws Exception {
-                    loadAll(tx, typeKey, p, c);
+                        loadAll(tx, typeKey, p, c);
 
-                    return null;
+                        return null;
                     }
                 }));
             }
@@ -784,7 +790,7 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
             }
         }
         catch (SQLException e) {
-            throw new IgniteCheckedException("Failed to load object by key: " + key, e);
+            throw new IgniteCheckedException("Failed to put object by key: " + key, e);
         }
         finally {
             end(tx, conn, stmt);
@@ -1080,7 +1086,6 @@ public abstract class AutoCacheStore<K, V> implements GridCacheStore<K,
V> {
         return dialect;
     }
 
-
     /**
      * Set database dialect.
      *

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/DB2Dialect.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/DB2Dialect.java
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/DB2Dialect.java
new file mode 100644
index 0000000..fc755c7
--- /dev/null
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/DB2Dialect.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.gridgain.grid.cache.store.auto.dialect;
+
+import org.gridgain.grid.util.typedef.*;
+
+import java.util.*;
+
+/**
+ * A dialect compatible with the DB2 database.
+ */
+public class DB2Dialect extends JdbcDialect {
+    /** {@inheritDoc} */
+    @Override public boolean hasMerge() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String mergeQuery(String schema, String tblName, Collection<String>
keyCols,
+        Collection<String> uniqCols) {
+
+        Collection<String> cols = F.concat(false, keyCols, uniqCols);
+
+        String colsLst = mkString(cols, ", ");
+
+        String match = mkString(keyCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("t.%s=v.%s", col, col);
+            }
+        }, "", ", ", "");
+
+        String setCols = mkString(uniqCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("t.%s = v.%s", col, col);
+            }
+        }, "", ", ", "");
+
+        String valuesCols = mkString(cols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return "v." + col;
+            }
+        }, "", ", ", "");
+
+        return String.format("MERGE INTO %s.%s t" +
+            " USING (VALUES(%s)) AS v (%s)" +
+            "  ON %s" +
+            " WHEN MATCHED THEN" +
+            "  UPDATE SET %s" +
+            " WHEN NOT MATCHED THEN" +
+            "  INSERT (%s) VALUES (%s)", schema, tblName, repeat("?", cols.size(), "", ",",
""), colsLst,
+            match, setCols, colsLst, valuesCols);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
index 5893e49..a629ac2 100644
--- a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/H2Dialect.java
@@ -17,6 +17,8 @@
 
 package org.gridgain.grid.cache.store.auto.dialect;
 
+import org.gridgain.grid.util.typedef.*;
+
 import java.util.*;
 
 /**
@@ -29,8 +31,11 @@ public class H2Dialect extends JdbcDialect {
     }
 
     /** {@inheritDoc} */
-    @Override public String mergeQuery(String schema, String tblName, Collection<String>
keyCols, Collection<String> uniqCols) {
-        return String.format("MERGE INTO %s (%s) KEY (%s) VALUES(%s)", tblName, mkString(uniqCols,
","),
-            mkString(keyCols, ","), repeat("?", uniqCols.size(), "",", ",""));
+    @Override public String mergeQuery(String schema, String tblName, Collection<String>
keyCols,
+        Collection<String> uniqCols) {
+        Collection<String> cols = F.concat(false, keyCols, uniqCols);
+
+        return String.format("MERGE INTO %s (%s) KEY (%s) VALUES(%s)", tblName, mkString(cols,
","),
+            mkString(keyCols, ","), repeat("?", cols.size(), "",", ",""));
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
index 115574e..ed7eaad 100644
--- a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/MySQLDialect.java
@@ -15,15 +15,6 @@
  * limitations under the License.
  */
 
-/* @java.file.header */
-
-/*  _________        _____ __________________        _____
- *  __  ____/___________(_)______  /__  ____/______ ____(_)_______
- *  _  / __  __  ___/__  / _  __  / _  / __  _  __ `/__  / __  __ \
- *  / /_/ /  _  /    _  /  / /_/ /  / /_/ /  / /_/ / _  /  _  / / /
- *  \____/   /_/     /_/   \_,__/   \____/   \__,_/  /_/   /_/ /_/
- */
-
 package org.gridgain.grid.cache.store.auto.dialect;
 
 import org.gridgain.grid.util.typedef.*;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/OracleDialect.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/OracleDialect.java
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/OracleDialect.java
new file mode 100644
index 0000000..eebf4a2
--- /dev/null
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/OracleDialect.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.gridgain.grid.cache.store.auto.dialect;
+
+import org.gridgain.grid.util.typedef.*;
+
+import java.util.*;
+
+/**
+ * A dialect compatible with the Oracle database.
+ */
+public class OracleDialect extends JdbcDialect {
+    /** {@inheritDoc} */
+    @Override public boolean hasMerge() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String mergeQuery(String schema, String tblName, Collection<String>
keyCols,
+        Collection<String> uniqCols) {
+        Collection<String> cols = F.concat(false, keyCols, uniqCols);
+
+        String colsLst = mkString(cols, ", ");
+
+        String selCols = mkString(uniqCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("? AS %s", col);
+            }
+        }, "", ", ", "");
+
+        String match = mkString(keyCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("t.%s=v.%s", col, col);
+            }
+        }, "", ", ", "");
+
+        String setCols = mkString(uniqCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("t.%s = v.%s", col, col);
+            }
+        }, "", ", ", "");
+
+        String valuesCols = mkString(cols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return "v." + col;
+            }
+        }, "", ", ", "");
+
+        return String.format("MERGE INTO %s.%s t" +
+            " USING (SELECT %s FROM dual) AS v" +
+            "  ON %s" +
+            " WHEN MATCHED THEN" +
+            "  UPDATE SET %s" +
+            " WHEN NOT MATCHED THEN" +
+            "  INSERT (%s) VALUES (%s)", schema, tblName, selCols, match, setCols, colsLst,
valuesCols);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/SQLServerDialect.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/SQLServerDialect.java
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/SQLServerDialect.java
new file mode 100644
index 0000000..ee2cb7e
--- /dev/null
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/SQLServerDialect.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.gridgain.grid.cache.store.auto.dialect;
+
+import org.gridgain.grid.util.typedef.*;
+
+import java.util.*;
+
+/**
+ * A dialect compatible with the MsSQL database.
+ */
+public class SQLServerDialect extends JdbcDialect {
+    /** {@inheritDoc} */
+    @Override public boolean hasMerge() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public String mergeQuery(String schema, String tblName, Collection<String>
keyCols,
+        Collection<String> uniqCols) {
+        Collection<String> cols = F.concat(false, keyCols, uniqCols);
+
+        String colsLst = mkString(cols, ", ");
+
+        String match = mkString(keyCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("t.%s=v.%s", col, col);
+            }
+        }, "", ", ", "");
+
+        String setCols = mkString(uniqCols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return String.format("t.%s = v.%s", col, col);
+            }
+        }, "", ", ", "");
+
+        String valuesCols = mkString(cols, new C1<String, String>() {
+            @Override public String apply(String col) {
+                return "v." + col;
+            }
+        }, "", ", ", "");
+
+        return String.format("MERGE INTO %s.%s t" +
+            " USING (VALUES(%s)) AS v (%s)" +
+            "  ON %s" +
+            " WHEN MATCHED THEN" +
+            "  UPDATE SET %s" +
+            " WHEN NOT MATCHED THEN" +
+            "  INSERT (%s) VALUES (%s)", schema, tblName, repeat("?", cols.size(), "", ",",
""), colsLst,
+            match , setCols, colsLst, valuesCols);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/package.html
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/package.html
b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/package.html
new file mode 100644
index 0000000..24d9dfc
--- /dev/null
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/dialect/package.html
@@ -0,0 +1,24 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<body>
+    <!-- Package description. -->
+    Contains dialect of SQL implemented by a particular RDBMS.
+</body>
+</html>

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7046d70e/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/package.html
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/package.html b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/package.html
new file mode 100644
index 0000000..50755cd
--- /dev/null
+++ b/modules/core/src/main/java/org/gridgain/grid/cache/store/auto/package.html
@@ -0,0 +1,24 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  -->
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<body>
+    <!-- Package description. -->
+    Contains reference JDBC-based cache store implementation.
+</body>
+</html>


Mime
View raw message