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