You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by Thomas Mueller <th...@gmail.com> on 2007/09/21 12:16:55 UTC
Re: svn commit: r578043 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle: AbstractBundlePersistenceManager.java BundleDbPersistenceManager.java util/ConnectionRecoveryManager.java
Today is not my day... I forgot the check in comment. Can this be corrected?
Thomas
On 9/21/07, thomasm@apache.org <th...@apache.org> wrote:
> Author: thomasm
> Date: Fri Sep 21 03:10:54 2007
> New Revision: 578043
>
> URL: http://svn.apache.org/viewvc?rev=578043&view=rev
> Log: (empty)
>
> Modified:
> jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
> jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
> jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java?rev=578043&r1=578042&r2=578043&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java Fri Sep 21 03:10:54 2007
> @@ -50,6 +50,7 @@
> import java.util.Set;
>
> import javax.jcr.PropertyType;
> +import javax.jcr.RepositoryException;
>
> /**
> * The <code>AbstractBundlePersistenceManager</code> acts as base for all
> @@ -714,8 +715,9 @@
> * @param maxCount the maximum number of node ids to return, or 0 for no limit.
> * @return an iterator of all bundles.
> * @throws ItemStateException if an error while loading occurs.
> + * @throws RepositoryException if a repository exception occurs
> */
> public abstract NodeIdIterator getAllNodeIds(NodeId after, int maxCount)
> - throws ItemStateException;
> + throws ItemStateException, RepositoryException;
>
> }
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java?rev=578043&r1=578042&r2=578043&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java Fri Sep 21 03:10:54 2007
> @@ -466,9 +466,10 @@
> * @return <code>true</code> if the tables exist;
> * <code>false</code> otherwise.
> *
> - * @throws SQLException if an SQL erro occurs.
> + * @throws SQLException if a database error occurs.
> + * @throws RepositoryException if a repository exception occurs.
> */
> - protected boolean checkTablesExist() throws SQLException {
> + protected boolean checkTablesExist() throws SQLException, RepositoryException {
> DatabaseMetaData metaData = connectionManager.getConnection().getMetaData();
> String tableName = schemaObjectPrefix + "BUNDLE";
> if (metaData.storesLowerCaseIdentifiers()) {
> @@ -504,40 +505,36 @@
> * Basically wrapps a JDBC transaction around super.store().
> */
> public synchronized void store(ChangeLog changeLog) throws ItemStateException {
> - Connection con = null;
> - try {
> - boolean tryAgain = true;
> - do {
> + int trials = 2;
> + Throwable lastException = null;
> + do {
> + trials--;
> + Connection con = null;
> + try {
> + con = connectionManager.getConnection();
> + connectionManager.setAutoReconnect(false);
> + con.setAutoCommit(false);
> + super.store(changeLog);
> + con.commit();
> + con.setAutoCommit(true);
> + return;
> + } catch (Throwable th) {
> + lastException = th;
> try {
> - con = connectionManager.getConnection();
> - connectionManager.setAutoReconnect(false);
> - con.setAutoCommit(false);
> - super.store(changeLog);
> - con.commit();
> - con.setAutoCommit(true);
> - } catch (SQLException e) {
> - if (tryAgain) {
> - tryAgain = false;
> - continue;
> + if (con != null) {
> + con.rollback();
> }
> - throw e;
> + } catch (SQLException e) {
> + logException("rollback failed", e);
> }
> - } while(false);
> - } catch (Throwable th) {
> - try {
> - if (con != null) {
> - con.rollback();
> + if (th instanceof SQLException || th.getCause() instanceof SQLException) {
> + connectionManager.close();
> }
> - } catch (SQLException e) {
> - logException("rollback failed", e);
> - }
> - if (th instanceof SQLException || th.getCause() instanceof SQLException) {
> - connectionManager.close();
> + } finally {
> + connectionManager.setAutoReconnect(true);
> }
> - throw new ItemStateException(th.getMessage());
> - } finally {
> - connectionManager.setAutoReconnect(true);
> - }
> + } while(blockOnConnectionLoss || trials > 0);
> + throw new ItemStateException(lastException.getMessage());
> }
>
> /**
> @@ -896,7 +893,7 @@
> * {@inheritDoc}
> */
> public synchronized NodeIdIterator getAllNodeIds(NodeId bigger, int maxCount)
> - throws ItemStateException {
> + throws ItemStateException, RepositoryException {
> ResultSet rs = null;
> try {
> UUID lowUuid;
>
> Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java
> URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java?rev=578043&r1=578042&r2=578043&view=diff
> ==============================================================================
> --- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java (original)
> +++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/util/ConnectionRecoveryManager.java Fri Sep 21 03:10:54 2007
> @@ -26,6 +26,8 @@
> import java.sql.Statement;
> import java.util.HashMap;
>
> +import javax.jcr.RepositoryException;
> +
> import org.slf4j.Logger;
> import org.slf4j.LoggerFactory;
>
> @@ -124,8 +126,9 @@
> * @param url the url to use for the connection
> * @param user the user to use for the connection
> * @param password the password to use for the connection
> + * @throws RepositoryException if the database driver could not be loaded
> */
> - public ConnectionRecoveryManager(boolean block, String driver, String url, String user, String password) {
> + public ConnectionRecoveryManager(boolean block, String driver, String url, String user, String password) throws RepositoryException {
> this.block = block;
> this.driver = driver;
> this.url = url;
> @@ -147,8 +150,9 @@
> *
> * @return the database connection that is managed
> * @throws SQLException on error
> + * @throws RepositoryException if the database driver could not be loaded
> */
> - public synchronized Connection getConnection() throws SQLException {
> + public synchronized Connection getConnection() throws SQLException, RepositoryException {
> if (isClosed) {
> if (autoReconnect) {
> reestablishConnection();
> @@ -172,13 +176,38 @@
> }
>
> /**
> + * Executes the given SQL query. Retries once or blocks (when the
> + * <code>block</code> parameter has been set to true on construction)
> + * if this fails and autoReconnect is enabled.
> + *
> + * @param sql the SQL query to execute
> + * @return the executed ResultSet
> + * @throws SQLException on error
> + * @throws RepositoryException if the database driver could not be loaded
> + */
> + public synchronized ResultSet executeQuery(String sql) throws SQLException, RepositoryException {
> + int trials = 2;
> + SQLException lastException = null;
> + do {
> + trials--;
> + try {
> + return executeQueryInternal(sql);
> + } catch (SQLException e) {
> + lastException = e;
> + }
> + } while(autoReconnect && (block || trials > 0));
> + throw lastException;
> + }
> +
> + /**
> * Executes the given SQL query.
> *
> * @param sql query to execute
> * @return a <code>ResultSet</code> object
> * @throws SQLException if an error occurs
> + * @throws RepositoryException if the database driver could not be loaded
> */
> - public synchronized ResultSet executeQuery(String sql) throws SQLException {
> + private ResultSet executeQueryInternal(String sql) throws SQLException, RepositoryException {
> PreparedStatement stmt = null;
> try {
> stmt = (PreparedStatement) preparedStatements.get(sql);
> @@ -203,8 +232,9 @@
> * @param params parameters to set
> * @return the <code>Statement</code> object that had been executed
> * @throws SQLException if an error occurs
> + * @throws RepositoryException if the database driver could not be loaded
> */
> - public synchronized Statement executeStmt(String sql, Object[] params) throws SQLException {
> + public Statement executeStmt(String sql, Object[] params) throws SQLException, RepositoryException {
> return executeStmt(sql, params, false, 0);
> }
>
> @@ -217,8 +247,34 @@
> * @param maxRows the maximum number of rows to return (0 for all rows)
> * @return the <code>Statement</code> object that had been executed
> * @throws SQLException if an error occurs
> + * @throws RepositoryException if the database driver could not be loaded
> */
> - public synchronized Statement executeStmt(String sql, Object[] params, boolean returnGeneratedKeys, int maxRows) throws SQLException {
> + public synchronized Statement executeStmt(String sql, Object[] params, boolean returnGeneratedKeys, int maxRows) throws SQLException, RepositoryException {
> + int trials = 2;
> + SQLException lastException = null;
> + do {
> + trials--;
> + try {
> + return executeStmtInternal(sql, params, returnGeneratedKeys, maxRows);
> + } catch (SQLException e) {
> + lastException = e;
> + }
> + } while(autoReconnect && (block || trials > 0));
> + throw lastException;
> + }
> +
> + /**
> + * Executes the given SQL statement with the specified parameters.
> + *
> + * @param sql statement to execute
> + * @param params parameters to set
> + * @param returnGeneratedKeys if the statement should return auto generated keys
> + * @param maxRows the maximum number of rows to return (0 for all rows)
> + * @return the <code>Statement</code> object that had been executed
> + * @throws SQLException if an error occurs
> + * @throws RepositoryException if the database driver could not be loaded
> + */
> + private Statement executeStmtInternal(String sql, Object[] params, boolean returnGeneratedKeys, int maxRows) throws SQLException, RepositoryException {
> try {
> String key = sql;
> if (returnGeneratedKeys) {
> @@ -266,14 +322,24 @@
> * Creates the database connection.
> *
> * @throws SQLException on error
> + * @throws RepositoryException if the database driver could not be loaded
> */
> - private void setupConnection() throws SQLException {
> + private void setupConnection() throws SQLException, RepositoryException {
> + try {
> + Class driverClass = Class.forName(driver);
> + // Workaround for Apache Derby:
> + // The JDBC specification recommends the Class.ForName method without the .newInstance() method call,
> + // but adding the newInstance() guarantees that Derby will be booted on any Java Virtual Machine.
> + driverClass.newInstance();
> + } catch (Throwable e) {
> + throw new RepositoryException("Could not load or initialize the database driver class " + driver, e);
> + }
> try {
> - Class.forName(driver).newInstance();
> - } catch (Exception e) {
> - throw new SQLException("could not load driver: " + e.getMessage());
> + connection = DriverManager.getConnection(url, user, password);
> + } catch (SQLException e) {
> + log.warn("Could not connect; driver: " + driver + " url: " + url + " user: " + user + " error: " + e.toString(), e);
> + throw e;
> }
> - connection = DriverManager.getConnection(url, user, password);
> connection.setAutoCommit(true);
> try {
> DatabaseMetaData meta = connection.getMetaData();
> @@ -308,8 +374,9 @@
> * Re-establishes the database connection.
> *
> * @throws SQLException if reconnecting failed
> + * @throws RepositoryException
> */
> - private void reestablishConnection() throws SQLException {
> + private void reestablishConnection() throws SQLException, RepositoryException {
>
> long trials = TRIALS;
> SQLException exception = null;
>
>
>
Re: svn commit: r578043 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle: AbstractBundlePersistenceManager.java BundleDbPersistenceManager.java util/ConnectionRecoveryManager.java
Posted by Thomas Mueller <th...@gmail.com>.
Thanks! Done.
On 9/21/07, Jukka Zitting <ju...@gmail.com> wrote:
> Hi,
>
> On 9/21/07, Thomas Mueller <th...@gmail.com> wrote:
> > Today is not my day... I forgot the check in comment. Can this be corrected?
>
> No problem, I actually just did that yesterday for an older commit.
>
> The magic command (from within your checkout) is:
>
> svn propset --revprop -r 578043 svn:log "your commit message"
>
> BR,
>
> Jukka Zitting
>
Re: svn commit: r578043 - in /jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle: AbstractBundlePersistenceManager.java BundleDbPersistenceManager.java util/ConnectionRecoveryManager.java
Posted by Jukka Zitting <ju...@gmail.com>.
Hi,
On 9/21/07, Thomas Mueller <th...@gmail.com> wrote:
> Today is not my day... I forgot the check in comment. Can this be corrected?
No problem, I actually just did that yesterday for an older commit.
The magic command (from within your checkout) is:
svn propset --revprop -r 578043 svn:log "your commit message"
BR,
Jukka Zitting