Author: jaz
Date: Wed Sep 12 23:10:34 2007 New Revision: 575181 URL: http://svn.apache.org/viewvc?rev=575181&view=rev Log: added DBCP connection pool and supporting class; need to modify ConnectionFactory to enable this; needs more testing before 'production' ready (snapshot of 1.3 DBCP) Added: ofbiz/trunk/framework/entity/lib/commons-dbcp-20070730.jar (with props) ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java (with props) Added: ofbiz/trunk/framework/entity/lib/commons-dbcp-20070730.jar URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/lib/commons-dbcp-20070730.jar?rev=575181&view=auto ============================================================================== Binary file - no diff available. Propchange: ofbiz/trunk/framework/entity/lib/commons-dbcp-20070730.jar ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream Added: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java?rev=575181&view=auto ============================================================================== --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java (added) +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java Wed Sep 12 23:10:34 2007 @@ -0,0 +1,125 @@ +package org.ofbiz.entity.transaction; + +import org.apache.commons.dbcp.ConnectionFactory; +import org.apache.commons.dbcp.DriverConnectionFactory; +import org.apache.commons.dbcp.PoolableConnectionFactory; +import org.apache.commons.dbcp.managed.LocalXAConnectionFactory; +import org.apache.commons.dbcp.managed.ManagedDataSource; +import org.apache.commons.dbcp.managed.XAConnectionFactory; +import org.apache.commons.pool.impl.GenericObjectPool; +import org.ofbiz.base.util.Debug; +import org.ofbiz.entity.GenericEntityException; +import org.w3c.dom.Element; + +import javax.transaction.TransactionManager; +import java.sql.Connection; +import java.sql.Driver; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.*; + +/** + * DBCPConnectionFactory + */ +public class DBCPConnectionFactory { + + public static final String module = DBCPConnectionFactory.class.getName(); + + protected static Map dsCache = new HashMap(); + + public static Connection getConnection(String helperName, Element jotmJdbcElement) throws SQLException, GenericEntityException { + ManagedDataSource mds = (ManagedDataSource) dsCache.get(helperName); + if (mds != null) { + return TransactionFactory.getCursorConnection(helperName, mds.getConnection()); + } + + synchronized (DBCPConnectionFactory.class) { + mds = (ManagedDataSource) dsCache.get(helperName); + if (mds != null) { + return TransactionFactory.getCursorConnection(helperName, mds.getConnection()); + } + + // connection properties + TransactionManager txMgr = TransactionFactory.getTransactionManager(); + String driverName = jotmJdbcElement.getAttribute("jdbc-driver"); + String dbUri = jotmJdbcElement.getAttribute("jdbc-uri"); + String dbUser = jotmJdbcElement.getAttribute("jdbc-username"); + String dbPass = jotmJdbcElement.getAttribute("jdbc-password"); + + // pool settings + int maxSize, minSize; + try { + maxSize = Integer.parseInt(jotmJdbcElement.getAttribute("pool-maxsize")); + } catch (NumberFormatException nfe) { + Debug.logError("Problems with pool settings [pool-maxsize=" + jotmJdbcElement.getAttribute("pool-maxsize") + "]; the values MUST be numbers, using default of 20.", module); + maxSize = 20; + } catch (Exception e) { + Debug.logError(e, "Problems with pool settings", module); + maxSize = 20; + } + try { + minSize = Integer.parseInt(jotmJdbcElement.getAttribute("pool-minsize")); + } catch (NumberFormatException nfe) { + Debug.logError("Problems with pool settings [pool-minsize=" + jotmJdbcElement.getAttribute("pool-minsize") + "]; the values MUST be numbers, using default of 5.", module); + minSize = 2; + } catch (Exception e) { + Debug.logError(e, "Problems with pool settings", module); + minSize = 2; + } + int maxIdle = maxSize / 2; + maxIdle = maxIdle > minSize ? maxIdle : minSize; + + // load the driver + System.setProperty("jdbc.drivers", driverName); + Driver jdbcDriver = DriverManager.getDriver(dbUri); + + // connection factory properties + Properties cfProps = new Properties(); + cfProps.put("user", dbUser); + cfProps.put("password", dbPass); + + // create the connection factory + ConnectionFactory cf = new DriverConnectionFactory(jdbcDriver, dbUri, cfProps); + + // wrap it with a LocalXAConnectionFactory + XAConnectionFactory xacf = new LocalXAConnectionFactory(txMgr, cf); + + // configure the pool settings + GenericObjectPool pool = new GenericObjectPool(); + pool.setTimeBetweenEvictionRunsMillis(600000); + pool.setMaxActive(maxSize); + pool.setMaxIdle(maxIdle); + pool.setMinIdle(minSize); + pool.setMaxWait(120000); + + + // create the pool object factory + PoolableConnectionFactory factory = new PoolableConnectionFactory(xacf, pool, null, null, true, true); + factory.setValidationQuery("select example_type_id from example_type limit 1"); + + String transIso = jotmJdbcElement.getAttribute("isolation-level"); + if (transIso != null && transIso.length() > 0) { + if ("Serializable".equals(transIso)) { + factory.setDefaultTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); + } else if ("RepeatableRead".equals(transIso)) { + factory.setDefaultTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ); + } else if ("ReadUncommitted".equals(transIso)) { + factory.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED); + } else if ("ReadCommitted".equals(transIso)) { + factory.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); + } else if ("None".equals(transIso)) { + factory.setDefaultTransactionIsolation(Connection.TRANSACTION_NONE); + } + } + pool.setFactory(factory); + + mds = new ManagedDataSource(pool, xacf.getTransactionRegistry()); + mds.setAccessToUnderlyingConnectionAllowed(true); + + // cache the pool + dsCache.put(helperName, mds); + + return TransactionFactory.getCursorConnection(helperName, mds.getConnection()); + } + } +} Propchange: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java ------------------------------------------------------------------------------ svn:keywords = "Date Rev Author URL Id" Propchange: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/transaction/DBCPConnectionFactory.java ------------------------------------------------------------------------------ svn:mime-type = text/plain |
Free forum by Nabble | Edit this page |