You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by mk...@apache.org on 2005/04/07 15:08:57 UTC
cvs commit: db-ojb/src/java/org/apache/ojb/broker/accesslayer ConnectionFactoryAbstractImpl.java ConnectionFactoryDBCPImpl.java ConnectionFactoryNotPooledImpl.java ConnectionFactoryPooledImpl.java
mkalen 2005/04/07 06:08:57
Modified: src/java/org/apache/ojb/broker/accesslayer Tag:
OJB_1_0_RELEASE ConnectionFactoryAbstractImpl.java
ConnectionFactoryDBCPImpl.java
ConnectionFactoryNotPooledImpl.java
ConnectionFactoryPooledImpl.java
Log:
http://issues.apache.org/scarab/issues/id/OJB301. Rename checkout/release methods and improve JavaDoc for better overview of ConnectionFactory operations. Add Connection checks in NotPooled factory. Add TODO why I think parts of Ilkka's patch should be rolled out.
Revision Changes Path
No revision
No revision
1.10.2.3 +46 -36 db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryAbstractImpl.java
Index: ConnectionFactoryAbstractImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryAbstractImpl.java,v
retrieving revision 1.10.2.2
retrieving revision 1.10.2.3
diff -u -r1.10.2.2 -r1.10.2.3
--- ConnectionFactoryAbstractImpl.java 16 Mar 2005 17:47:19 -0000 1.10.2.2
+++ ConnectionFactoryAbstractImpl.java 7 Apr 2005 13:08:57 -0000 1.10.2.3
@@ -48,25 +48,44 @@
private Map dataSourceCache = new HashMap();
/**
- * Implement this method. This method was called to obtain
- * a jdbc-connection from the pool.
- * <br/>
- * Note: This method was
- * not called, if jdbc-connection-descriptor use datasources - OJB
- * only pool connections from DriverManager.
+ * Returns a valid JDBC Connection. Implement this method in concrete subclasses.
+ * Concrete implementations using Connection pooling are responsible for any validation
+ * and pool removal management.
+ * <p>
+ * Note: This method is never called for a jdbc-connection-descriptor that uses datasources,
+ * OJB only manages connections from DriverManager.
+ * <p>
+ * Note: If the concrete implementation does not callback to
+ * {@link #newConnectionFromDriverManager(org.apache.ojb.broker.metadata.JdbcConnectionDescriptor)}
+ * when creating a new Connection, it <em>must</em> call
+ * {@link #initializeJdbcConnection(java.sql.Connection, org.apache.ojb.broker.metadata.JdbcConnectionDescriptor)}
+ * so that the platform implementation can peform any RDBMS-specific init tasks for newly
+ * created Connection objetcs.
+ *
+ * @param jcd the connection descriptor for which to return a validated Connection
+ * @return a valid Connection, never null.
+ * Specific implementations <em>must</em> guarantee that the connection is not null and
+ * that it is valid.
+ * @throws LookupException if a valid Connection could not be obtained
*/
- public abstract Connection getConnectionFromPool(JdbcConnectionDescriptor jcd)
+ public abstract Connection checkOutJdbcConnection(JdbcConnectionDescriptor jcd)
throws LookupException;
/**
- * Implement this method. Was called to return a
- * connection to pool.
- * <br/>
- * Note: This method was
- * not called, if the jdbc-connection-descriptor uses datasources - OJB
- * only pool connections from DriverManager.
+ * Releases a Connection after use. Implement this method in concrete subclasses.
+ * Concrete implementations using Connection pooling are responsible for any validation
+ * and pool removal management.
+ * <p>
+ * Note: This method is never called for a jdbc-connection-descriptor that uses datasources,
+ * OJB only manages connections from DriverManager.
+ *
+ * @param jcd the connection descriptor for which the connection was created
+ * @param con the connection to release.
+ * Callers <em>must</em> guarantee that the passed connection was obtained by calling
+ * {@link #checkOutJdbcConnection(org.apache.ojb.broker.metadata.JdbcConnectionDescriptor)}.
+ * @throws LookupException //TODO: mkalen: document when. Rename from "LookupException"?
*/
- public abstract void returnConnectionToPool(JdbcConnectionDescriptor jcd, Connection con)
+ public abstract void releaseJdbcConnection(JdbcConnectionDescriptor jcd, Connection con)
throws LookupException;
public void releaseConnection(JdbcConnectionDescriptor jcd, Connection con)
@@ -87,7 +106,7 @@
{
try
{
- returnConnectionToPool(jcd, con);
+ releaseJdbcConnection(jcd, con);
}
catch (LookupException e)
{
@@ -115,25 +134,8 @@
}
else
{
- conn = getConnectionFromPool(jcd);
- // check connection
- try
- {
- if (conn == null || conn.isClosed())
- {
- log.error("Connection for JdbcConnectionDescriptor (" +
- (jcd.getDatasourceName() != null ? "datasource: " + jcd.getDatasourceName() :
- "db-url: " + getDbURL(jcd) + ", user: " + jcd.getUserName()) +
- ") is invalid: " +
- (conn != null ? "*closed*" : "*null*"));
- throw new LookupException("Could not lookup valid connection from pool/DB, connection was "+conn);
- }
- }
- catch (SQLException e)
- {
- log.error("Error during sanity check of new DB Connection", e);
- throw new LookupException("Connection check failed", e);
- }
+ conn = checkOutJdbcConnection(jcd);
+ // connection is now guaranteed to be valid by API contract (else exception is thrown)
}
return conn;
}
@@ -141,7 +143,7 @@
/**
* Initialize the connection with the specified properties in OJB
* configuration files and platform depended properties.
- * Invoke this method after a NEW connection was created.
+ * Invoke this method after a NEW connection is created, not if re-using from pool.
*
* @see org.apache.ojb.broker.platforms.PlatformFactory
* @see org.apache.ojb.broker.platforms.Platform
@@ -294,4 +296,12 @@
jcd.getProtocol() + ":" + jcd.getSubProtocol() + ":" + jcd.getDbAlias();
}
+ protected String getJcdDescription(JdbcConnectionDescriptor jcd)
+ {
+ return "Connection for JdbcConnectionDescriptor (" +
+ (jcd.getDatasourceName() != null ? "datasource: " + jcd.getDatasourceName() :
+ "db-url: " + getDbURL(jcd) + ", user: " + jcd.getUserName()) +
+ ")";
+ }
+
}
1.10.2.2 +3 -3 db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java
Index: ConnectionFactoryDBCPImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryDBCPImpl.java,v
retrieving revision 1.10.2.1
retrieving revision 1.10.2.2
diff -u -r1.10.2.1 -r1.10.2.2
--- ConnectionFactoryDBCPImpl.java 16 Mar 2005 17:51:18 -0000 1.10.2.1
+++ ConnectionFactoryDBCPImpl.java 7 Apr 2005 13:08:57 -0000 1.10.2.2
@@ -61,7 +61,7 @@
/** Synchronize object for operations not synchronized on Map only. */
private Object poolSynch = new Object();
- public Connection getConnectionFromPool(JdbcConnectionDescriptor jcd) throws LookupException
+ public Connection checkOutJdbcConnection(JdbcConnectionDescriptor jcd) throws LookupException
{
final DataSource ds = getDataSource(jcd);
@@ -80,7 +80,7 @@
return conn;
}
- public void returnConnectionToPool(JdbcConnectionDescriptor jcd, Connection con)
+ public void releaseJdbcConnection(JdbcConnectionDescriptor jcd, Connection con)
throws LookupException
{
try
1.5.2.1 +36 -7 db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryNotPooledImpl.java
Index: ConnectionFactoryNotPooledImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryNotPooledImpl.java,v
retrieving revision 1.5
retrieving revision 1.5.2.1
diff -u -r1.5 -r1.5.2.1
--- ConnectionFactoryNotPooledImpl.java 4 Apr 2004 23:53:30 -0000 1.5
+++ ConnectionFactoryNotPooledImpl.java 7 Apr 2005 13:08:57 -0000 1.5.2.1
@@ -1,6 +1,6 @@
package org.apache.ojb.broker.accesslayer;
-/* Copyright 2002-2004 The Apache Software Foundation
+/* Copyright 2002-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -32,15 +32,43 @@
{
private Logger log = LoggerFactory.getLogger(ConnectionFactoryNotPooledImpl.class);
- public Connection getConnectionFromPool(JdbcConnectionDescriptor jcd) throws LookupException
+ public Connection checkOutJdbcConnection(JdbcConnectionDescriptor jcd) throws LookupException
{
if (log.isDebugEnabled())
- log.debug(
- "getConnectionFromPool was called, this implementation ever return a new connection");
- return this.newConnectionFromDriverManager(jcd);
+ {
+ log.debug("checkOutJdbcConnection: this implementation always return a new Connection");
+ }
+ final Connection conn = newConnectionFromDriverManager(jcd);
+ validateConnection(conn, jcd);
+ // Connection is now guaranteed to be valid (else validateConnection must throw exception)
+ return conn;
}
- public void returnConnectionToPool(JdbcConnectionDescriptor jcd, Connection con)
+ protected void validateConnection(Connection conn, JdbcConnectionDescriptor jcd)
+ throws LookupException
+ {
+ if (conn == null)
+ {
+ log.error(getJcdDescription(jcd) + " failed, DriverManager returned null");
+ throw new LookupException("No Connection returned from DriverManager");
+ }
+ try
+ {
+ if (conn.isClosed())
+ {
+ log.error(getJcdDescription(jcd) + " is invalid (closed)");
+ throw new LookupException("Could not create valid connection, connection was " +
+ conn);
+ }
+ }
+ catch (SQLException e)
+ {
+ log.error(getJcdDescription(jcd) + " failed validation with exception");
+ throw new LookupException("Connection validation failed", e);
+ }
+ }
+
+ public void releaseJdbcConnection(JdbcConnectionDescriptor jcd, Connection con)
throws LookupException
{
try
@@ -52,4 +80,5 @@
log.warn("Connection.close() failed, message was " + e.getMessage());
}
}
+
}
1.15.2.4 +32 -21 db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryPooledImpl.java
Index: ConnectionFactoryPooledImpl.java
===================================================================
RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/ConnectionFactoryPooledImpl.java,v
retrieving revision 1.15.2.3
retrieving revision 1.15.2.4
diff -u -r1.15.2.3 -r1.15.2.4
--- ConnectionFactoryPooledImpl.java 16 Mar 2005 18:04:52 -0000 1.15.2.3
+++ ConnectionFactoryPooledImpl.java 7 Apr 2005 13:08:57 -0000 1.15.2.4
@@ -43,15 +43,16 @@
*/
public class ConnectionFactoryPooledImpl extends ConnectionFactoryAbstractImpl
{
+
private Logger log = LoggerFactory.getLogger(ConnectionFactoryPooledImpl.class);
private Map connectionPools = new HashMap();
public ConnectionFactoryPooledImpl()
{
-
+ // default no-arg constructor
}
- public void returnConnectionToPool(JdbcConnectionDescriptor jcd, Connection con)
+ public void releaseJdbcConnection(JdbcConnectionDescriptor jcd, Connection con)
throws LookupException
{
try
@@ -62,8 +63,10 @@
* connections to pool. We do this test independent from the from the
* commons-pool settings, which also supports validation on return of
* a connecion.
+ * TODO: mkalen: this breaks the ObjectPool API contract and should only be
+ * TODO: mkalen: handled when using testOnReturn=true, awaiting user feedback to remove
*/
- if(!con.isClosed())
+ if (!con.isClosed())
{
((ObjectPool) this.connectionPools.get(jcd.getPBKey())).returnObject(con);
}
@@ -74,7 +77,7 @@
}
}
- public Connection getConnectionFromPool(JdbcConnectionDescriptor jcd) throws LookupException
+ public Connection checkOutJdbcConnection(JdbcConnectionDescriptor jcd) throws LookupException
{
ObjectPool op = (ObjectPool) connectionPools.get(jcd.getPBKey());
if (op == null)
@@ -86,15 +89,17 @@
connectionPools.put(jcd.getPBKey(), op);
}
}
+ final Connection conn;
try
{
- return (Connection) op.borrowObject();
+ conn = (Connection) op.borrowObject();
}
catch (Exception e)
{
throw new LookupException("Could not borrow connection from pool - " +
JdbcConnectionDescriptor.class.getName() + ": " + jcd, e);
}
+ return conn;
}
/**
@@ -158,23 +163,29 @@
public boolean validateObject(Object obj)
{
- Connection con = (Connection) obj;
boolean isValid = false;
- try
- {
- isValid = !con.isClosed();
- }
- catch (SQLException e)
- {
- log.warn("Connection validation failed: " + e.getMessage());
- if (log.isDebugEnabled()) log.debug(e);
- isValid = false;
- }
- final String validationQuery;
- validationQuery = jcd.getConnectionPoolDescriptor().getValidationQuery();
- if (isValid && validationQuery != null)
+ if (obj != null)
{
- isValid = validateConnection(con, validationQuery);
+ final Connection con = (Connection) obj;
+ try
+ {
+ isValid = !con.isClosed();
+ }
+ catch (SQLException e)
+ {
+ log.warn("Connection validation failed: " + e.getMessage());
+ if (log.isDebugEnabled()) log.debug(e);
+ isValid = false;
+ }
+ if (isValid)
+ {
+ final String validationQuery;
+ validationQuery = jcd.getConnectionPoolDescriptor().getValidationQuery();
+ if (validationQuery != null)
+ {
+ isValid = validateConnection(con, validationQuery);
+ }
+ }
}
return isValid;
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org