Skip to content

Commit 283fe70

Browse files
committed
Fix for http://code.google.com/p/mybatis/issues/detail?id=197 and hopefully http://code.google.com/p/mybatis/issues/detail?id=147 . Ignore resetAutocommit exceptions and refactored exception handling on close.
1 parent e5d63c6 commit 283fe70

File tree

4 files changed

+39
-33
lines changed

4 files changed

+39
-33
lines changed

src/main/java/org/apache/ibatis/executor/BaseExecutor.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,36 @@
11
package org.apache.ibatis.executor;
22

3-
import org.apache.ibatis.cache.CacheKey;
4-
import org.apache.ibatis.cache.impl.PerpetualCache;
53
import static org.apache.ibatis.executor.ExecutionPlaceholder.EXECUTION_PLACEHOLDER;
64

7-
import org.apache.ibatis.mapping.*;
5+
import java.sql.SQLException;
6+
import java.sql.Statement;
7+
import java.util.ArrayList;
8+
import java.util.Collection;
9+
import java.util.HashSet;
10+
import java.util.List;
11+
import java.util.Set;
12+
import java.util.concurrent.ConcurrentLinkedQueue;
13+
14+
import org.apache.ibatis.cache.CacheKey;
15+
import org.apache.ibatis.cache.impl.PerpetualCache;
16+
import org.apache.ibatis.logging.Log;
17+
import org.apache.ibatis.logging.LogFactory;
18+
import org.apache.ibatis.mapping.BoundSql;
19+
import org.apache.ibatis.mapping.MappedStatement;
20+
import org.apache.ibatis.mapping.ParameterMapping;
21+
import org.apache.ibatis.mapping.ParameterMode;
22+
import org.apache.ibatis.mapping.StatementType;
823
import org.apache.ibatis.reflection.MetaObject;
24+
import org.apache.ibatis.session.Configuration;
925
import org.apache.ibatis.session.ResultHandler;
1026
import org.apache.ibatis.session.RowBounds;
11-
import org.apache.ibatis.session.Configuration;
1227
import org.apache.ibatis.transaction.Transaction;
1328
import org.apache.ibatis.type.TypeHandlerRegistry;
1429

15-
import java.sql.SQLException;
16-
import java.sql.Statement;
17-
import java.util.*;
18-
import java.util.concurrent.ConcurrentLinkedQueue;
19-
2030
public abstract class BaseExecutor implements Executor {
2131

32+
private static final Log log = LogFactory.getLog(BaseExecutor.class);
33+
2234
protected Transaction transaction;
2335

2436
protected ConcurrentLinkedQueue<DeferredLoad> deferredLoads;
@@ -54,6 +66,7 @@ public void close(boolean forceRollback) {
5466
}
5567
} catch (SQLException e) {
5668
// Ignore. There's nothing that can be done at this point.
69+
log.debug("Unexpected exception on closing transaction. Cause: " + e);
5770
} finally {
5871
transaction = null;
5972
deferredLoads = null;
@@ -262,8 +275,6 @@ public void load() {
262275
}
263276
resultObject.setValue(property, value);
264277
}
265-
266278
}
267279

268-
269280
}

src/main/java/org/apache/ibatis/session/defaults/DefaultSqlSession.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,6 @@ public void close() {
165165
try {
166166
executor.close(isCommitOrRollbackRequired(false));
167167
dirty = false;
168-
} catch (Exception e) {
169-
throw ExceptionFactory.wrapException("Error closing transaction. Cause: " + e, e);
170168
} finally {
171169
ErrorContext.instance().reset();
172170
}

src/main/java/org/apache/ibatis/transaction/jdbc/JdbcTransaction.java

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
package org.apache.ibatis.transaction.jdbc;
22

3-
import org.apache.ibatis.transaction.Transaction;
4-
import org.apache.ibatis.transaction.TransactionException;
5-
63
import java.sql.Connection;
74
import java.sql.SQLException;
85

6+
import org.apache.ibatis.logging.Log;
7+
import org.apache.ibatis.logging.LogFactory;
8+
import org.apache.ibatis.transaction.Transaction;
9+
import org.apache.ibatis.transaction.TransactionException;
10+
911
public class JdbcTransaction implements Transaction {
1012

13+
private static final Log log = LogFactory.getLog(JdbcTransaction.class);
14+
1115
protected Connection connection;
1216

1317
public JdbcTransaction(Connection connection, boolean desiredAutoCommit) {
@@ -53,14 +57,15 @@ protected void setDesiredAutoCommit(boolean desiredAutoCommit) {
5357
protected void resetAutoCommit() {
5458
try {
5559
if (!connection.getAutoCommit()) {
56-
// for compatibility we always use true, as some drivers don't like being left in "false" mode.
60+
// MyBatis does not call commit/rollback on a connection if just selects were performed.
61+
// Some databases start transactions with select statements
62+
// and they mandate a commit/rollback before closing the connection.
63+
// A workaround is setting the autocommit to true before closing the connection.
5764
connection.setAutoCommit(true);
5865
}
5966
} catch (SQLException e) {
60-
// Only a very poorly implemented driver would fail here,
61-
// and there's not much we can do about that.
62-
throw new TransactionException("Error configuring AutoCommit. " +
63-
"Your driver may not support getAutoCommit() or setAutoCommit(). Cause: " + e, e);
67+
log.debug("Error resetting autocommit to true " +
68+
"before closing the connection. Cause: " + e);
6469
}
6570
}
6671

src/main/java/org/apache/ibatis/transaction/managed/ManagedTransaction.java

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,14 @@
11
package org.apache.ibatis.transaction.managed;
22

3-
import org.apache.ibatis.logging.Log;
4-
import org.apache.ibatis.logging.LogFactory;
5-
import org.apache.ibatis.transaction.Transaction;
6-
73
import java.sql.Connection;
84
import java.sql.SQLException;
95

10-
public class ManagedTransaction implements Transaction {
6+
import org.apache.ibatis.transaction.Transaction;
117

12-
private static final Log log = LogFactory.getLog(ManagedTransaction.class);
8+
public class ManagedTransaction implements Transaction {
139

1410
private Connection connection;
11+
1512
private boolean closeConnection;
1613

1714
public ManagedTransaction(Connection connection, boolean closeConnection) {
@@ -33,12 +30,7 @@ public void rollback() throws SQLException {
3330

3431
public void close() throws SQLException {
3532
if (closeConnection) {
36-
try {
37-
if (connection != null) connection.close();
38-
} catch (SQLException e) {
39-
// Log and ignore. Nothing more that should be done here.
40-
log.error(e.getMessage(), e);
41-
}
33+
connection.close();
4234
}
4335
}
4436

0 commit comments

Comments
 (0)