You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by sc...@apache.org on 2012/08/03 14:27:59 UTC
svn commit: r1368916 - in /jackrabbit/branches/2.4: ./
jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java
Author: schans
Date: Fri Aug 3 12:27:59 2012
New Revision: 1368916
URL: http://svn.apache.org/viewvc?rev=1368916&view=rev
Log:
JCR-3387: Backport: fix the occasional SQLException: closed statement: next
Modified:
jackrabbit/branches/2.4/ (props changed)
jackrabbit/branches/2.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java
Propchange: jackrabbit/branches/2.4/
------------------------------------------------------------------------------
Merged /jackrabbit/trunk:r1367057
Modified: jackrabbit/branches/2.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java
URL: http://svn.apache.org/viewvc/jackrabbit/branches/2.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java?rev=1368916&r1=1368915&r2=1368916&view=diff
==============================================================================
--- jackrabbit/branches/2.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java (original)
+++ jackrabbit/branches/2.4/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java Fri Aug 3 12:27:59 2012
@@ -22,6 +22,7 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -80,7 +81,7 @@ public class ConnectionHelper {
protected final DataSource dataSource;
- private Map<String, Connection> batchConnectionMap = Collections.synchronizedMap(new HashMap<String, Connection>());
+ private Map<Object, Connection> batchConnectionMap = Collections.synchronizedMap(new HashMap<Object, Connection>());
/**
* The default fetchSize is '0'. This means the fetchSize Hint will be ignored
@@ -448,7 +449,7 @@ public class ConnectionHelper {
*/
private Connection getTransactionAwareBatchConnection() {
Object threadId = TransactionContext.getCurrentThreadId();
- return batchConnectionMap.get(threadIdToString(threadId));
+ return batchConnectionMap.get(threadIdToObject(threadId));
}
/**
@@ -460,7 +461,7 @@ public class ConnectionHelper {
*/
private void setTransactionAwareBatchConnection(Connection batchConnection) {
Object threadId = TransactionContext.getCurrentThreadId();
- batchConnectionMap.put(threadIdToString(threadId), batchConnection);
+ batchConnectionMap.put(threadIdToObject(threadId), batchConnection);
}
/**
@@ -468,7 +469,7 @@ public class ConnectionHelper {
*/
private void removeTransactionAwareBatchConnection() {
Object threadId = TransactionContext.getCurrentThreadId();
- batchConnectionMap.remove(threadIdToString(threadId));
+ batchConnectionMap.remove(threadIdToObject(threadId));
}
/**
@@ -477,22 +478,9 @@ public class ConnectionHelper {
* @param threadId
* @return String
*/
- private String threadIdToString(Object threadId) {
+ private Object threadIdToObject(Object threadId) {
if (threadId instanceof byte[]) {
- byte[] gtrid = (byte[]) threadId;
- int hexVal;
- StringBuffer sb = new StringBuffer(512);
- sb.append(" gtrid(" + gtrid.length + ")={0x");
- for (int i=0; i< gtrid.length; i++) {
- hexVal = gtrid[i]&0xFF;
- if ( hexVal < 0x10 ) {
- sb.append("0" + Integer.toHexString(gtrid[i]&0xFF));
- } else {
- sb.append(Integer.toHexString(gtrid[i]&0xFF));
- }
- }
- sb.append("}");
- return sb.toString();
+ return new XidWrapper((byte[]) threadId);
} else {
return threadId.toString();
}
@@ -617,4 +605,29 @@ public class ConnectionHelper {
}
}
}
+
+ /**
+ * Wrapper around a global transaction id (byte[])
+ * that handles hashCode and equals in a proper way.
+ */
+ private class XidWrapper {
+ private byte[] gtid;
+
+ public XidWrapper(byte[] gtid) {
+ this.gtid = gtid;
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof XidWrapper)) {
+ return false;
+ }
+ return TransactionContext.isSameThreadId(gtid, ((XidWrapper)other).gtid);
+ }
+
+ @Override
+ public int hashCode() {
+ return Arrays.hashCode(gtid);
+ }
+ }
}