You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2005/11/02 15:43:44 UTC

svn commit: r330266 - /incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java

Author: stefan
Date: Wed Nov  2 06:43:40 2005
New Revision: 330266

URL: http://svn.apache.org/viewcvs?rev=330266&view=rev
Log:
SimpleDbPersistenceManager: 
- improved read concurrency
- fixed transaction-support issue

Modified:
    incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java
URL: http://svn.apache.org/viewcvs/incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java?rev=330266&r1=330265&r2=330266&view=diff
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java (original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/state/db/SimpleDbPersistenceManager.java Wed Nov  2 06:43:40 2005
@@ -22,7 +22,6 @@
 import org.apache.jackrabbit.core.fs.local.LocalFileSystem;
 import org.apache.jackrabbit.core.state.AbstractPersistenceManager;
 import org.apache.jackrabbit.core.state.ChangeLog;
-import org.apache.jackrabbit.core.state.ItemState;
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
@@ -423,9 +422,9 @@
                 } catch (SQLException e) {
                     String msg = "rollback of change log failed";
                     log.error(msg, e);
-                    // re-throw original exception
-                    throw ise;
                 }
+                // re-throw original exception
+                throw ise;
             }
         }
     }
@@ -433,78 +432,82 @@
     /**
      * {@inheritDoc}
      */
-    public synchronized NodeState load(NodeId id)
+    public NodeState load(NodeId id)
             throws NoSuchItemStateException, ItemStateException {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
 
         PreparedStatement stmt = nodeStateSelect;
-        ResultSet rs = null;
-        InputStream in = null;
-        try {
-            stmt.setString(1, id.toString());
-            stmt.execute();
-            rs = stmt.getResultSet();
-            if (!rs.next()) {
-                throw new NoSuchItemStateException(id.toString());
-            }
-
-            in = rs.getBinaryStream(1);
-            NodeState state = createNew(id);
-            Serializer.deserialize(state, in);
+        synchronized(stmt) {
+            ResultSet rs = null;
+            InputStream in = null;
+            try {
+                stmt.setString(1, id.toString());
+                stmt.execute();
+                rs = stmt.getResultSet();
+                if (!rs.next()) {
+                    throw new NoSuchItemStateException(id.toString());
+                }
 
-            return state;
-        } catch (Exception e) {
-            if (e instanceof NoSuchItemStateException) {
-                throw (NoSuchItemStateException) e;
+                in = rs.getBinaryStream(1);
+                NodeState state = createNew(id);
+                Serializer.deserialize(state, in);
+
+                return state;
+            } catch (Exception e) {
+                if (e instanceof NoSuchItemStateException) {
+                    throw (NoSuchItemStateException) e;
+                }
+                String msg = "failed to read node state: " + id;
+                log.error(msg, e);
+                throw new ItemStateException(msg, e);
+            } finally {
+                closeStream(in);
+                closeResultSet(rs);
+                resetStatement(stmt);
             }
-            String msg = "failed to read node state: " + id;
-            log.error(msg, e);
-            throw new ItemStateException(msg, e);
-        } finally {
-            closeStream(in);
-            closeResultSet(rs);
-            resetStatement(stmt);
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    public synchronized PropertyState load(PropertyId id)
+    public PropertyState load(PropertyId id)
             throws NoSuchItemStateException, ItemStateException {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
 
         PreparedStatement stmt = propertyStateSelect;
-        ResultSet rs = null;
-        InputStream in = null;
-        try {
-            stmt.setString(1, id.toString());
-            stmt.execute();
-            rs = stmt.getResultSet();
-            if (!rs.next()) {
-                throw new NoSuchItemStateException(id.toString());
-            }
-
-            in = rs.getBinaryStream(1);
-            PropertyState state = createNew(id);
-            Serializer.deserialize(state, in, blobStore);
+        synchronized(stmt) {
+            ResultSet rs = null;
+            InputStream in = null;
+            try {
+                stmt.setString(1, id.toString());
+                stmt.execute();
+                rs = stmt.getResultSet();
+                if (!rs.next()) {
+                    throw new NoSuchItemStateException(id.toString());
+                }
 
-            return state;
-        } catch (Exception e) {
-            if (e instanceof NoSuchItemStateException) {
-                throw (NoSuchItemStateException) e;
+                in = rs.getBinaryStream(1);
+                PropertyState state = createNew(id);
+                Serializer.deserialize(state, in, blobStore);
+
+                return state;
+            } catch (Exception e) {
+                if (e instanceof NoSuchItemStateException) {
+                    throw (NoSuchItemStateException) e;
+                }
+                String msg = "failed to read property state: " + id;
+                log.error(msg, e);
+                throw new ItemStateException(msg, e);
+            } finally {
+                closeStream(in);
+                closeResultSet(rs);
+                resetStatement(stmt);
             }
-            String msg = "failed to read property state: " + id;
-            log.error(msg, e);
-            throw new ItemStateException(msg, e);
-        } finally {
-            closeStream(in);
-            closeResultSet(rs);
-            resetStatement(stmt);
         }
     }
 
@@ -523,8 +526,7 @@
         }
 
         // check if insert or update
-        //boolean update = exists((NodeId) state.getId());
-        boolean update = state.getStatus() != ItemState.STATUS_NEW;
+        boolean update = exists((NodeId) state.getId());
         PreparedStatement stmt = (update) ? nodeStateUpdate : nodeStateInsert;
 
         try {
@@ -567,8 +569,7 @@
         }
 
         // check if insert or update
-        //boolean update = exists((PropertyId) state.getId());
-        boolean update = state.getStatus() != ItemState.STATUS_NEW;
+        boolean update = exists((PropertyId) state.getId());
         PreparedStatement stmt = (update) ? propertyStateUpdate : propertyStateInsert;
 
         try {
@@ -664,39 +665,41 @@
     /**
      * {@inheritDoc}
      */
-    public synchronized NodeReferences load(NodeReferencesId targetId)
+    public NodeReferences load(NodeReferencesId targetId)
             throws NoSuchItemStateException, ItemStateException {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
 
         PreparedStatement stmt = nodeReferenceSelect;
-        ResultSet rs = null;
-        InputStream in = null;
-        try {
-            stmt.setString(1, targetId.toString());
-            stmt.execute();
-            rs = stmt.getResultSet();
-            if (!rs.next()) {
-                throw new NoSuchItemStateException(targetId.toString());
-            }
-
-            in = rs.getBinaryStream(1);
-            NodeReferences refs = new NodeReferences(targetId);
-            Serializer.deserialize(refs, in);
+        synchronized(stmt) {
+            ResultSet rs = null;
+            InputStream in = null;
+            try {
+                stmt.setString(1, targetId.toString());
+                stmt.execute();
+                rs = stmt.getResultSet();
+                if (!rs.next()) {
+                    throw new NoSuchItemStateException(targetId.toString());
+                }
 
-            return refs;
-        } catch (Exception e) {
-            if (e instanceof NoSuchItemStateException) {
-                throw (NoSuchItemStateException) e;
+                in = rs.getBinaryStream(1);
+                NodeReferences refs = new NodeReferences(targetId);
+                Serializer.deserialize(refs, in);
+
+                return refs;
+            } catch (Exception e) {
+                if (e instanceof NoSuchItemStateException) {
+                    throw (NoSuchItemStateException) e;
+                }
+                String msg = "failed to read references: " + targetId;
+                log.error(msg, e);
+                throw new ItemStateException(msg, e);
+            } finally {
+                closeStream(in);
+                closeResultSet(rs);
+                resetStatement(stmt);
             }
-            String msg = "failed to read references: " + targetId;
-            log.error(msg, e);
-            throw new ItemStateException(msg, e);
-        } finally {
-            closeStream(in);
-            closeResultSet(rs);
-            resetStatement(stmt);
         }
     }
 
@@ -768,83 +771,88 @@
     /**
      * {@inheritDoc}
      */
-    public synchronized boolean exists(NodeId id) throws ItemStateException {
+    public boolean exists(NodeId id) throws ItemStateException {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
 
         PreparedStatement stmt = nodeStateSelectExist;
-        ResultSet rs = null;
-        try {
-            stmt.setString(1, id.toString());
-            stmt.execute();
-            rs = stmt.getResultSet();
+        synchronized(stmt) {
+            ResultSet rs = null;
+            try {
+                stmt.setString(1, id.toString());
+                stmt.execute();
+                rs = stmt.getResultSet();
 
-            // a node state exists if the result has at least one entry
-            return rs.next();
-        } catch (Exception e) {
-            String msg = "failed to check existence of node state: " + id;
-            log.error(msg, e);
-            throw new ItemStateException(msg, e);
-        } finally {
-            closeResultSet(rs);
-            resetStatement(stmt);
+                // a node state exists if the result has at least one entry
+                return rs.next();
+            } catch (Exception e) {
+                String msg = "failed to check existence of node state: " + id;
+                log.error(msg, e);
+                throw new ItemStateException(msg, e);
+            } finally {
+                closeResultSet(rs);
+                resetStatement(stmt);
+            }
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    public synchronized boolean exists(PropertyId id) throws ItemStateException {
+    public boolean exists(PropertyId id) throws ItemStateException {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
 
         PreparedStatement stmt = propertyStateSelectExist;
-        ResultSet rs = null;
-        try {
-            stmt.setString(1, id.toString());
-            stmt.execute();
-            rs = stmt.getResultSet();
+        synchronized(stmt) {
+            ResultSet rs = null;
+            try {
+                stmt.setString(1, id.toString());
+                stmt.execute();
+                rs = stmt.getResultSet();
 
-            // a property state exists if the result has at least one entry
-            return rs.next();
-        } catch (Exception e) {
-            String msg = "failed to check existence of property state: " + id;
-            log.error(msg, e);
-            throw new ItemStateException(msg, e);
-        } finally {
-            closeResultSet(rs);
-            resetStatement(stmt);
+                // a property state exists if the result has at least one entry
+                return rs.next();
+            } catch (Exception e) {
+                String msg = "failed to check existence of property state: " + id;
+                log.error(msg, e);
+                throw new ItemStateException(msg, e);
+            } finally {
+                closeResultSet(rs);
+                resetStatement(stmt);
+            }
         }
     }
 
     /**
      * {@inheritDoc}
      */
-    public synchronized boolean exists(NodeReferencesId targetId)
-            throws ItemStateException {
+    public boolean exists(NodeReferencesId targetId) throws ItemStateException {
         if (!initialized) {
             throw new IllegalStateException("not initialized");
         }
 
         PreparedStatement stmt = nodeReferenceSelectExist;
-        ResultSet rs = null;
-        try {
-            stmt.setString(1, targetId.toString());
-            stmt.execute();
-            rs = stmt.getResultSet();
+        synchronized(stmt) {
+            ResultSet rs = null;
+            try {
+                stmt.setString(1, targetId.toString());
+                stmt.execute();
+                rs = stmt.getResultSet();
 
-            // a reference exists if the result has at least one entry
-            return rs.next();
-        } catch (Exception e) {
-            String msg = "failed to check existence of node references: "
-                    + targetId;
-            log.error(msg, e);
-            throw new ItemStateException(msg, e);
-        } finally {
-            closeResultSet(rs);
-            resetStatement(stmt);
+                // a reference exists if the result has at least one entry
+                return rs.next();
+            } catch (Exception e) {
+                String msg = "failed to check existence of node references: "
+                        + targetId;
+                log.error(msg, e);
+                throw new ItemStateException(msg, e);
+            } finally {
+                closeResultSet(rs);
+                resetStatement(stmt);
+            }
         }
     }
 
@@ -972,62 +980,64 @@
         /**
          * {@inheritDoc}
          */
-        public synchronized InputStream get(String blobId) throws Exception {
+        public InputStream get(String blobId) throws Exception {
             PreparedStatement stmt = blobSelect;
-            try {
-                stmt.setString(1, blobId);
-                stmt.execute();
-                final ResultSet rs = stmt.getResultSet();
-                if (!rs.next()) {
-                    throw new Exception("no such BLOB: " + blobId);
-                }
-                final InputStream in = rs.getBinaryStream(1);
-
-                /**
-                 * return an InputStream wrapper in order to
-                 * close the ResultSet when the stream is closed
-                 */
-                return new InputStream() {
-                    public int read() throws IOException {
-                        return in.read();
+            synchronized(stmt) {
+                try {
+                    stmt.setString(1, blobId);
+                    stmt.execute();
+                    final ResultSet rs = stmt.getResultSet();
+                    if (!rs.next()) {
+                        throw new Exception("no such BLOB: " + blobId);
                     }
+                    final InputStream in = rs.getBinaryStream(1);
 
-                    public void close() throws IOException {
-                        in.close();
-                        // close ResultSet
-                        closeResultSet(rs);
-                    }
+                    /**
+                     * return an InputStream wrapper in order to
+                     * close the ResultSet when the stream is closed
+                     */
+                    return new InputStream() {
+                        public int read() throws IOException {
+                            return in.read();
+                        }
 
-                    public int available() throws IOException {
-                        return in.available();
-                    }
+                        public void close() throws IOException {
+                            in.close();
+                            // close ResultSet
+                            closeResultSet(rs);
+                        }
 
-                    public void mark(int readlimit) {
-                        in.mark(readlimit);
-                    }
+                        public int available() throws IOException {
+                            return in.available();
+                        }
 
-                    public boolean markSupported() {
-                        return in.markSupported();
-                    }
+                        public void mark(int readlimit) {
+                            in.mark(readlimit);
+                        }
 
-                    public int read(byte b[]) throws IOException {
-                        return in.read(b);
-                    }
+                        public boolean markSupported() {
+                            return in.markSupported();
+                        }
 
-                    public int read(byte b[], int off, int len) throws IOException {
-                        return in.read(b, off, len);
-                    }
+                        public int read(byte b[]) throws IOException {
+                            return in.read(b);
+                        }
 
-                    public void reset() throws IOException {
-                        in.reset();
-                    }
+                        public int read(byte b[], int off, int len) throws IOException {
+                            return in.read(b, off, len);
+                        }
 
-                    public long skip(long n) throws IOException {
-                        return in.skip(n);
-                    }
-                };
-            } finally {
-                resetStatement(stmt);
+                        public void reset() throws IOException {
+                            in.reset();
+                        }
+
+                        public long skip(long n) throws IOException {
+                            return in.skip(n);
+                        }
+                    };
+                } finally {
+                    resetStatement(stmt);
+                }
             }
         }