You are viewing a plain text version of this content. The canonical link for it is here.
Posted to torque-dev@db.apache.org by tv...@apache.org on 2018/08/27 08:57:56 UTC

svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Author: tv
Date: Mon Aug 27 08:57:56 2018
New Revision: 1839284

URL: http://svn.apache.org/viewvc?rev=1839284&view=rev
Log:
Implement and document TORQUE-350: Make use of try-with-resources possible with Torque transactions. 
IMPORTANT: TorqueException now inherits from SQLException

Added:
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnection.java   (with props)
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnectionImpl.java   (with props)
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/TorqueConnectionImplTest.java   (with props)
Modified:
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueException.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/oid/IDBroker.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/AbstractPeerImpl.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/BasePeerImpl.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/LargeSelect.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/Transaction.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManager.java
    db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManagerImpl.java
    db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java
    db/torque/torque4/trunk/torque-site/src/site/xdoc/documentation/orm-reference/connections-transactions.xml
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/imports.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/joinGetterReferencingObject.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/general/saveMethods.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoin.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoinAllExcept.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencedObject.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencingObjects.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/imports.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPK.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPKs.vm
    db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm
    db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/sql/SkipSqlTest.java

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueException.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueException.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueException.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/TorqueException.java Mon Aug 27 08:57:56 2018
@@ -1,5 +1,7 @@
 package org.apache.torque;
 
+import java.sql.SQLException;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -26,7 +28,7 @@ package org.apache.torque;
  * @author <a href="mailto:jvz@apache.org">Jason van Zyl</a>
  * @version $Id$
  */
-public class TorqueException extends Exception
+public class TorqueException extends SQLException
 {
     /**
      * Serial version.

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/oid/IDBroker.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/oid/IDBroker.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/oid/IDBroker.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/oid/IDBroker.java Mon Aug 27 08:57:56 2018
@@ -37,6 +37,7 @@ import org.apache.commons.logging.LogFac
 import org.apache.torque.Database;
 import org.apache.torque.Torque;
 import org.apache.torque.TorqueException;
+import org.apache.torque.util.TorqueConnection;
 import org.apache.torque.util.Transaction;
 
 /**
@@ -224,13 +225,10 @@ public class IDBroker implements Runnabl
         // Check for Transaction support.  Give warning message if
         // IDBroker is being used with a database that does not
         // support transactions.
-        Connection dbCon = null;
-        try
+        try (TorqueConnection dbCon = Transaction.begin(databaseName))
         {
-            dbCon = Transaction.begin(databaseName);
             transactionsSupported = dbCon.getMetaData().supportsTransactions();
             Transaction.commit(dbCon);
-            dbCon = null;
         }
         catch (Exception e)
         {
@@ -240,13 +238,6 @@ public class IDBroker implements Runnabl
                     e);
             transactionsSupported = false;
         }
-        finally
-        {
-            if (dbCon != null)
-            {
-                Transaction.safeRollback(dbCon);
-            }
-        }
         if (!transactionsSupported)
         {
             log.warn("IDBroker is being used with db '" + databaseName
@@ -497,23 +488,13 @@ public class IDBroker implements Runnabl
             .toString();
 
         boolean exists = false;
-        Connection dbCon = null;
-        try
+        try (TorqueConnection dbCon = Transaction.begin(databaseName))
         {
-            dbCon = Transaction.begin(databaseName);
             Statement statement = dbCon.createStatement();
             ResultSet rs = statement.executeQuery(query);
             exists = rs.next();
             statement.close();
             Transaction.commit(dbCon);
-            dbCon = null;
-        }
-        finally
-        {
-            if (dbCon != null)
-            {
-                Transaction.safeRollback(dbCon);
-            }
         }
         return exists;
     }

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/AbstractPeerImpl.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/AbstractPeerImpl.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/AbstractPeerImpl.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/AbstractPeerImpl.java Mon Aug 27 08:57:56 2018
@@ -260,22 +260,12 @@ public abstract class AbstractPeerImpl<T
      */
     public int doDelete(ObjectKey pk) throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             int deletedRows = doDelete(pk, connection);
             Transaction.commit(connection);
-            connection = null;
             return deletedRows;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/BasePeerImpl.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/BasePeerImpl.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/BasePeerImpl.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/BasePeerImpl.java Mon Aug 27 08:57:56 2018
@@ -210,23 +210,13 @@ public class BasePeerImpl<T> implements
      public int doDelete(final Criteria criteria)
              throws TorqueException
      {
-        Connection connection = null;
-        try
+        setDbName(criteria);
+        try (TorqueConnection connection = Transaction.begin(criteria.getDbName()))
         {
-            setDbName(criteria);
-            connection = Transaction.begin(criteria.getDbName());
             int deletedRows = doDelete(criteria, connection);
             Transaction.commit(connection);
-            connection = null;
             return deletedRows;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
      }
 
     /**
@@ -333,22 +323,12 @@ public class BasePeerImpl<T> implements
         {
             databaseNameFromInsertValues = getDatabaseName();
         }
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(databaseNameFromInsertValues))
         {
-            connection = Transaction.begin(databaseNameFromInsertValues);
             ObjectKey id = doInsert(insertValues, connection);
             Transaction.commit(connection);
-            connection = null;
             return id;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -556,23 +536,13 @@ public class BasePeerImpl<T> implements
         {
             dbNameToUse = getDatabaseName();
         }
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(dbNameToUse))
         {
-            connection = Transaction.begin(dbNameToUse);
             int numberOfInsertedRows
                     = doInsert(toInsertInto, criteria, dbNameToUse, connection);
             Transaction.commit(connection);
-            connection = null;
             return numberOfInsertedRows;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -930,27 +900,16 @@ public class BasePeerImpl<T> implements
                 final RecordMapper<TT> mapper)
             throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(criteria.getDbName()))
         {
-            connection = Transaction.begin(criteria.getDbName());
-
             List<TT> result = doSelect(
                     criteria,
                     mapper,
                     connection);
 
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -1011,30 +970,19 @@ public class BasePeerImpl<T> implements
                 final String dbName)
             throws TorqueException
     {
-        Connection connection = null;
-
-        try
+        try (TorqueConnection connection = Transaction.begin(
+                (dbName == null)
+                ? Torque.getDefaultDB()
+                : dbName))
         {
-            connection = Transaction.begin((dbName == null)
-                    ? Torque.getDefaultDB()
-                    : dbName);
-
             List<TT> result = doSelect(
                     query,
                     mapper,
                     connection);
 
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -1314,22 +1262,12 @@ public class BasePeerImpl<T> implements
         {
             databaseNameFromUpdateValues = getDatabaseName();
         }
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(databaseNameFromUpdateValues))
         {
-            connection = Transaction.begin(databaseNameFromUpdateValues);
             int result = doUpdate(updateValues, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -1401,22 +1339,12 @@ public class BasePeerImpl<T> implements
         {
             databaseNameFromUpdateValues = getDatabaseName();
         }
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(databaseNameFromUpdateValues))
         {
-            connection = Transaction.begin(databaseNameFromUpdateValues);
             int result = doUpdate(selectCriteria, updateValues, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -1568,25 +1496,15 @@ public class BasePeerImpl<T> implements
             final List<JdbcTypedValue> replacementValues)
         throws TorqueException
     {
-        Connection con = null;
-        try
+        try (TorqueConnection con = Transaction.begin(dbName))
         {
-            con = Transaction.begin(dbName);
             int rowCount = executeStatement(
                     statementString,
                     con,
                     replacementValues);
             Transaction.commit(con);
-            con = null;
             return rowCount;
         }
-        finally
-        {
-            if (con != null)
-            {
-                Transaction.safeRollback(con);
-            }
-        }
     }
 
     /**
@@ -1699,25 +1617,15 @@ public class BasePeerImpl<T> implements
                 final Map<String, JdbcTypedValue> replacementValues)
             throws TorqueException
         {
-            Connection con = null;
-            try
+            try (TorqueConnection con = Transaction.begin(dbName))
             {
-                con = Transaction.begin(dbName);
                 int rowCount = executeStatement(
                         statementString,
                         con,
                         replacementValues);
                 Transaction.commit(con);
-                con = null;
                 return rowCount;
             }
-            finally
-            {
-                if (con != null)
-                {
-                    Transaction.safeRollback(con);
-                }
-            }
         }
 
         /**

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/LargeSelect.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/LargeSelect.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/LargeSelect.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/LargeSelect.java Mon Aug 27 08:57:56 2018
@@ -22,7 +22,6 @@ package org.apache.torque.util;
 import java.io.IOException;
 import java.io.ObjectInputStream;
 import java.io.Serializable;
-import java.sql.Connection;
 import java.util.ArrayList;
 import java.util.Hashtable;
 import java.util.List;
@@ -524,9 +523,7 @@ public class LargeSelect<T> implements R
     public void run()
     {
         /* The connection to the database. */
-        Connection conn = null;
-
-        try
+        try (TorqueConnection conn = Transaction.begin(criteria.getDbName()))
         {
             results = new CopyOnWriteArrayList<T>();
 
@@ -555,9 +552,6 @@ public class LargeSelect<T> implements R
                 log.debug("run(): blockEnd = " + blockEnd);
             }
 
-            // Get a connection to the db.
-            conn = Transaction.begin(criteria.getDbName());
-
             // Continue getting rows one page at a time until the memory limit
             // is reached, all results have been retrieved, or the rest
             // of the results have been determined to be irrelevant.
@@ -627,7 +621,6 @@ public class LargeSelect<T> implements R
             }
 
             Transaction.commit(conn);
-            conn = null;
 
             if (log.isDebugEnabled())
             {
@@ -649,10 +642,6 @@ public class LargeSelect<T> implements R
         }
         finally
         {
-            if (conn != null)
-            {
-                Transaction.safeRollback(conn);
-            }
             threadRunning = false;
 
             // Make sure getResults() finally returns if we die.

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/SummaryHelper.java Mon Aug 27 08:57:56 2018
@@ -139,22 +139,12 @@ public class SummaryHelper
                 final List<Class<?>> resultTypes)
             throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(crit.getDbName()))
         {
-            connection = Transaction.begin(crit.getDbName());
             List<ListOrderedMapCI<Object>> result = summarize(crit, resultTypes, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**

Added: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnection.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnection.java?rev=1839284&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnection.java (added)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnection.java Mon Aug 27 08:57:56 2018
@@ -0,0 +1,35 @@
+package org.apache.torque.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.sql.Connection;
+
+import org.apache.torque.TorqueException;
+
+/**
+ * Torque's extension to the JDBC connection
+ *
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
+ */
+public interface TorqueConnection extends Connection
+{
+    @Override
+    void close() throws TorqueException;
+}

Propchange: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnection.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnectionImpl.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnectionImpl.java?rev=1839284&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnectionImpl.java (added)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnectionImpl.java Mon Aug 27 08:57:56 2018
@@ -0,0 +1,548 @@
+package org.apache.torque.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.sql.Array;
+import java.sql.Blob;
+import java.sql.CallableStatement;
+import java.sql.Clob;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.NClob;
+import java.sql.PreparedStatement;
+import java.sql.SQLClientInfoException;
+import java.sql.SQLException;
+import java.sql.SQLWarning;
+import java.sql.SQLXML;
+import java.sql.Savepoint;
+import java.sql.Statement;
+import java.sql.Struct;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.Executor;
+
+import org.apache.torque.TorqueException;
+
+/**
+ * Encapsulates connection status tracking and allows AutoClosing within Torque.
+ *
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
+ */
+public class TorqueConnectionImpl implements TorqueConnection
+{
+	/** Has this transaction already been committed? */
+	private boolean committed;
+
+    /** Has this transaction already been rolled back? */
+    private boolean rolledBack;
+
+	/** The wrapped connection instance */
+	private Connection connection;
+
+	/**
+     * Constructor
+     *
+	 */
+	public TorqueConnectionImpl(Connection con)
+	{
+		this.committed = false;
+        this.rolledBack = false;
+		this.connection = con;
+	}
+
+	/**
+	 * Has commit() been called successfully on this connection?
+	 * (for testing)
+	 *
+	 * @return true, if commit() has been called.
+	 */
+	public boolean isCommitted()
+	{
+		return committed;
+	}
+
+    /**
+     * Has rollback() been called successfully on this connection?
+     * (for testing)
+     *
+     * @return true, if rollback() has been called.
+     */
+    public boolean isRolledBack()
+    {
+        return rolledBack;
+    }
+
+	/**
+     * @see java.sql.Wrapper#unwrap(java.lang.Class)
+     */
+    public <T> T unwrap(Class<T> iface) throws SQLException
+    {
+        return connection.unwrap(iface);
+    }
+
+    /**
+     * @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
+     */
+    public boolean isWrapperFor(Class<?> iface) throws SQLException
+    {
+        return connection.isWrapperFor(iface);
+    }
+
+    /**
+     * @see java.sql.Connection#createStatement()
+     */
+    public Statement createStatement() throws SQLException
+    {
+        return connection.createStatement();
+    }
+
+    /**
+     * @see java.sql.Connection#prepareStatement(java.lang.String)
+     */
+    public PreparedStatement prepareStatement(String sql) throws SQLException
+    {
+        return connection.prepareStatement(sql);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareCall(java.lang.String)
+     */
+    public CallableStatement prepareCall(String sql) throws SQLException
+    {
+        return connection.prepareCall(sql);
+    }
+
+    /**
+     * @see java.sql.Connection#nativeSQL(java.lang.String)
+     */
+    public String nativeSQL(String sql) throws SQLException
+    {
+        return connection.nativeSQL(sql);
+    }
+
+    /**
+     * @see java.sql.Connection#setAutoCommit(boolean)
+     */
+    public void setAutoCommit(boolean autoCommit) throws SQLException
+    {
+        connection.setAutoCommit(autoCommit);
+    }
+
+    /**
+     * @see java.sql.Connection#getAutoCommit()
+     */
+    public boolean getAutoCommit() throws SQLException
+    {
+        return connection.getAutoCommit();
+    }
+
+    /**
+     * @see java.sql.Connection#commit()
+     */
+    public void commit() throws SQLException
+    {
+        connection.commit();
+        this.committed = true;
+    }
+
+    /**
+     * @see java.sql.Connection#rollback()
+     */
+    public void rollback() throws SQLException
+    {
+        connection.rollback();
+        this.rolledBack = true;
+    }
+
+    /**
+     * @see java.sql.Connection#close()
+     */
+    public void close() throws TorqueException
+    {
+        try
+        {
+            if (this.committed == false &&
+                this.rolledBack == false &&
+                connection.getAutoCommit() == false)
+            {
+                // calls close on the connection
+                Transaction.safeRollback(connection);
+                this.rolledBack = true;
+            }
+
+            if (!connection.isClosed())
+            {
+                connection.close();
+            }
+        }
+        catch (SQLException e)
+        {
+            throw new TorqueException(e);
+        }
+    }
+
+    /**
+     * @see java.sql.Connection#isClosed()
+     */
+    public boolean isClosed() throws SQLException
+    {
+        return connection.isClosed();
+    }
+
+    /**
+     * @see java.sql.Connection#getMetaData()
+     */
+    public DatabaseMetaData getMetaData() throws SQLException
+    {
+        return connection.getMetaData();
+    }
+
+    /**
+     * @see java.sql.Connection#setReadOnly(boolean)
+     */
+    public void setReadOnly(boolean readOnly) throws SQLException
+    {
+        connection.setReadOnly(readOnly);
+    }
+
+    /**
+     * @see java.sql.Connection#isReadOnly()
+     */
+    public boolean isReadOnly() throws SQLException
+    {
+        return connection.isReadOnly();
+    }
+
+    /**
+     * @see java.sql.Connection#setCatalog(java.lang.String)
+     */
+    public void setCatalog(String catalog) throws SQLException
+    {
+        connection.setCatalog(catalog);
+    }
+
+    /**
+     * @see java.sql.Connection#getCatalog()
+     */
+    public String getCatalog() throws SQLException
+    {
+        return connection.getCatalog();
+    }
+
+    /**
+     * @see java.sql.Connection#setTransactionIsolation(int)
+     */
+    public void setTransactionIsolation(int level) throws SQLException
+    {
+        connection.setTransactionIsolation(level);
+    }
+
+    /**
+     * @see java.sql.Connection#getTransactionIsolation()
+     */
+    public int getTransactionIsolation() throws SQLException
+    {
+        return connection.getTransactionIsolation();
+    }
+
+    /**
+     * @see java.sql.Connection#getWarnings()
+     */
+    public SQLWarning getWarnings() throws SQLException
+    {
+        return connection.getWarnings();
+    }
+
+    /**
+     * @see java.sql.Connection#clearWarnings()
+     */
+    public void clearWarnings() throws SQLException
+    {
+        connection.clearWarnings();
+    }
+
+    /**
+     * @see java.sql.Connection#createStatement(int, int)
+     */
+    public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException
+    {
+        return connection.createStatement(resultSetType, resultSetConcurrency);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareStatement(java.lang.String, int, int)
+     */
+    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
+            throws SQLException
+    {
+        return connection.prepareStatement(sql, resultSetType, resultSetConcurrency);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareCall(java.lang.String, int, int)
+     */
+    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException
+    {
+        return connection.prepareCall(sql, resultSetType, resultSetConcurrency);
+    }
+
+    /**
+     * @see java.sql.Connection#getTypeMap()
+     */
+    public Map<String, Class<?>> getTypeMap() throws SQLException
+    {
+        return connection.getTypeMap();
+    }
+
+    /**
+     * @see java.sql.Connection#setTypeMap(java.util.Map)
+     */
+    public void setTypeMap(Map<String, Class<?>> map) throws SQLException
+    {
+        connection.setTypeMap(map);
+    }
+
+    /**
+     * @see java.sql.Connection#setHoldability(int)
+     */
+    public void setHoldability(int holdability) throws SQLException
+    {
+        connection.setHoldability(holdability);
+    }
+
+    /**
+     * @see java.sql.Connection#getHoldability()
+     */
+    public int getHoldability() throws SQLException
+    {
+        return connection.getHoldability();
+    }
+
+    /**
+     * @see java.sql.Connection#setSavepoint()
+     */
+    public Savepoint setSavepoint() throws SQLException
+    {
+        return connection.setSavepoint();
+    }
+
+    /**
+     * @see java.sql.Connection#setSavepoint(java.lang.String)
+     */
+    public Savepoint setSavepoint(String name) throws SQLException
+    {
+        return connection.setSavepoint(name);
+    }
+
+    /**
+     * @see java.sql.Connection#rollback(java.sql.Savepoint)
+     */
+    public void rollback(Savepoint savepoint) throws SQLException
+    {
+        connection.rollback(savepoint);
+    }
+
+    /**
+     * @see java.sql.Connection#releaseSavepoint(java.sql.Savepoint)
+     */
+    public void releaseSavepoint(Savepoint savepoint) throws SQLException
+    {
+        connection.releaseSavepoint(savepoint);
+    }
+
+    /**
+     * @see java.sql.Connection#createStatement(int, int, int)
+     */
+    public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
+            throws SQLException
+    {
+        return connection.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareStatement(java.lang.String, int, int, int)
+     */
+    public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,
+            int resultSetHoldability) throws SQLException
+    {
+        return connection.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareCall(java.lang.String, int, int, int)
+     */
+    public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,
+            int resultSetHoldability) throws SQLException
+    {
+        return connection.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareStatement(java.lang.String, int)
+     */
+    public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException
+    {
+        return connection.prepareStatement(sql, autoGeneratedKeys);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareStatement(java.lang.String, int[])
+     */
+    public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException
+    {
+        return connection.prepareStatement(sql, columnIndexes);
+    }
+
+    /**
+     * @see java.sql.Connection#prepareStatement(java.lang.String, java.lang.String[])
+     */
+    public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException
+    {
+        return connection.prepareStatement(sql, columnNames);
+    }
+
+    /**
+     * @see java.sql.Connection#createClob()
+     */
+    public Clob createClob() throws SQLException
+    {
+        return connection.createClob();
+    }
+
+    /**
+     * @see java.sql.Connection#createBlob()
+     */
+    public Blob createBlob() throws SQLException
+    {
+        return connection.createBlob();
+    }
+
+    /**
+     * @see java.sql.Connection#createNClob()
+     */
+    public NClob createNClob() throws SQLException
+    {
+        return connection.createNClob();
+    }
+
+    /**
+     * @see java.sql.Connection#createSQLXML()
+     */
+    public SQLXML createSQLXML() throws SQLException
+    {
+        return connection.createSQLXML();
+    }
+
+    /**
+     * @see java.sql.Connection#isValid(int)
+     */
+    public boolean isValid(int timeout) throws SQLException
+    {
+        return connection.isValid(timeout);
+    }
+
+    /**
+     * @see java.sql.Connection#setClientInfo(java.lang.String, java.lang.String)
+     */
+    public void setClientInfo(String name, String value) throws SQLClientInfoException
+    {
+        connection.setClientInfo(name, value);
+    }
+
+    /**
+     * @see java.sql.Connection#setClientInfo(java.util.Properties)
+     */
+    public void setClientInfo(Properties properties) throws SQLClientInfoException
+    {
+        connection.setClientInfo(properties);
+    }
+
+    /**
+     * @see java.sql.Connection#getClientInfo(java.lang.String)
+     */
+    public String getClientInfo(String name) throws SQLException
+    {
+        return connection.getClientInfo(name);
+    }
+
+    /**
+     * @see java.sql.Connection#getClientInfo()
+     */
+    public Properties getClientInfo() throws SQLException
+    {
+        return connection.getClientInfo();
+    }
+
+    /**
+     * @see java.sql.Connection#createArrayOf(java.lang.String, java.lang.Object[])
+     */
+    public Array createArrayOf(String typeName, Object[] elements) throws SQLException
+    {
+        return connection.createArrayOf(typeName, elements);
+    }
+
+    /**
+     * @see java.sql.Connection#createStruct(java.lang.String, java.lang.Object[])
+     */
+    public Struct createStruct(String typeName, Object[] attributes) throws SQLException
+    {
+        return connection.createStruct(typeName, attributes);
+    }
+
+    /**
+     * @see java.sql.Connection#setSchema(java.lang.String)
+     */
+    public void setSchema(String schema) throws SQLException
+    {
+        connection.setSchema(schema);
+    }
+
+    /**
+     * @see java.sql.Connection#getSchema()
+     */
+    public String getSchema() throws SQLException
+    {
+        return connection.getSchema();
+    }
+
+    /**
+     * @see java.sql.Connection#abort(java.util.concurrent.Executor)
+     */
+    public void abort(Executor executor) throws SQLException
+    {
+        connection.abort(executor);
+    }
+
+    /**
+     * @see java.sql.Connection#setNetworkTimeout(java.util.concurrent.Executor, int)
+     */
+    public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException
+    {
+        connection.setNetworkTimeout(executor, milliseconds);
+    }
+
+    /**
+     * @see java.sql.Connection#getNetworkTimeout()
+     */
+    public int getNetworkTimeout() throws SQLException
+    {
+        return connection.getNetworkTimeout();
+    }
+}

Propchange: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TorqueConnectionImpl.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/Transaction.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/Transaction.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/Transaction.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/Transaction.java Mon Aug 27 08:57:56 2018
@@ -81,7 +81,7 @@ public final class Transaction
      * @throws TorqueException Any exceptions caught during processing will be
      *         rethrown wrapped into a TorqueException.
      */
-    public static Connection begin() throws TorqueException
+    public static TorqueConnection begin() throws TorqueException
     {
         return transactionManager.begin();
     }
@@ -99,7 +99,7 @@ public final class Transaction
      *
      * @throws TorqueException If the connection cannot be retrieved.
      */
-    public static Connection begin(final String dbName) throws TorqueException
+    public static TorqueConnection begin(final String dbName) throws TorqueException
     {
         return transactionManager.begin(dbName);
     }

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManager.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManager.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManager.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManager.java Mon Aug 27 08:57:56 2018
@@ -41,7 +41,7 @@ public interface TransactionManager
      * @throws TorqueException Any exceptions caught during processing will be
      *         rethrown wrapped into a TorqueException.
      */
-    Connection begin() throws TorqueException;
+    TorqueConnection begin() throws TorqueException;
 
     /**
      * Begin a transaction by retrieving a connection from the named database
@@ -56,7 +56,7 @@ public interface TransactionManager
      *
      * @throws TorqueException If the connection cannot be retrieved.
      */
-    Connection begin(String dbName) throws TorqueException;
+    TorqueConnection begin(String dbName) throws TorqueException;
 
 
     /**

Modified: db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManagerImpl.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManagerImpl.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManagerImpl.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/main/java/org/apache/torque/util/TransactionManagerImpl.java Mon Aug 27 08:57:56 2018
@@ -52,7 +52,7 @@ public class TransactionManagerImpl impl
      * @throws TorqueException Any exceptions caught during processing will be
      *         rethrown wrapped into a TorqueException.
      */
-    public Connection begin() throws TorqueException
+    public TorqueConnection begin() throws TorqueException
     {
         return begin(Torque.getDefaultDB());
     }
@@ -70,9 +70,9 @@ public class TransactionManagerImpl impl
      *
      * @throws TorqueException If the connection cannot be retrieved.
      */
-    public Connection begin(String dbName) throws TorqueException
+    public TorqueConnection begin(String dbName) throws TorqueException
     {
-        Connection con = Torque.getConnection(dbName);
+        TorqueConnection con = new TorqueConnectionImpl(Torque.getConnection(dbName));
         return con;
     }
 

Modified: db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java (original)
+++ db/torque/torque4/trunk/torque-runtime/src/test/java/org/apache/torque/util/BasePeerImplTest.java Mon Aug 27 08:57:56 2018
@@ -26,7 +26,6 @@ import static org.mockito.Mockito.verify
 import static org.mockito.Mockito.when;
 
 import java.math.BigDecimal;
-import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -70,7 +69,7 @@ public class BasePeerImplTest extends Ba
 
     /** Mock db connection. */
     @Mock
-    private Connection connection;
+    private TorqueConnection connection;
 
     /** Mock prepared statement. */
     @Mock
@@ -104,6 +103,7 @@ public class BasePeerImplTest extends Ba
         when(preparedStatement.executeQuery()).thenReturn(resultSet);
         when(preparedStatement.executeQuery((String) any())).thenReturn(resultSet);
         when(preparedStatement.executeUpdate()).thenReturn(1);
+
         when(transactionManager.begin(databaseMap.getName())).thenReturn(connection);
         when(transactionManager.begin(basePeerImpl.getDatabaseName())).thenReturn(connection);
         when(transactionManager.begin(null)).thenReturn(connection);
@@ -154,6 +154,7 @@ public class BasePeerImplTest extends Ba
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement(
                 "SELECT TABLE.COLUMN1, TABLE.COLUMN4 FROM TABLE LIMIT 1 OFFSET 2");
+        verify(connection).close();
         verify(preparedStatement).executeQuery();
         verify(preparedStatement).close();
         verify(resultSet, times(2)).next();
@@ -192,6 +193,7 @@ public class BasePeerImplTest extends Ba
 
         // verify mock (verification order not relevant)
         verify(connection).createStatement();
+        verify(connection).close();
         verify(preparedStatement).executeQuery("SELECT * from TABLE");
         verify(preparedStatement).close();
         verify(resultSet, times(2)).next();
@@ -312,6 +314,7 @@ public class BasePeerImplTest extends Ba
         verify(connection).prepareStatement(
                 "DELETE FROM schema.fully_qualified_table "
                 + "WHERE schema.fully_qualified_table.column=?");
+        verify(connection).close();
         verify(preparedStatement).setInt(1, 42);
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).close();
@@ -347,11 +350,13 @@ public class BasePeerImplTest extends Ba
         // verify mock
         verify(connection).prepareStatement(
                 "DELETE FROM TABLE WHERE TABLE.COLUMN1=?");
+        verify(connection).close();
         verify(preparedStatement).setString(1, "abc");
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).close();
         verify(transactionManager).begin("databaseName");
-        verify(transactionManager).safeRollback(connection);
+        // This is tested elsewhere
+        // verify(transactionManager).safeRollback(connection);
         verifyNoMoreInteractions(connection, preparedStatement, resultSet, transactionManager);
     }
 
@@ -375,6 +380,7 @@ public class BasePeerImplTest extends Ba
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement(
                 "INSERT INTO TABLE(COLUMN1,COLUMN2,COLUMN3,COLUMN4) VALUES (?,someDbFunction,?,?)");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).setObject(
                 1,
@@ -424,6 +430,7 @@ public class BasePeerImplTest extends Ba
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement(
                 "INSERT INTO TABLE(COLUMN2,COLUMN3,COLUMN1,COLUMN4) SELECT TABLE.COLUMN1, TABLE.COLUMN2, TABLE.COLUMN3, TABLE.COLUMN4 FROM TABLE WHERE TABLE.COLUMN2=TABLE.COLUMN3");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).close();
         verify(transactionManager).begin(databaseMap.getName());
@@ -462,6 +469,7 @@ public class BasePeerImplTest extends Ba
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement(
                 "INSERT INTO TABLE(COLUMN1,COLUMN4) VALUES (?,?)");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).setObject(
                 1,
@@ -473,7 +481,8 @@ public class BasePeerImplTest extends Ba
                 Types.INTEGER);
         verify(preparedStatement).close();
         verify(transactionManager).begin(databaseMap.getName());
-        verify(transactionManager).safeRollback(connection);
+        // This is tested elsewhere
+        // verify(transactionManager).safeRollback(connection);
         verifyNoMoreInteractions(connection, preparedStatement, resultSet, transactionManager);
     }
 
@@ -495,6 +504,7 @@ public class BasePeerImplTest extends Ba
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement(
                 "INSERT INTO TABLE(COLUMN1,COLUMN4) VALUES (?,?)");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).setObject(
                 1,
@@ -540,6 +550,7 @@ public class BasePeerImplTest extends Ba
                 + "COLUMN3=?,"
                 + "COLUMN4=? "
                 + "WHERE TABLE.COLUMN4=?");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).setObject(
                 1,
@@ -583,6 +594,7 @@ public class BasePeerImplTest extends Ba
                 + "COLUMN2=someDbFunction,"
                 + "COLUMN3=? "
                 + "WHERE TABLE.COLUMN4=?");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).setObject(
                 1,
@@ -620,6 +632,7 @@ public class BasePeerImplTest extends Ba
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement(
                 "SELECT * from TABLE WHERE Column1=? AND COLUMN2=:notExistingKey AND COLUMN3=?");
+        verify(connection).close();
         verify(preparedStatement).setObject(1, 1, 1);
         verify(preparedStatement).setObject(2, "3", 3);
         verify(preparedStatement).executeUpdate();
@@ -644,6 +657,7 @@ public class BasePeerImplTest extends Ba
 
         // verify mock (verification order not relevant)
         verify(connection).prepareStatement("SELECT * from TABLE");
+        verify(connection).close();
         verify(preparedStatement).executeUpdate();
         verify(preparedStatement).close();
         verify(transactionManager).begin("postgresql");

Modified: db/torque/torque4/trunk/torque-site/src/site/xdoc/documentation/orm-reference/connections-transactions.xml
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-site/src/site/xdoc/documentation/orm-reference/connections-transactions.xml?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-site/src/site/xdoc/documentation/orm-reference/connections-transactions.xml (original)
+++ db/torque/torque4/trunk/torque-site/src/site/xdoc/documentation/orm-reference/connections-transactions.xml Mon Aug 27 08:57:56 2018
@@ -122,6 +122,22 @@ finally
     </p>
 
     <p>
+      As of Torque 4.1 and the advent of the try-with-resources construct, 
+      this can be further simplified. Simply use TorqueConnection instead,
+      which handles the automatic closing and possibly rollback internally:
+    </p>
+
+<source>
+try (TorqueConnection connection = Transaction.begin())
+{
+    // do something with connection, e.g.
+    // someObject.save(connection);
+
+    Transaction.commit(connection);
+}
+</source>
+
+    <p>
       If the database supports transactions and autocommit is turned off,
       all database operations are executed in a single transaction. 
       This has the following effect: For example, you execute two saves in the

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/imports.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/imports.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/imports.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/imports.vm Mon Aug 27 08:57:56 2018
@@ -58,6 +58,7 @@ import org.apache.torque.om.ColumnAccess
 #end##
 import $torqueGen.option("torque.om.criteriaClass");
 #if ($torqueGen.booleanOption("torque.om.addSaveMethods") && $saveMethodsInDbObjects == "true")
+import org.apache.torque.util.TorqueConnection;
 import org.apache.torque.util.Transaction;
 #end
 import org.apache.commons.lang.ObjectUtils;

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/joinGetterReferencingObject.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/joinGetterReferencingObject.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/joinGetterReferencingObject.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/joinGetterReferencingObject.vm Mon Aug 27 08:57:56 2018
@@ -58,24 +58,13 @@
      */
     ${getterAccessModifier} $fieldType ${getter}(Criteria criteria) throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(criteria.getDbName()))
         {
-            connection = Transaction.begin(criteria.getDbName());
-
             $fieldType result = ${getter}(criteria, connection);
 
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
 #end

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/general/saveMethods.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/general/saveMethods.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/general/saveMethods.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/general/saveMethods.vm Mon Aug 27 08:57:56 2018
@@ -94,25 +94,17 @@
     public void save(${methodInputParamWithComma}String dbName) 
             throws $saveException
     {
-        Connection con = null;
 #if ($torqueGen.booleanOption("torque.om.complexObjectModel"))
-        try
+        try (TorqueConnection con = Transaction.begin(dbName))
         {
-            con = Transaction.begin(dbName);
             save(${toSaveVariableWithComma}con);
             Transaction.commit(con);
         }
-        catch(TorqueException e)
-        {
-            Transaction.safeRollback(con);
-            throw e;
-        }
 #else
         if (${toSaveVariableWithDot}isModified())
         {
-            try
+            try (TorqueConnection con = Transaction.begin(dbName))
             {
-                con = Torque.getConnection(dbName);
 #if ($torqueGen.booleanOption("torque.om.trackSaving"))
                 ${toSaveVariableWithDot}setSaving(true);
 #end
@@ -125,14 +117,14 @@
                 {
                     ${peerClassName}.doUpdate($toSaveVariable, con);
                 }
+                Transaction.commit(con);
             }
+#if ($torqueGen.booleanOption("torque.om.trackSaving"))
             finally
             {
-#if ($torqueGen.booleanOption("torque.om.trackSaving"))
                 ${toSaveVariableWithDot}setSaving(false);
-#end
-                Torque.closeConnection(con);
             }
+#end
         }
 #end
     }

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoin.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoin.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoin.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoin.vm Mon Aug 27 08:57:56 2018
@@ -55,23 +55,13 @@
     public List<${dbObjectClassName}> ${peerJoinSelectMethod}(Criteria criteria)
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             List<${dbObjectClassName}> result
                     = $peerClassName.${peerJoinSelectMethod}(criteria, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoinAllExcept.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoinAllExcept.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoinAllExcept.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/doSelectJoinAllExcept.vm Mon Aug 27 08:57:56 2018
@@ -54,23 +54,13 @@
     protected List<${dbObjectClassName}> ${peerJoinAllExceptSelectMethod}(Criteria criteria)
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             List<${dbObjectClassName}> result
                     = $peerClassName.${peerJoinAllExceptSelectMethod}(criteria, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencedObject.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencedObject.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencedObject.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencedObject.vm Mon Aug 27 08:57:56 2018
@@ -85,23 +85,13 @@
             int chunkSize) 
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             List<${fieldType}> result 
                     = ${filler}(toFill, chunkSize, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /** 

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencingObjects.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencingObjects.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencingObjects.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/fillReferencingObjects.vm Mon Aug 27 08:57:56 2018
@@ -85,25 +85,15 @@
             int chunkSize)
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             List<${fieldContainedType}> result = ${filler}(
                     toFill,
                     chunkSize,
                     connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /** 

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/imports.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/imports.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/imports.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/imports.vm Mon Aug 27 08:57:56 2018
@@ -70,6 +70,7 @@ import org.apache.torque.om.ObjectKey;
 import org.apache.torque.om.SimpleKey;
 import org.apache.torque.om.ComboKey;
 import org.apache.torque.map.TableMap;
+import org.apache.torque.util.TorqueConnection;
 import org.apache.torque.util.Transaction;
 import org.apache.torque.util.ColumnValues;
 import org.apache.torque.util.JdbcTypedValue;

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPK.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPK.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPK.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPK.vm Mon Aug 27 08:57:56 2018
@@ -86,10 +86,8 @@
     #end
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             $dbObjectClassName result = retrieveByPK(
     #foreach ($columnElement in $primaryKeyColumnElements)
       #set ( $columnField = $columnElement.getAttribute("field") )
@@ -97,16 +95,8 @@
     #end
                connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -156,22 +146,12 @@
     public $dbObjectClassName retrieveByPK(ObjectKey pk)
         throws TorqueException, NoRowsException, TooManyRowsException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             $dbObjectClassName result = retrieveByPK(pk, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPKs.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPKs.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPKs.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/retrieveByPKs.vm Mon Aug 27 08:57:56 2018
@@ -46,22 +46,12 @@
     public List<${dbObjectClassName}> retrieveByTypedPKs(Collection<${columnFieldType}> pks)
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             List<${dbObjectClassName}> result = retrieveByTypedPKs(pks, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**
@@ -110,22 +100,12 @@
     public List<${dbObjectClassName}> retrieveByObjectKeys(Collection<ObjectKey> pks)
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             List<${dbObjectClassName}> result = retrieveByObjectKeys(pks, connection);
             Transaction.commit(connection);
-            connection = null;
             return result;
         }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
-        }
     }
 
     /**

Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm (original)
+++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/peer/impl/base/setAndSaveReferencing.vm Mon Aug 27 08:57:56 2018
@@ -73,20 +73,10 @@
             Collection<${foreignDbObjectClassName}> toSave) 
         throws TorqueException
     {
-        Connection connection = null;
-        try
+        try (TorqueConnection connection = Transaction.begin(getDatabaseName()))
         {
-            connection = Transaction.begin(getDatabaseName());
             ${setAndSaveMethodName}(toLinkTo, toSave, connection);
             Transaction.commit(connection);
-            connection = null;
-        }
-        finally
-        {
-            if (connection != null)
-            {
-                Transaction.safeRollback(connection);
-            }
         }
     }
 

Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/sql/SkipSqlTest.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/sql/SkipSqlTest.java?rev=1839284&r1=1839283&r2=1839284&view=diff
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/sql/SkipSqlTest.java (original)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/sql/SkipSqlTest.java Mon Aug 27 08:57:56 2018
@@ -53,5 +53,4 @@ public class SkipSqlTest extends BaseDat
             }
         }
     }
-
 }

Added: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/TorqueConnectionImplTest.java
URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/TorqueConnectionImplTest.java?rev=1839284&view=auto
==============================================================================
--- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/TorqueConnectionImplTest.java (added)
+++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/TorqueConnectionImplTest.java Mon Aug 27 08:57:56 2018
@@ -0,0 +1,78 @@
+package org.apache.torque.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.util.List;
+
+import org.apache.torque.BaseDatabaseTestCase;
+import org.apache.torque.TorqueException;
+import org.apache.torque.criteria.Criteria;
+import org.apache.torque.test.dbobject.Author;
+import org.apache.torque.test.peer.AuthorPeer;
+import org.apache.torque.test.peer.BookPeer;
+
+/**
+ * Test correct behavior if Transaction is used with the try-with-resources pattern
+ *
+ * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a>
+ */
+public class TorqueConnectionImplTest extends BaseDatabaseTestCase
+{
+    public void testTryWithResources() throws TorqueException
+    {
+        // prepare
+        cleanBookstore();
+        insertBookstoreData();
+
+        try(TorqueConnection con = Transaction.begin())
+        {
+			BookPeer.doSelect(new Criteria(), con);
+			Transaction.commit(con);
+
+			@SuppressWarnings("resource")
+            TorqueConnectionImpl conImpl = (TorqueConnectionImpl)con;
+            assertTrue(conImpl.isCommitted());
+		}
+        catch (TorqueException e)
+        {
+			// expected
+		}
+
+        Author author = new Author();
+        author.setName("AuthorProxy");
+
+        try(TorqueConnection con = Transaction.begin())
+        {
+            author.save(con);
+            throw new TorqueException("Forcing rollback");
+        }
+        catch (TorqueException e)
+        {
+			// expected
+		}
+
+        Criteria criteria = new Criteria();
+        criteria.where(AuthorPeer.NAME, "AuthorProxy");
+        List<Author> authors = AuthorPeer.doSelect(criteria);
+
+        // Record should not be there
+        assertEquals(0, authors.size());
+    }
+}

Propchange: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/util/TorqueConnectionImplTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain



---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Vandahl <tv...@apache.org>.
On 9/11/18 5:41 AM, Thomas Fox wrote:
> Another idea: Not TorqueConnectionImpl.rollback() and TorqueConnectionImpl.commit() set the flag to not rollback on close(), but TransactionImpl.rollback() and TransactionImpl.commit(). So in this case the user can commit() and rollback() on the connection to his heart's content, but only a call on  TorqueConnectionImpl.commit()/.rollback()(which closes the connection anyway) changes the connection close behavior. What do you think?

That sounds reasonable. The context is well-defined and the behavior can
be documented easily. I'll give it a try and see how it goes.

Bye, Thomas


---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Fox <th...@seitenbau.com>.
On 9. 7. 2018, Thomas Vandahl wrote:
> On 9/6/18 7:03 AM, Thomas Fox wrote:
> > Ok, but should we not reset the committed and rolledBack Flag when the user could have issued further statements after a commit/rollback, e.g. when connection.createStatement() ist called?
> 
> Yes, I agree - at least in the general case. I our case, however,
> TorqueConnection is returned from our TransactionManagerImpl which
> happens to *close* the connection right after commit.

I agree. In Torque's current usage, there is no need for handling operations after commit or rollback. However, as the connection is passed to the user, some users might be tempted to call rollback and commit on the connection itself, and things will become strange then (no rollback on connection.close() for example).

> I was thinking that probably the easiest way to handle the connection
> state is to rollback unconditionally before close. If work had been
> committed, no harm would be done. If not, we need to rollback anyway.
> WDYT? Do you have any idea of the performance implications?

Probably this will work in most cases. I'm not sure whether it will work in all cases. I have no idea about performance implications though I suspect them to be small.
Personally I like such behavior to be configurable for handling edge cases.

Another idea: Not TorqueConnectionImpl.rollback() and TorqueConnectionImpl.commit() set the flag to not rollback on close(), but TransactionImpl.rollback() and TransactionImpl.commit(). So in this case the user can commit() and rollback() on the connection to his heart's content, but only a call on  TorqueConnectionImpl.commit()/.rollback()(which closes the connection anyway) changes the connection close behavior. What do you think?

    Thomas

Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Vandahl <tv...@apache.org>.
On 9/6/18 7:03 AM, Thomas Fox wrote:
> Ok, but should we not reset the committed and rolledBack Flag when the user could have issued further statements after a commit/rollback, e.g. when connection.createStatement() ist called?

Yes, I agree - at least in the general case. I our case, however,
TorqueConnection is returned from our TransactionManagerImpl which
happens to *close* the connection right after commit.

I was thinking that probably the easiest way to handle the connection
state is to rollback unconditionally before close. If work had been
committed, no harm would be done. If not, we need to rollback anyway.
WDYT? Do you have any idea of the performance implications?

Bye, Thomas

---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Fox <th...@seitenbau.com>.
On 05.09.18 19:30, Thomas Vandahl wrote:
> On 05.09.18 19:19, Thomas Vandahl wrote:
>> On 03.09.18 05:32, Thomas Fox wrote:
>>> As I understand it, TorqueConnectionImpl.committed and TorqueConnectionImpl.rolledBack keep track of whether there could be outstanding operations in a transaction. So when one calls close() on a connection with uncommitted changes these get rolled back. But what if one calls commit() and then does other operations on the connection? As I understand the javadoc of java.sql.Connection, this is legal (maybe I'm wrong). But the current logic in TorqueConnectionImpl would not do any rollback on close() then.
>> 
>> I will have to check what the contract actually is. The implementation
>> right now is more or less a 80% solution.
>
>The Javadoc of close() actually says:
>
>It is strongly recommended that an application explicitly commits or
>rolls back an active transaction prior to calling the close method. If
>the close method is called and there is an active transaction, the
>results are implementation-defined.
>
>As I read it, this gives us some freedom in the "definition of our
>implementation".

Ok, but should we not reset the committed and rolledBack Flag when the user could have issued further statements after a commit/rollback, e.g. when connection.createStatement() ist called?

   Thomas

Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Vandahl <tv...@apache.org>.
On 05.09.18 19:19, Thomas Vandahl wrote:
> On 03.09.18 05:32, Thomas Fox wrote:
>> As I understand it, TorqueConnectionImpl.committed and TorqueConnectionImpl.rolledBack keep track of whether there could be outstanding operations in a transaction. So when one calls close() on a connection with uncommitted changes these get rolled back. But what if one calls commit() and then does other operations on the connection? As I understand the javadoc of java.sql.Connection, this is legal (maybe I'm wrong). But the current logic in TorqueConnectionImpl would not do any rollback on close() then.
> 
> I will have to check what the contract actually is. The implementation
> right now is more or less a 80% solution.

The Javadoc of close() actually says:

It is strongly recommended that an application explicitly commits or
rolls back an active transaction prior to calling the close method. If
the close method is called and there is an active transaction, the
results are implementation-defined.

As I read it, this gives us some freedom in the "definition of our
implementation".

Bye, Thomas

---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Vandahl <tv...@apache.org>.
On 03.09.18 05:32, Thomas Fox wrote:
> As I understand it, TorqueConnectionImpl.committed and TorqueConnectionImpl.rolledBack keep track of whether there could be outstanding operations in a transaction. So when one calls close() on a connection with uncommitted changes these get rolled back. But what if one calls commit() and then does other operations on the connection? As I understand the javadoc of java.sql.Connection, this is legal (maybe I'm wrong). But the current logic in TorqueConnectionImpl would not do any rollback on close() then.

I will have to check what the contract actually is. The implementation
right now is more or less a 80% solution.

> And does TorqueCoonnectionImpl keep the contract of java.sql.Connection.close()? It says in https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#close()that close() would release all resources, but TorqueConnectionImpl  does more than that. However, I know other frameworks, e.g. Connection pools, which do other stuff on close() to guarantee a clean connection, but personally I'm not happy about that either.

Actually, the standard contract of a JDBC connection is already bent
badly by all connection pools that I know. I think we are not worse.

> Just a not-well-thought-through idea: Perhaps one can solve some of these issues if TorqueConnection would not inherit from java.sql.Connection, but would be a different object wrapping a java.sql.Connection, with a different contract, like:

My goal was to change as little as possible in the rest of the code. If
we introduce our own connection object, all signatures of our methods
taking java.sql.Connection must be changed. I see advantages and
disadvantages in this approach. I just didn't want to get into it.

Bye, Thomas

---------------------------------------------------------------------
To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org
For additional commands, e-mail: torque-dev-help@db.apache.org


Re: svn commit: r1839284 - in /db/torque/torque4/trunk: torque-runtime/src/main/java/org/apache/torque/ torque-runtime/src/main/java/org/apache/torque/oid/ torque-runtime/src/main/java/org/apache/torque/util/ torque-runtime/src/test/java/org/apache/torque/...

Posted by Thomas Fox <th...@seitenbau.com>.
Thomas,

I'm sorry but I do not understand the state kept in TorqueConnectionImpl. 
As I understand it, TorqueConnectionImpl.committed and TorqueConnectionImpl.rolledBack keep track of whether there could be outstanding operations in a transaction. So when one calls close() on a connection with uncommitted changes these get rolled back. But what if one calls commit() and then does other operations on the connection? As I understand the javadoc of java.sql.Connection, this is legal (maybe I'm wrong). But the current logic in TorqueConnectionImpl would not do any rollback on close() then.

And what id autocommit is true? Should there be any rollback attempt in this case? And what if the user switches from autoaommit to non autocommit in the midst of doing database operation?

These are just some random questions, in no way complete. In short, I am not sure whether one wants to get involved in the (perhaps complicated) state keeping logic of java.sql.Connection.

And does TorqueCoonnectionImpl keep the contract of java.sql.Connection.close()? It says in https://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#close()that close() would release all resources, but TorqueConnectionImpl  does more than that. However, I know other frameworks, e.g. Connection pools, which do other stuff on close() to guarantee a clean connection, but personally I'm not happy about that either.

Just a not-well-thought-through idea: Perhaps one can solve some of these issues if TorqueConnection would not inherit from java.sql.Connection, but would be a different object wrapping a java.sql.Connection, with a different contract, like:

public class TorqueTransactionConnection implements AutoCloseable
{
  private java.sql.Connection connection;

  public TorqueTransactionConnectionImpl()
  {
    connection = TransactionManagerImpl.begin();
  }

  public void commit()
  {
    if (connection == null)
    {
      throw new IllegalStateException("already closed");
    }
    TorqueTransactionConnectionImpl.commit(connection);
    connection = null;
  }
    
  public void rollback()
  {
    // analogous to close
  }

  public void close()
  {
    rollback();
  }
}

Not sure if that idea works through, though.

     Thomas