From: <ssk...@vh...> - 2005-09-15 08:59:57
|
Author: sskracic Date: 2005-09-15 10:50:20 +0200 (Thu, 15 Sep 2005) New Revision: 811 Modified: ccm-core/trunk/src/com/arsdigita/persistence/ConnectionSource.java ccm-core/trunk/src/com/arsdigita/persistence/DedicatedConnectionSource.java ccm-core/trunk/src/com/arsdigita/persistence/PooledConnectionSource.java ccm-core/trunk/src/com/arsdigita/persistence/Session.java Log: Expanding the idea of reacquiring the connection that was already used by a particular Session (I stole it from mdbooth, but please don't tell anyone). Added acquire(preferredConn) method to the ConnectionSource interface, so that we can specify what Connection object we prefer (and naturally, this shuld be the same Connection we've already had). If the preferred Connection is not available, return the least used connection. Modified: ccm-core/trunk/src/com/arsdigita/persistence/ConnectionSource.java =================================================================== --- ccm-core/trunk/src/com/arsdigita/persistence/ConnectionSource.java 2005-09-15 08:38:57 UTC (rev 810) +++ ccm-core/trunk/src/com/arsdigita/persistence/ConnectionSource.java 2005-09-15 08:50:20 UTC (rev 811) @@ -33,6 +33,8 @@ Connection acquire(); + Connection acquire(Connection preferred); + void release(Connection conn); } Modified: ccm-core/trunk/src/com/arsdigita/persistence/DedicatedConnectionSource.java =================================================================== --- ccm-core/trunk/src/com/arsdigita/persistence/DedicatedConnectionSource.java 2005-09-15 08:38:57 UTC (rev 810) +++ ccm-core/trunk/src/com/arsdigita/persistence/DedicatedConnectionSource.java 2005-09-15 08:50:20 UTC (rev 811) @@ -47,6 +47,10 @@ return (Connection) m_connections.get(); } + public Connection acquire(Connection preferred) { + return acquire(); + } + public void release(Connection conn) { // do nothing } Modified: ccm-core/trunk/src/com/arsdigita/persistence/PooledConnectionSource.java =================================================================== --- ccm-core/trunk/src/com/arsdigita/persistence/PooledConnectionSource.java 2005-09-15 08:38:57 UTC (rev 810) +++ ccm-core/trunk/src/com/arsdigita/persistence/PooledConnectionSource.java 2005-09-15 08:50:20 UTC (rev 811) @@ -68,10 +68,30 @@ } } + /** + * Tries to acquire preferred JDBC connection, if + * it's available. If not, grab the least recently used + * connection. + */ + public synchronized Connection acquire(Connection pref) { + if (pref == null) { + return acquire(); + } + int ndx = m_available.indexOf(pref); + if (ndx > -1) { + return (Connection) m_available.remove(ndx); + } else { + if (s_log.isDebugEnabled()) { + s_log.debug("Reacquisition failed: " + pref); + } + return acquire(); + } + } + public synchronized Connection acquire() { while (true) { if (!m_available.isEmpty()) { - return (Connection) m_available.remove(m_available.size()-1); + return (Connection) m_available.remove(0); } else if (m_connections.size() < m_size) { Connection result = (Connection) Connections.acquire(m_url); m_connections.add(result); Modified: ccm-core/trunk/src/com/arsdigita/persistence/Session.java =================================================================== --- ccm-core/trunk/src/com/arsdigita/persistence/Session.java 2005-09-15 08:38:57 UTC (rev 810) +++ ccm-core/trunk/src/com/arsdigita/persistence/Session.java 2005-09-15 08:50:20 UTC (rev 811) @@ -89,8 +89,12 @@ com.redhat.persistence.engine.rdbms.ConnectionSource src = new com.redhat.persistence.engine.rdbms.ConnectionSource() { + + private Connection m_conn = null; + public Connection acquire() { - return m_source.acquire(); + m_conn = m_source.acquire(m_conn); + return m_conn; } public void release(Connection conn) { |