/********************************************************************************** * $URL: https://source.sakaiproject.org/svn/kernel/trunk/api/src/main/java/org/apache/commons/dbcp/SakaiPoolableConnectionFactory.java $ * $Id: SakaiPoolableConnectionFactory.java 105077 2012-02-24 22:54:29Z ottenhoff@longsight.com $ *********************************************************************************** * * Copyright (c) 2005, 2006, 2008 Sakai Foundation * * Licensed under the Educational Community 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.opensource.org/licenses/ECL-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. * **********************************************************************************/ package org.apache.commons.dbcp; import java.sql.Connection; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.commons.pool.KeyedObjectPool; import org.apache.commons.pool.KeyedObjectPoolFactory; import org.apache.commons.pool.ObjectPool; /** * <p> * SakaiBasicDataSource extends apache common's BasicDataSource ... * </p> * <p> * Based on apache commons dbcp version 1.2.1, apache commons pool version 1.2 * </p> */ public class SakaiPoolableConnectionFactory extends PoolableConnectionFactory { /** Configuration: to rollback each connection when borrowed from the pool. */ protected boolean m_rollbackOnReturn = false; protected static final Log M_log = LogFactory.getLog(SakaiPoolableConnectionFactory.class); /** * Create a new <tt>PoolableConnectionFactory</tt>. * * @param connFactory * the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool * the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory * the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or <tt>null</tt> to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using <tt>null</tt> turns off validation. * @param defaultReadOnly * the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit * the default "auto commit" setting for returned {@link Connection}s * @param rollbackOnReturn * The rollback on borrow setting */ public SakaiPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, boolean rollbackOnReturn) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit); m_rollbackOnReturn = rollbackOnReturn; } /** * Create a new <tt>PoolableConnectionFactory</tt>. * * @param connFactory * the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool * the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory * the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or <tt>null</tt> to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using <tt>null</tt> turns off validation. * @param defaultReadOnly * the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit * the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation * the default "Transaction Isolation" setting for returned {@link Connection}s * @param rollbackOnReturn * The rollback on borrow setting */ public SakaiPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, boolean rollbackOnReturn) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation); m_rollbackOnReturn = rollbackOnReturn; } /** * Create a new <tt>PoolableConnectionFactory</tt>. * * @param connFactory * the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool * the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory * the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or <tt>null</tt> to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using <tt>null</tt> turns off validation. * @param defaultReadOnly * the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit * the default "auto commit" setting for returned {@link Connection}s * @param config * the AbandonedConfig if tracing SQL objects * @param rollbackOnReturn * The rollback on borrow setting * @deprecated AbandonedConfig is now deprecated. */ public SakaiPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, AbandonedConfig config, boolean rollbackOnReturn) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, config); m_rollbackOnReturn = rollbackOnReturn; } /** * Create a new <tt>PoolableConnectionFactory</tt>. * * @param connFactory * the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool * the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory * the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or <tt>null</tt> to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using <tt>null</tt> turns off validation. * @param defaultReadOnly * the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit * the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation * the default "Transaction Isolation" setting for returned {@link Connection}s * @param config * the AbandonedConfig if tracing SQL objects * @param rollbackOnReturn * The rollback on borrow setting * @deprecated AbandonedConfig is now deprecated. */ public SakaiPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, AbandonedConfig config, boolean rollbackOnReturn) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, config); m_rollbackOnReturn = rollbackOnReturn; } /** * Create a new <tt>PoolableConnectionFactory</tt>. * * @param connFactory * the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool * the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory * the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or <tt>null</tt> to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using <tt>null</tt> turns off validation. * @param defaultReadOnly * the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit * the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation * the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog * the default "catalog" setting for returned {@link Connection}s * @param config * the AbandonedConfig if tracing SQL objects * @param rollbackOnReturn * The rollback on borrow setting * @deprecated AbandonedConfig is now deprecated. */ public SakaiPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config, boolean rollbackOnReturn) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, config); m_rollbackOnReturn = rollbackOnReturn; } /** * Create a new <tt>PoolableConnectionFactory</tt>. * * @param connFactory * the {@link ConnectionFactory} from which to obtain base {@link Connection}s * @param pool * the {@link ObjectPool} in which to pool those {@link Connection}s * @param stmtPoolFactory * the {@link KeyedObjectPoolFactory} to use to create {@link KeyedObjectPool}s for pooling {@link java.sql.PreparedStatement}s, or <tt>null</tt> to disable {@link java.sql.PreparedStatement} pooling * @param validationQuery * a query to use to {@link #validateObject validate} {@link Connection}s. Should return at least one row. Using <tt>null</tt> turns off validation. * @param defaultReadOnly * the default "read only" setting for borrowed {@link Connection}s * @param defaultAutoCommit * the default "auto commit" setting for returned {@link Connection}s * @param defaultTransactionIsolation * the default "Transaction Isolation" setting for returned {@link Connection}s * @param defaultCatalog * the default "catalog" setting for returned {@link Connection}s * @param config * the AbandonedConfig if tracing SQL objects * @param rollbackOnReturn * The rollback on borrow setting */ public SakaiPoolableConnectionFactory(ConnectionFactory connFactory, ObjectPool pool, KeyedObjectPoolFactory stmtPoolFactory, String validationQuery, Boolean defaultReadOnly, boolean defaultAutoCommit, int defaultTransactionIsolation, String defaultCatalog, AbandonedConfig config, boolean rollbackOnReturn) { super(connFactory, pool, stmtPoolFactory, validationQuery, defaultReadOnly, defaultAutoCommit, defaultTransactionIsolation, defaultCatalog, config); m_rollbackOnReturn = rollbackOnReturn; } /** * Sakai modification: don't set autocommit, don't rollback if so configured! */ public void passivateObject(Object obj) throws Exception { if (obj instanceof Connection) { Connection conn = (Connection) obj; if (m_rollbackOnReturn) { if (!conn.getAutoCommit() && !conn.isReadOnly()) { Exception e = new RuntimeException("Automatic Transaction Rollback"); M_log.error("Transaction RolledBack!", e); conn.rollback(); } } conn.clearWarnings(); // conn.setAutoCommit(true); } if (obj instanceof DelegatingConnection) { ((DelegatingConnection) obj).passivate(); } } /** * Sakai modifications: set auto-commit only if it does not match the default setting */ public void activateObject(Object obj) throws Exception { if (obj instanceof DelegatingConnection) { ((DelegatingConnection) obj).activate(); } if (obj instanceof Connection) { Connection conn = (Connection) obj; if (conn.getAutoCommit() != _defaultAutoCommit) { conn.setAutoCommit(_defaultAutoCommit); } if ((_defaultTransactionIsolation != UNKNOWN_TRANSACTIONISOLATION) && (conn.getTransactionIsolation() != _defaultTransactionIsolation)) { conn.setTransactionIsolation(_defaultTransactionIsolation); } if ((_defaultReadOnly != null) && (conn.isReadOnly() != _defaultReadOnly.booleanValue())) { conn.setReadOnly(_defaultReadOnly.booleanValue()); } if ((_defaultCatalog != null) && (!_defaultCatalog.equals(conn.getCatalog()))) { conn.setCatalog(_defaultCatalog); } } } }