You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by jm...@apache.org on 2003/08/25 19:08:52 UTC
cvs commit: jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources TestPerUserPoolDataSource.java TestSharedPoolDataSource.java
jmcnally 2003/08/25 10:08:52
Modified: dbcp/src/java/org/apache/commons/dbcp/datasources
InstanceKeyDataSource.java
PerUserPoolDataSource.java
SharedPoolDataSource.java
dbcp/src/test/org/apache/commons/dbcp/datasources
TestPerUserPoolDataSource.java
TestSharedPoolDataSource.java
Log:
Added default transaction isolation. Original patch was from Dan Price
against the old Jdbc2Pool code.
Also removed synchronized from registerPool as it is private and always
called from a synchronized method.
Revision Changes Path
1.5 +46 -4 jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/datasources/InstanceKeyDataSource.java
Index: InstanceKeyDataSource.java
===================================================================
RCS file: /home/cvs/jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/datasources/InstanceKeyDataSource.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- InstanceKeyDataSource.java 22 Aug 2003 16:08:32 -0000 1.4
+++ InstanceKeyDataSource.java 25 Aug 2003 17:08:51 -0000 1.5
@@ -136,6 +136,12 @@
private static final String GET_CONNECTION_CALLED
= "A Connection was already requested from this source, "
+ "further initialization is not allowed.";
+ private static final String BAD_TRANSACTION_ISOLATION
+ = "The requested TransactionIsolation level is invalid.";
+ /**
+ * Internal constant to indicate the level is not set.
+ */
+ protected static final int UNKNOWN_TRANSACTIONISOLATION = -1;
private boolean getConnectionCalled = false;
@@ -143,6 +149,7 @@
/** DataSource Name used to find the ConnectionPoolDataSource */
private String dataSourceName = null;
private boolean defaultAutoCommit = false;
+ private int defaultTransactionIsolation = UNKNOWN_TRANSACTIONISOLATION;
private int maxActive = GenericObjectPool.DEFAULT_MAX_ACTIVE;
private int maxIdle = GenericObjectPool.DEFAULT_MAX_IDLE;
private int maxWait = (int)Math.min((long)Integer.MAX_VALUE,
@@ -312,6 +319,41 @@
public void setDefaultReadOnly(boolean v) {
assertInitializationAllowed();
this.defaultReadOnly = v;
+ }
+
+ /**
+ * Get the value of defaultTransactionIsolation, which defines the state of
+ * connections handed out from this pool. The value can be changed
+ * on the Connection using Connection.setTransactionIsolation(int).
+ * If this method returns -1, the default is JDBC driver dependent.
+ *
+ * @return value of defaultTransactionIsolation.
+ */
+ public int getDefaultTransactionIsolation() {
+ return defaultTransactionIsolation;
+ }
+
+ /**
+ * Set the value of defaultTransactionIsolation, which defines the state of
+ * connections handed out from this pool. The value can be changed
+ * on the Connection using Connection.setTransactionIsolation(int).
+ * The default is JDBC driver dependent.
+ *
+ * @param v Value to assign to defaultTransactionIsolation
+ */
+ public void setDefaultTransactionIsolation(int v) {
+ assertInitializationAllowed();
+ switch (v) {
+ case Connection.TRANSACTION_NONE:
+ case Connection.TRANSACTION_READ_COMMITTED:
+ case Connection.TRANSACTION_READ_UNCOMMITTED:
+ case Connection.TRANSACTION_REPEATABLE_READ:
+ case Connection.TRANSACTION_SERIALIZABLE:
+ break;
+ default:
+ throw new IllegalArgumentException(BAD_TRANSACTION_ISOLATION);
+ }
+ this.defaultTransactionIsolation = v;
}
/**
1.4 +42 -5 jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java
Index: PerUserPoolDataSource.java
===================================================================
RCS file: /home/cvs/jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/datasources/PerUserPoolDataSource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PerUserPoolDataSource.java 22 Aug 2003 16:08:32 -0000 1.3
+++ PerUserPoolDataSource.java 25 Aug 2003 17:08:51 -0000 1.4
@@ -98,6 +98,7 @@
private int defaultMaxWait = (int)Math.min((long)Integer.MAX_VALUE,
GenericObjectPool.DEFAULT_MAX_WAIT);
private Map perUserDefaultAutoCommit = null;
+ private Map perUserDefaultTransactionIsolation = null;
private Map perUserMaxActive = null;
private Map perUserMaxIdle = null;
private Map perUserMaxWait = null;
@@ -225,7 +226,32 @@
}
perUserDefaultAutoCommit.put(username, value);
}
-
+
+ /**
+ * The isolation level of connections when returned from getConnection.
+ * If null, the username will use the value of defaultTransactionIsolation.
+ */
+ public Integer getPerUserDefaultTransactionIsolation(String username) {
+ Integer value = null;
+ if (perUserDefaultTransactionIsolation != null) {
+ value = (Integer) perUserDefaultTransactionIsolation.get(username);
+ }
+ return value;
+ }
+
+ /**
+ * The isolation level of connections when returned from getConnection.
+ * Valid values are the constants defined in Connection.
+ */
+ public void setPerUserDefaultTransactionIsolation(String username,
+ Integer value) {
+ assertInitializationAllowed();
+ if (perUserDefaultTransactionIsolation == null) {
+ perUserDefaultTransactionIsolation = new HashMap();
+ }
+ perUserDefaultTransactionIsolation.put(username, value);
+ }
+
/**
* The maximum number of active connections that can be allocated from
* this pool at the same time, or zero for no limit.
@@ -421,8 +447,19 @@
}
}
+ int defaultTransactionIsolation = getDefaultTransactionIsolation();
+ if (username != null) {
+ Integer userMax = getPerUserDefaultTransactionIsolation(username);
+ if (userMax != null) {
+ defaultTransactionIsolation = userMax.intValue();
+ }
+ }
+
con.setAutoCommit(defaultAutoCommit);
con.setReadOnly(defaultReadOnly);
+ if (defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION) {
+ con.setTransactionIsolation(defaultTransactionIsolation);
+ }
}
private PoolKey getPoolKey(String username) {
1.4 +9 -5 jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java
Index: SharedPoolDataSource.java
===================================================================
RCS file: /home/cvs/jakarta-commons/dbcp/src/java/org/apache/commons/dbcp/datasources/SharedPoolDataSource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- SharedPoolDataSource.java 22 Aug 2003 16:08:32 -0000 1.3
+++ SharedPoolDataSource.java 25 Aug 2003 17:08:51 -0000 1.4
@@ -227,7 +227,7 @@
return key;
}
- private synchronized void registerPool(
+ private void registerPool(
String username, String password)
throws javax.naming.NamingException, SQLException {
@@ -257,6 +257,10 @@
throws SQLException {
con.setAutoCommit(isDefaultAutoCommit());
con.setReadOnly(isDefaultReadOnly());
+ int defaultTransactionIsolation = getDefaultTransactionIsolation();
+ if (defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION) {
+ con.setTransactionIsolation(defaultTransactionIsolation);
+ }
}
}
1.4 +25 -5 jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources/TestPerUserPoolDataSource.java
Index: TestPerUserPoolDataSource.java
===================================================================
RCS file: /home/cvs/jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources/TestPerUserPoolDataSource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TestPerUserPoolDataSource.java 22 Aug 2003 16:08:32 -0000 1.3
+++ TestPerUserPoolDataSource.java 25 Aug 2003 17:08:52 -0000 1.4
@@ -107,6 +107,8 @@
tds.setDefaultMaxWait((int)(getMaxWait()));
tds.setPerUserMaxActive("foo",new Integer(getMaxActive()));
tds.setPerUserMaxWait("foo",new Integer((int)(getMaxWait())));
+ tds.setDefaultTransactionIsolation(
+ Connection.TRANSACTION_READ_COMMITTED);
ds = tds;
}
@@ -484,5 +486,23 @@
return state;
}
}
-
+
+ public void testTransactionIsolationBehavior() throws Exception {
+ Connection conn = getConnection();
+ assertTrue(conn != null);
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ conn.getTransactionIsolation());
+ conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
+ conn.close();
+
+ Connection conn2 = getConnection();
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ conn2.getTransactionIsolation());
+
+ Connection conn3 = getConnection();
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ conn3.getTransactionIsolation());
+ conn2.close();
+ conn3.close();
+ }
}
1.4 +25 -4 jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java
Index: TestSharedPoolDataSource.java
===================================================================
RCS file: /home/cvs/jakarta-commons/dbcp/src/test/org/apache/commons/dbcp/datasources/TestSharedPoolDataSource.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TestSharedPoolDataSource.java 22 Aug 2003 16:08:32 -0000 1.3
+++ TestSharedPoolDataSource.java 25 Aug 2003 17:08:52 -0000 1.4
@@ -105,6 +105,8 @@
tds.setConnectionPoolDataSource(pcds);
tds.setMaxActive(getMaxActive());
tds.setMaxWait((int)(getMaxWait()));
+ tds.setDefaultTransactionIsolation(
+ Connection.TRANSACTION_READ_COMMITTED);
ds = tds;
}
@@ -433,4 +435,23 @@
return state;
}
}
+
+ public void testTransactionIsolationBehavior() throws Exception {
+ Connection conn = getConnection();
+ assertTrue(conn != null);
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ conn.getTransactionIsolation());
+ conn.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
+ conn.close();
+
+ Connection conn2 = getConnection();
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ conn2.getTransactionIsolation());
+
+ Connection conn3 = getConnection();
+ assertEquals(Connection.TRANSACTION_READ_COMMITTED,
+ conn3.getTransactionIsolation());
+ conn2.close();
+ conn3.close();
+ }
}