You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by th...@apache.org on 2009/06/10 16:57:38 UTC
svn commit: r783383 - in
/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db:
DbDataStore.java DerbyDataStore.java
Author: thomasm
Date: Wed Jun 10 14:57:37 2009
New Revision: 783383
URL: http://svn.apache.org/viewvc?rev=783383&view=rev
Log:
JCR-2128 DerbyDataStore to handle proper close of the embedded database
Added:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DerbyDataStore.java
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java?rev=783383&r1=783382&r2=783383&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DbDataStore.java Wed Jun 10 14:57:37 2009
@@ -828,7 +828,7 @@
/**
* {@inheritDoc}
*/
- public synchronized void close() {
+ public synchronized void close() throws DataStoreException {
ArrayList<ConnectionRecoveryManager> list = connectionPool.getAll();
for (ConnectionRecoveryManager conn : list) {
conn.close();
Added: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DerbyDataStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DerbyDataStore.java?rev=783383&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DerbyDataStore.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/data/db/DerbyDataStore.java Wed Jun 10 14:57:37 2009
@@ -0,0 +1,65 @@
+package org.apache.jackrabbit.core.data.db;
+
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import org.apache.jackrabbit.core.data.DataStoreException;
+import org.apache.jackrabbit.core.persistence.bundle.DerbyPersistenceManager;
+import org.apache.jackrabbit.core.persistence.bundle.util.ConnectionRecoveryManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * The Derby data store closes the database when the data store is closed
+ * (embedded databases only).
+ */
+public class DerbyDataStore extends DbDataStore {
+
+ /**
+ * Logger instance
+ */
+ private static Logger log = LoggerFactory.getLogger(DerbyDataStore.class);
+
+ public synchronized void close() throws DataStoreException {
+ super.close();
+
+ // check for embedded driver
+ if (!DerbyPersistenceManager.DERBY_EMBEDDED_DRIVER.equals(getDriver())) {
+ return;
+ }
+
+ try {
+
+ // prepare connection url for issuing shutdown command
+ ConnectionRecoveryManager connectionManager = getConnection();
+
+ String url = connectionManager.getConnection().getMetaData().getURL();
+ int pos = url.lastIndexOf(';');
+ if (pos != -1) {
+ // strip any attributes from connection url
+ url = url.substring(0, pos);
+ }
+ url += ";shutdown=true";
+
+ // we have to reset the connection to 'autoCommit=true' before closing it;
+ // otherwise Derby would mysteriously complain about some pending uncommitted
+ // changes which can't possibly be true.
+ // @todo further investigate
+ connectionManager.getConnection().setAutoCommit(true);
+
+ // need to call it again because we just opened a connection,
+ // and super.close() closes it.
+ super.close();
+
+ // now it's safe to shutdown the embedded Derby database
+ try {
+ DriverManager.getConnection(url);
+ } catch (SQLException e) {
+ // a shutdown command always raises a SQLException
+ log.info(e.getMessage());
+ }
+ } catch (Exception e) {
+ throw new DataStoreException(e);
+ }
+ }
+}