Index: src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/xml/XMLPersistenceManager.java	(working copy)
@@ -37,6 +37,7 @@
 import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore;
 import org.apache.jackrabbit.core.persistence.util.ResourceBasedBLOBStore;
 import org.apache.jackrabbit.core.util.DOMWalker;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
@@ -361,11 +362,7 @@
                                 try {
                                     values.add(InternalValue.create(in));
                                 } finally {
-                                    try {
-                                        in.close();
-                                    } catch (IOException e) {
-                                        // ignore
-                                    }
+                                    StreamHelper.close(in);
                                 }
                             }
                         } catch (Exception e) {
@@ -680,11 +677,7 @@
                                 try {
                                     blobStore.put(blobId, in, blobVal.getLength());
                                 } finally {
-                                    try {
-                                        in.close();
-                                    } catch (IOException e) {
-                                        // ignore
-                                    }
+                                	StreamHelper.close(in);
                                 }
                                 // store id of BLOB as property value
                                 writer.write(blobId);
@@ -702,11 +695,7 @@
                                     try {
                                         values[i] = InternalValue.create(in);
                                     } finally {
-                                        try {
-                                            in.close();
-                                        } catch (IOException e) {
-                                            // ignore
-                                        }
+                                    	StreamHelper.close(in);
                                     }
                                 }
                                 blobVal.discard();
Index: src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/db/DatabasePersistenceManager.java	(working copy)
@@ -33,6 +33,8 @@
 import org.apache.jackrabbit.core.state.NodeReferencesId;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
+import org.apache.jackrabbit.core.util.DbHelper;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.util.Text;
@@ -246,7 +248,7 @@
         try {
             // close shared prepared statements
             for (Iterator it = preparedStatements.values().iterator(); it.hasNext();) {
-                closeStatement((PreparedStatement) it.next());
+                DbHelper.close((PreparedStatement) it.next());
             }
             preparedStatements.clear();
 
@@ -367,8 +369,8 @@
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
-                closeStream(in);
-                closeResultSet(rs);
+                StreamHelper.close(in);
+                DbHelper.close(rs);
             }
         }
     }
@@ -405,8 +407,8 @@
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
-                closeStream(in);
-                closeResultSet(rs);
+                StreamHelper.close(in);
+                DbHelper.close(rs);
             }
         }
     }
@@ -583,8 +585,8 @@
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
-                closeStream(in);
-                closeResultSet(rs);
+                StreamHelper.close(in);
+                DbHelper.close(rs);
             }
         }
     }
@@ -668,7 +670,7 @@
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -695,7 +697,7 @@
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -723,7 +725,7 @@
                 log.error(msg, e);
                 throw new ItemStateException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -856,7 +858,7 @@
                     }
                 }
                 stmt.execute();
-                resetStatement(stmt);
+                DbHelper.resetStatement(stmt);
                 return stmt;
             } catch (SQLException se) {
                 if (--trials == 0) {
@@ -892,57 +894,6 @@
         }
     }
 
-    /**
-     * Resets the given <code>PreparedStatement</code> by clearing the parameters
-     * and warnings contained.
-     * <p/>
-     * NOTE: This method MUST be called in a synchronized context as neither
-     * this method nor the <code>PreparedStatement</code> instance on which it
-     * operates are thread safe.
-     *
-     * @param stmt The <code>PreparedStatement</code> to reset. If
-     *             <code>null</code> this method does nothing.
-     */
-    protected void resetStatement(PreparedStatement stmt) {
-        if (stmt != null) {
-            try {
-                stmt.clearParameters();
-                stmt.clearWarnings();
-            } catch (SQLException se) {
-                logException("failed resetting PreparedStatement", se);
-            }
-        }
-    }
-
-    protected void closeResultSet(ResultSet rs) {
-        if (rs != null) {
-            try {
-                rs.close();
-            } catch (SQLException se) {
-                logException("failed closing ResultSet", se);
-            }
-        }
-    }
-
-    protected void closeStream(InputStream in) {
-        if (in != null) {
-            try {
-                in.close();
-            } catch (IOException ignore) {
-            }
-        }
-    }
-
-    protected void closeStatement(Statement stmt) {
-        if (stmt != null) {
-            try {
-                stmt.close();
-            } catch (SQLException se) {
-                logException("failed closing Statement", se);
-            }
-        }
-    }
-
     protected void logException(String message, SQLException se) {
         if (message != null) {
             log.error(message);
@@ -1030,8 +981,8 @@
                 // commit the changes
                 con.commit();
             } finally {
-                closeStream(in);
-                closeStatement(stmt);
+                StreamHelper.close(in);
+                DbHelper.close(stmt);
             }
         }
     }
@@ -1210,14 +1161,14 @@
                 Statement stmt = executeStmt(blobSelectSQL, new Object[]{blobId});
                 final ResultSet rs = stmt.getResultSet();
                 if (!rs.next()) {
-                    closeResultSet(rs);
+                    DbHelper.close(rs);
                     throw new Exception("no such BLOB: " + blobId);
                 }
                 InputStream in = rs.getBinaryStream(1);
                 if (in == null) {
                     // some databases treat zero-length values as NULL;
                     // return empty InputStream in such a case
-                    closeResultSet(rs);
+                    DbHelper.close(rs);
                     return new ByteArrayInputStream(new byte[0]);
                 }
 
@@ -1229,7 +1180,7 @@
                     public void close() throws IOException {
                         in.close();
                         // now it's safe to close ResultSet
-                        closeResultSet(rs);
+                        DbHelper.close(rs);
                     }
                 };
             }
@@ -1244,7 +1195,7 @@
             ResultSet rs = stmt.getResultSet();
             // a BLOB exists if the result has at least one entry
             boolean exists = rs.next();
-            closeResultSet(rs);
+            DbHelper.close(rs);
 
             String sql = (exists) ? blobUpdateSQL : blobInsertSQL;
             executeStmt(sql, new Object[]{new SizedInputStream(in, size), blobId});
Index: src/main/java/org/apache/jackrabbit/core/persistence/db/OraclePersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/db/OraclePersistenceManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/db/OraclePersistenceManager.java	(working copy)
@@ -23,6 +23,8 @@
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
 import org.apache.jackrabbit.core.state.ItemState;
+import org.apache.jackrabbit.core.util.DbHelper;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.util.Text;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -345,8 +347,8 @@
                 // commit the changes
                 con.commit();
             } finally {
-                closeStream(in);
-                closeStatement(stmt);
+                StreamHelper.close(in);
+                DbHelper.close(stmt);
             }
         }
     }
@@ -414,7 +416,7 @@
             ResultSet rs = stmt.getResultSet();
             // a BLOB exists if the result has at least one entry
             boolean exists = rs.next();
-            closeResultSet(rs);
+            DbHelper.close(rs);
 
             Blob blob = null;
             try {
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java	(working copy)
@@ -24,6 +24,8 @@
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferencesId;
 import org.apache.jackrabbit.core.state.NodeReferences;
+import org.apache.jackrabbit.core.util.DbHelper;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.core.persistence.PMContext;
 import org.apache.jackrabbit.core.persistence.bundle.util.ConnectionRecoveryManager;
 import org.apache.jackrabbit.core.persistence.bundle.util.DbNameIndex;
@@ -443,11 +445,7 @@
                 log.debug(msg);
                 throw new RepositoryException(msg, e);
             } finally {
-                try {
-                    in.close();
-                } catch (IOException e) {
-                    // ignore
-                }
+                StreamHelper.close(in);
                 stmt.close();
             }
         }
@@ -762,8 +760,8 @@
         } catch (Exception e) {
             log.error("Error in bundle", e);
         } finally {
-            closeStream(din);
-            closeResultSet(rs);
+            StreamHelper.close(din);
+            DbHelper.close(rs);
         }
 
         if (consistencyFix && !modifications.isEmpty()) {
@@ -958,7 +956,7 @@
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         } finally {
-            closeResultSet(rs);
+        	DbHelper.close(rs);
         }
     }
 
@@ -993,8 +991,8 @@
             log.error(msg);
             throw new ItemStateException(msg, e);
         } finally {
-            closeStream(in);
-            closeResultSet(rs);
+            StreamHelper.close(in);
+            DbHelper.close(rs);
         }
     }
 
@@ -1013,7 +1011,7 @@
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         } finally {
-            closeResultSet(rs);
+        	DbHelper.close(rs);
         }
     }
 
@@ -1085,8 +1083,8 @@
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         } finally {
-            closeStream(in);
-            closeResultSet(rs);
+            StreamHelper.close(in);
+            DbHelper.close(rs);
         }
     }
 
@@ -1169,7 +1167,7 @@
             log.error(msg, e);
             throw new ItemStateException(msg, e);
         } finally {
-            closeResultSet(rs);
+        	DbHelper.close(rs);
         }
     }
 
@@ -1192,48 +1190,6 @@
     }
 
     /**
-     * Closes the result set
-     * @param rs the result set
-     */
-    protected void closeResultSet(ResultSet rs) {
-        if (rs != null) {
-            try {
-                rs.close();
-            } catch (SQLException se) {
-                logException("Failed closing ResultSet", se);
-            }
-        }
-    }
-
-    /**
-     * closes the input stream
-     * @param ins the input stream
-     */
-    protected void closeStream(InputStream ins) {
-        if (ins != null) {
-            try {
-                ins.close();
-            } catch (IOException ignore) {
-                // ignore
-            }
-        }
-    }
-
-    /**
-     * closes the statement
-     * @param stmt the statement
-     */
-    protected void closeStatement(PreparedStatement stmt) {
-        if (stmt != null) {
-            try {
-                stmt.close();
-            } catch (SQLException se) {
-                logException("Failed closing PreparedStatement", se);
-            }
-        }
-    }
-
-    /**
      * logs an sql exception
      * @param message the message
      * @param se the exception
@@ -1373,14 +1329,14 @@
             Statement stmt = connectionManager.executeStmt(blobSelectSQL, new Object[]{blobId});
             final ResultSet rs = stmt.getResultSet();
             if (!rs.next()) {
-                closeResultSet(rs);
+            	DbHelper.close(rs);
                 throw new Exception("no such BLOB: " + blobId);
             }
             InputStream in = rs.getBinaryStream(1);
             if (in == null) {
                 // some databases treat zero-length values as NULL;
                 // return empty InputStream in such a case
-                closeResultSet(rs);
+            	DbHelper.close(rs);
                 return new ByteArrayInputStream(new byte[0]);
             }
 
@@ -1392,7 +1348,7 @@
                 public void close() throws IOException {
                     in.close();
                     // now it's safe to close ResultSet
-                    closeResultSet(rs);
+                    DbHelper.close(rs);
                 }
             };
         }
@@ -1406,7 +1362,7 @@
             ResultSet rs = stmt.getResultSet();
             // a BLOB exists if the result has at least one entry
             boolean exists = rs.next();
-            closeResultSet(rs);
+            DbHelper.close(rs);
 
             String sql = (exists) ? blobUpdateSQL : blobInsertSQL;
             Object[] params = new Object[]{new ConnectionRecoveryManager.StreamWrapper(in, size), blobId};
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java	(working copy)
@@ -37,12 +37,12 @@
 import org.apache.jackrabbit.core.state.NodeReferencesId;
 import org.apache.jackrabbit.core.state.NoSuchItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.uuid.UUID;
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.sql.SQLException;
@@ -254,7 +254,7 @@
             log.error(msg);
             throw new ItemStateException(msg, e);
         } finally {
-            closeStream(din);
+            StreamHelper.close(din);
         }
     }
 
@@ -376,7 +376,7 @@
             BundleFsPersistenceManager.log.error(msg, e);
             throw new ItemStateException(msg, e);
         } finally {
-            closeStream(in);
+        	StreamHelper.close(in);
         }
     }
 
@@ -445,20 +445,6 @@
     }
 
     /**
-     * closes the input stream
-     * @param ins
-     */
-    protected void closeStream(InputStream ins) {
-        if (ins != null) {
-            try {
-                ins.close();
-            } catch (IOException ignore) {
-                // ignore
-            }
-        }
-    }
-
-    /**
      * logs an sql exception
      * @param message
      * @param se
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/BundleBinding.java	(working copy)
@@ -22,6 +22,7 @@
 import org.apache.jackrabbit.core.persistence.util.ResourceBasedBLOBStore;
 import org.apache.jackrabbit.core.NodeId;
 import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.data.DataStore;
@@ -592,11 +593,7 @@
                                     blobStore.put(blobId, in, size);
                                     state.setBlobId(blobId, i);
                                 } finally {
-                                    try {
-                                        in.close();
-                                    } catch (IOException e) {
-                                        // ignore
-                                    }
+                                    StreamHelper.close(in);
                                 }
                             } catch (Exception e) {
                                 String msg = "Error while storing blob. id="
@@ -637,11 +634,7 @@
                                     pos += n;
                                 }
                             } finally {
-                                try {
-                                    in.close();
-                                } catch (IOException e) {
-                                    // ignore
-                                }
+                                StreamHelper.close(in);
                             }
                         } catch (Exception e) {
                             String msg = "Error while storing blob. id="
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java	(working copy)
@@ -27,6 +27,8 @@
 
 import javax.jcr.RepositoryException;
 
+import org.apache.jackrabbit.core.util.DbHelper;
+import org.apache.jackrabbit.core.util.ExceptionHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -139,7 +141,7 @@
             setupConnection();
             isClosed = false;
         } catch (SQLException e) {
-            logException("could not setup connection", e);
+            ExceptionHelper.logException(log, "could not setup connection", e);
             close();
         }
     }
@@ -218,11 +220,11 @@
             }
             return stmt.executeQuery();
         } catch (SQLException e) {
-            logException("could not execute statement", e);
+            ExceptionHelper.logException(log, "could not execute statement", e);
             close();
             throw e;
         } finally {
-            resetStatement(stmt);
+            DbHelper.resetStatement(stmt);
         }
     }
 
@@ -297,7 +299,7 @@
             stmt.setMaxRows(maxRows);
             return executeStmtInternal(params, stmt);
         } catch (SQLException e) {
-            logException("could not execute statement", e);
+            ExceptionHelper.logException(log, "could not execute statement", e);
             close();
             throw e;
         }
@@ -317,7 +319,7 @@
                 connection.close();
             }
         } catch (SQLException e) {
-            logException("failed to close connection", e);
+            ExceptionHelper.logException(log, "failed to close connection", e);
         }
         connection = null;
         isClosed = true;
@@ -369,7 +371,7 @@
             }
         }
         stmt.execute();
-        resetStatement(stmt);
+        DbHelper.resetStatement(stmt);
         return stmt;
     }
 
@@ -425,37 +427,6 @@
     }
 
     /**
-     * Resets the given <code>PreparedStatement</code> by clearing the
-     * parameters and warnings contained.
-     *
-     * @param stmt The <code>PreparedStatement</code> to reset. If
-     *             <code>null</code> this method does nothing.
-     */
-    private void resetStatement(PreparedStatement stmt) {
-        if (stmt != null) {
-            try {
-                stmt.clearParameters();
-                stmt.clearWarnings();
-            } catch (SQLException se) {
-                logException("Failed resetting PreparedStatement", se);
-            }
-        }
-    }
-
-    /**
-     * Logs an sql exception.
-     *
-     * @param message the message
-     * @param se the exception
-     */
-    private void logException(String message, SQLException se) {
-        message = message == null ? "" : message;
-        log.error(message + ", reason: " + se.getMessage() + ", state/code: "
-                + se.getSQLState() + "/" + se.getErrorCode());
-        log.debug("   dump:", se);
-    }
-
-    /**
      * A wrapper for a binary stream that includes the
      * size of the stream.
      *
@@ -480,12 +451,6 @@
     }
 
     public void closeSilently(ResultSet rs) {
-        if (rs != null) {
-            try {
-                rs.close();
-            } catch (SQLException e) {
-                // ignore
-            }
-        }
+        DbHelper.close(rs);
     }
 }
Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/Oracle9PersistenceManager.java	(working copy)
@@ -23,6 +23,7 @@
 import org.apache.jackrabbit.core.persistence.util.Serializer;
 import org.apache.jackrabbit.core.state.ItemStateException;
 import org.apache.jackrabbit.core.state.NodeReferences;
+import org.apache.jackrabbit.core.util.DbHelper;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -242,7 +243,7 @@
                 ResultSet rs = stmt.getResultSet();
                 // a BLOB exists if the result has at least one entry
                 boolean exists = rs.next();
-                closeResultSet(rs);
+                DbHelper.close(rs);
 
                 String sql = (exists) ? blobUpdateSQL : blobInsertSQL;
                 blob = createTemporaryBlob(in);
Index: src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/persistence/util/Serializer.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.jackrabbit.core.state.NodeReferences;
 import org.apache.jackrabbit.core.state.NodeState;
 import org.apache.jackrabbit.core.state.PropertyState;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.core.value.BLOBFileValue;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
@@ -200,11 +201,7 @@
                 try {
                     blobStore.put(blobId, in, blobVal.getLength());
                 } finally {
-                    try {
-                        in.close();
-                    } catch (IOException e) {
-                        // ignore
-                    }
+                    StreamHelper.close(in);
                 }
                 // store id of BLOB as property value
                 out.writeUTF(blobId);   // value
@@ -222,11 +219,7 @@
                     try {
                         values[i] = InternalValue.create(in);
                     } finally {
-                        try {
-                            in.close();
-                        } catch (IOException e) {
-                            // ignore
-                        }
+                        StreamHelper.close(in);
                     }
                 }
                 blobVal.discard();
@@ -295,11 +288,7 @@
                     try {
                         val = InternalValue.create(is);
                     } finally {
-                        try {
-                            is.close();
-                        } catch (IOException e) {
-                            // ignore
-                        }
+                        StreamHelper.close(in);
                     }
                 }
             } else {
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/RedoLog.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/RedoLog.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/RedoLog.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.core.query.lucene;
 
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -194,13 +195,7 @@
                 }
             }
         } finally {
-            if (in != null) {
-                try {
-                    in.close();
-                } catch (IOException e) {
-                    log.warn("Exception while closing redo log: " + e.toString());
-                }
-            }
+            StreamHelper.close(in, log, "Exception while closing redo log: ");
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/query/lucene/TextExtractorJob.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/query/lucene/TextExtractorJob.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/query/lucene/TextExtractorJob.java	(working copy)
@@ -18,6 +18,8 @@
 
 import EDU.oswego.cs.dl.util.concurrent.FutureResult;
 import EDU.oswego.cs.dl.util.concurrent.Callable;
+
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.extractor.TextExtractor;
 import org.apache.jackrabbit.util.LazyFileInputStream;
 import org.slf4j.LoggerFactory;
@@ -225,19 +227,9 @@
             };
         } catch (IOException e) {
             // do some clean up
-            try {
-                out.close();
-            } catch (IOException e1) {
-                // ignore
-            }
+            StreamHelper.close(out);
 
-            if (in != null) {
-                try {
-                    in.close();
-                } catch (IOException e1) {
-                    // ignore
-                }
-            }
+            StreamHelper.close(in);
 
             if (!temp.delete()) {
                 temp.deleteOnExit();
Index: src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/fs/db/DatabaseFileSystem.java	(working copy)
@@ -20,6 +20,8 @@
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemPathUtil;
 import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;
+import org.apache.jackrabbit.core.util.DbHelper;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.util.Text;
 import org.apache.jackrabbit.util.TransientFileFactory;
 import org.slf4j.Logger;
@@ -217,7 +219,7 @@
             // close shared prepared statements
             Iterator it = preparedStatements.values().iterator();
             while (it.hasNext()) {
-                closeStatement((PreparedStatement) it.next());
+                DbHelper.close((PreparedStatement) it.next());
             }
             preparedStatements.clear();
 
@@ -346,7 +348,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -378,7 +380,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -410,7 +412,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -443,7 +445,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -476,7 +478,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -514,7 +516,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -555,7 +557,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -590,7 +592,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -631,7 +633,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
     }
@@ -700,7 +702,7 @@
                     public void close() throws IOException {
                         super.close();
                         // close ResultSet
-                        closeResultSet(rs);
+                        DbHelper.close(rs);
                     }
                 };
             } catch (SQLException e) {
@@ -1018,7 +1020,7 @@
         // close shared prepared statements
         Iterator it = preparedStatements.values().iterator();
         while (it.hasNext()) {
-            closeStatement((PreparedStatement) it.next());
+            DbHelper.close((PreparedStatement) it.next());
         }
         try {
             closeConnection(con);
@@ -1182,8 +1184,8 @@
                     sql = reader.readLine();
                 }
             } finally {
-                closeStream(in);
-                closeStatement(stmt);
+            	StreamHelper.close(in);
+            	DbHelper.close(stmt);
             }
         }
     }
@@ -1351,7 +1353,7 @@
                 log.error(msg, e);
                 throw new FileSystemException(msg, e);
             } finally {
-                closeResultSet(rs);
+                DbHelper.close(rs);
             }
         }
 
@@ -1499,36 +1501,6 @@
         }
     }
 
-    protected void closeResultSet(ResultSet rs) {
-        if (rs != null) {
-            try {
-                rs.close();
-            } catch (SQLException se) {
-                log.error("failed closing ResultSet", se);
-            }
-        }
-    }
-
-    protected void closeStream(InputStream in) {
-        if (in != null) {
-            try {
-                in.close();
-            } catch (IOException ignore) {
-                // ignore
-            }
-        }
-    }
-
-    protected void closeStatement(Statement stmt) {
-        if (stmt != null) {
-            try {
-                stmt.close();
-            } catch (SQLException se) {
-                log.error("failed closing Statement", se);
-            }
-        }
-    }
-
     //--------------------------------------------------------< inner classes >
 
     class SizedInputStream extends FilterInputStream {
Index: src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/fs/db/OracleFileSystem.java	(working copy)
@@ -21,6 +21,8 @@
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemPathUtil;
 import org.apache.jackrabbit.core.fs.RandomAccessOutputStream;
+import org.apache.jackrabbit.core.util.DbHelper;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -215,8 +217,8 @@
                     sql = reader.readLine();
                 }
             } finally {
-                closeStream(in);
-                closeStatement(stmt);
+            	StreamHelper.close(in);
+            	DbHelper.close(stmt);
             }
         }
     }
@@ -406,12 +408,7 @@
                             } catch (Exception e1) {
                             }
                         }
-                        if (in != null) {
-                            try {
-                                in.close();
-                            } catch (Exception e1) {
-                            }
-                        }
+                        StreamHelper.close(in);
                         // temp file can now safely be removed
                         tmpFile.delete();
                     }
@@ -517,12 +514,7 @@
                             } catch (Exception e1) {
                             }
                         }
-                        if (in != null) {
-                            try {
-                                in.close();
-                            } catch (Exception e1) {
-                            }
-                        }
+                        StreamHelper.close(in);
                         // temp file can now safely be removed
                         tmpFile.delete();
                     }
Index: src/main/java/org/apache/jackrabbit/core/fs/FileSystemResource.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/fs/FileSystemResource.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/fs/FileSystemResource.java	(working copy)
@@ -20,6 +20,8 @@
 import java.io.InputStream;
 import java.io.OutputStream;
 
+import org.apache.jackrabbit.core.util.StreamHelper;
+
 /**
  * A <code>FileSystemResource</code> represents a resource (i.e. file) in a
  * <code>FileSystem</code>.
@@ -165,10 +167,7 @@
                 out.write(buffer, 0, read);
             }
         } finally {
-            try {
-                in.close();
-            } catch (IOException ioe) {
-            }
+        	StreamHelper.close(in);
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/value/InternalValue.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/value/InternalValue.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/value/InternalValue.java	(working copy)
@@ -18,6 +18,7 @@
 
 import org.apache.jackrabbit.core.data.DataStore;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.spi.commons.conversion.MalformedPathException;
 import org.apache.jackrabbit.spi.commons.conversion.NameException;
 import org.apache.jackrabbit.spi.commons.conversion.NamePathResolver;
@@ -130,11 +131,7 @@
                     try {
                         return createTemporary(stream);
                     } finally {
-                        try {
-                            stream.close();
-                        } catch (IOException e) {
-                            // ignore
-                        }
+                        StreamHelper.close(stream);
                     }
                 }
             case PropertyType.BOOLEAN:
@@ -472,11 +469,7 @@
         try {
             return createTemporary(stream);
         } finally {
-            try {
-                stream.close();
-            } catch (IOException e) {
-                // ignore
-            }
+            StreamHelper.close(stream);
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/value/BLOBFileValue.java	(working copy)
@@ -22,6 +22,8 @@
 
 import javax.jcr.RepositoryException;
 
+import org.apache.jackrabbit.core.util.StreamHelper;
+
 /**
  * Represents binary data which is backed by a resource or byte[].
  * Unlike <code>BinaryValue</code> it has no state, i.e.
@@ -104,10 +106,7 @@
                 out.write(buffer, 0, read);
             }
         } finally {
-            try {
-                in.close();
-            } catch (IOException ignore) {
-            }
+            StreamHelper.close(in);
         }
     }
 
Index: src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/value/BLOBInTempFile.java	(working copy)
@@ -16,6 +16,7 @@
  */
 package org.apache.jackrabbit.core.value;
 
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.util.TransientFileFactory;
 
 import java.io.File;
@@ -68,11 +69,7 @@
         } catch (IOException e) {
             throw new RepositoryException("Error creating temporary file", e);
         } finally {
-            try {
-                in.close();
-            } catch (IOException e) {
-                // ignore
-            }
+            StreamHelper.close(in);
             if (out != null) {
                 try {
                     out.close();
Index: src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java	(revision 630205)
+++ src/main/java/org/apache/jackrabbit/core/nodetype/NodeTypeRegistry.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.jackrabbit.core.fs.FileSystemException;
 import org.apache.jackrabbit.core.fs.FileSystemResource;
 import org.apache.jackrabbit.core.util.Dumpable;
+import org.apache.jackrabbit.core.util.StreamHelper;
 import org.apache.jackrabbit.core.value.InternalValue;
 import org.apache.jackrabbit.spi.Name;
 import org.apache.jackrabbit.spi.commons.name.NameConstants;
@@ -800,13 +801,7 @@
             log.debug(error);
             throw new RepositoryException(error, intde);
         } finally {
-            if (in != null) {
-                try {
-                    in.close();
-                } catch (IOException ioe) {
-                    // ignore
-                }
-            }
+            StreamHelper.close(in);
         }
     }
 
@@ -855,11 +850,7 @@
                 log.debug(error);
                 throw new RepositoryException(error, intde);
             } finally {
-                try {
-                    in.close();
-                } catch (IOException ioe) {
-                    // ignore
-                }
+                StreamHelper.close(in);
             }
         }
     }
Index: src/main/java/org/apache/jackrabbit/core/util/DbHelper.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/util/DbHelper.java	(revision 0)
+++ src/main/java/org/apache/jackrabbit/core/util/DbHelper.java	(revision 0)
@@ -0,0 +1,70 @@
+/*
+ * Created on 22/02/2008
+ */
+package org.apache.jackrabbit.core.util;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+import org.apache.jackrabbit.core.persistence.bundle.util.ConnectionRecoveryManager;
+
+/**
+ * Utility methods for working with database-related objects.
+ */
+public class DbHelper {
+	public static void close(Connection con) {
+		try {
+			if (con != null) {
+				con.close();
+			}
+		}
+		catch (SQLException e) {}
+	}
+
+	public static void close(ConnectionRecoveryManager con) {
+		if (con != null) {
+			con.close();
+		}
+	}
+
+	public static void close(ResultSet rs) {
+		try {
+			if (rs != null) {
+				rs.close();
+			}
+		}
+		catch (SQLException e) {}
+	}
+
+	public static void close(Statement stmt) {
+		try {
+			if (stmt != null) {
+				stmt.close();
+			}
+		}
+		catch (SQLException e) {}
+	}
+
+    /**
+     * Resets the given <code>PreparedStatement</code> by clearing the parameters
+     * and warnings contained.
+     * <p/>
+     * NOTE: This method MUST be called in a synchronized context as neither
+     * this method nor the <code>PreparedStatement</code> instance on which it
+     * operates are thread safe.
+     *
+     * @param stmt The <code>PreparedStatement</code> to reset. If
+     *             <code>null</code> this method does nothing.
+     */
+    public static void resetStatement(PreparedStatement stmt) {
+        if (stmt != null) {
+            try {
+                stmt.clearParameters();
+                stmt.clearWarnings();
+            } catch (SQLException se) {}
+        }
+    }
+}
Index: src/main/java/org/apache/jackrabbit/core/util/StreamHelper.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/util/StreamHelper.java	(revision 0)
+++ src/main/java/org/apache/jackrabbit/core/util/StreamHelper.java	(revision 0)
@@ -0,0 +1,67 @@
+/*
+ * Created on 22/02/2008
+ */
+package org.apache.jackrabbit.core.util;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.slf4j.Logger;
+
+/**
+ * Utility methods for working with stream-related objects.
+ */
+public class StreamHelper {
+	/**
+	 * Closes an Input Stream and does nothing in case of an exception.
+	 */
+	public static void close(InputStream stream) {
+		try {
+			if (stream != null) {
+				stream.close();
+			}
+		}
+		catch (IOException e) {}
+	}
+
+	/**
+	 * Closes an Input Stream, and logs the exception.
+	 */
+	public static void close(InputStream stream, Logger log, String message) {
+		try {
+			if (stream != null) {
+				stream.close();
+			}
+		}
+		catch (IOException e) {
+			log.warn(message, e);
+		}
+	}
+
+	/**
+	 * Closes a Closeable and does nothing in case of an exception.
+	 */
+	public static void close(Closeable closeable) {
+		try {
+			if (closeable != null) {
+				closeable.close();
+			}
+		}
+		catch (IOException e) {}
+	}
+
+	/**
+	 * Closes an Closeable, and logs the exception.
+	 */
+	public static void close(Closeable closeable, Logger log, String message) {
+		try {
+			if (closeable != null) {
+				closeable.close();
+			}
+		}
+		catch (IOException e) {
+			log.warn(message, e);
+		}
+	}
+}
Index: src/main/java/org/apache/jackrabbit/core/util/ExceptionHelper.java
===================================================================
--- src/main/java/org/apache/jackrabbit/core/util/ExceptionHelper.java	(revision 0)
+++ src/main/java/org/apache/jackrabbit/core/util/ExceptionHelper.java	(revision 0)
@@ -0,0 +1,35 @@
+/*
+ * Created on 22/02/2008
+ */
+package org.apache.jackrabbit.core.util;
+
+import java.sql.SQLException;
+import org.slf4j.Logger;
+
+/**
+ * Utility methods for working with exceptions.
+ */
+public class ExceptionHelper {
+    public static void logException(Logger log, String message, Exception e) {
+        if (message != null) {
+            log.error(message);
+        }
+        log.error("       Reason: " + e.getMessage());
+        log.debug("   dump:", e);
+    }
+
+    /**
+     * Logs an sql exception.
+     *
+     * @param message the message
+     * @param se the exception
+     */
+    public static void logException(Logger log, String message, SQLException e) {
+        if (message != null) {
+            log.error(message);
+        }
+        log.error("       Reason: " + e.getMessage());
+        log.error("   State/Code: " + e.getSQLState() + "/" + e.getErrorCode());
+        log.debug("   dump:", e);
+    }
+}
