tomcat-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From fha...@apache.org
Subject svn commit: r882723 - in /tomcat/trunk/modules/jdbc-pool: ./ doc/ java/org/apache/tomcat/jdbc/pool/ java/org/apache/tomcat/jdbc/pool/jmx/
Date Fri, 20 Nov 2009 21:39:37 GMT
Author: fhanik
Date: Fri Nov 20 21:39:36 2009
New Revision: 882723

URL: http://svn.apache.org/viewvc?rev=882723&view=rev
Log:
Add in DataSource supprot
Add in XA support

Modified:
    tomcat/trunk/modules/jdbc-pool/.classpath
    tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java
    tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java

Modified: tomcat/trunk/modules/jdbc-pool/.classpath
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/.classpath?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/.classpath (original)
+++ tomcat/trunk/modules/jdbc-pool/.classpath Fri Nov 20 21:39:36 2009
@@ -7,5 +7,6 @@
 	<classpathentry kind="var" path="TOMCAT_LIBS_BASE/tomcat6-deps/dbcp/tomcat-dbcp.jar"
sourcepath="/TOMCAT_LIBS_BASE/tomcat6-deps/dbcp/src/java"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="lib" path="/development/tomcat/trunk/trunk/modules/jdbc-pool/includes/h2/bin/h2-1.1.115.jar"/>
+	<classpathentry kind="lib" path="/development/tomcat/trunk/trunk/modules/jdbc-pool/includes/mysql-connector-java-5.1.7-bin.jar"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>

Modified: tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml (original)
+++ tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml Fri Nov 20 21:39:36 2009
@@ -88,6 +88,9 @@
       <li>Get JMX notifications and log entries when connections are suspected for
being abandoned. This is similar to
           the <code>removeAbandonedTimeout</code> but it doesn't take any action,
only reports the information. 
           This is achieved using the <code>suspectTimeout</code> attribute.</li>

+      <li>Connections can be retrieved from a <code>java.sql.Driver</code>
or a <code>javax.sql.DataSource</code>
+          This is achieved using the <code>dataSource</code> and <code>dataSourceJNDI</code>
attributes.</li>
+      <li>XA connection support</li>
     </ol>
   </p>
 
@@ -401,6 +404,14 @@
            logged and a JMX notification gets sent once. 
       </p>
     </attribute>
+    <attribute name="dataSource" required="false">
+      <p>(javax.sql.DataSource)  
+      </p>
+    </attribute>
+    <attribute name="dataSourceJNDI" required="false">
+      <p>(String) 
+      </p>
+    </attribute>
   </attributes>  
   </subsection>
 </section>

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java Fri
Nov 20 21:39:36 2009
@@ -277,7 +277,7 @@
         }
 
         try {
-            getProxyConstructor(con.getConnection() instanceof XAConnection);
+            getProxyConstructor(con.getXAConnection() != null);
             //create the proxy
             //TODO possible optimization, keep track if this connection was returned properly,
and don't generate a new facade
             Connection connection = (Connection)proxyClassConstructor.newInstance(new Object[]
{ handler });

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
(original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceFactory.java
Fri Nov 20 21:39:36 2009
@@ -104,6 +104,10 @@
     protected static final String PROP_USE_EQUALS = "useEquals";
     protected static final String PROP_USE_CON_LOCK = "useLock";
     
+    protected static final String PROP_DATASOURCE= "dataSource";
+    protected static final String PROP_DATASOURCE_JNDI = "dataSourceJNDI";
+    
+    
     public static final int UNKNOWN_TRANSACTIONISOLATION = -1;
     
     public static final String OBJECT_NAME = "object_name";
@@ -147,7 +151,9 @@
         OBJECT_NAME,
         PROP_ABANDONWHENPERCENTAGEFULL,
         PROP_MAXAGE,
-        PROP_USE_CON_LOCK
+        PROP_USE_CON_LOCK,
+        PROP_DATASOURCE,
+        PROP_DATASOURCE_JNDI,
     };
 
     // -------------------------------------------------- ObjectFactory Methods
@@ -425,6 +431,16 @@
             poolProperties.setUseLock(Boolean.parseBoolean(value));
         }
         
+        value = properties.getProperty(PROP_DATASOURCE);
+        if (value != null) {
+            //this should never happen
+            log.error("Can't set dataSource property as a string, this must be a javax.sql.DataSource
object.");
+        }
+        
+        value = properties.getProperty(PROP_DATASOURCE_JNDI);
+        if (value != null) {
+            poolProperties.setDataSourceJNDI(value);
+        }
         return poolProperties;
     }
 

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java Fri
Nov 20 21:39:36 2009
@@ -1011,4 +1011,33 @@
         getPoolProperties().setName(name);
     }
     
+    /** 
+     * {@inheritDoc}
+     */
+    public void setDataSource(javax.sql.DataSource ds) {
+        getPoolProperties().setDataSource(ds);
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public javax.sql.DataSource getDataSource() {
+        return getPoolProperties().getDataSource();
+    }
+    
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public void setDataSourceJNDI(String jndiDS) {
+        getPoolProperties().setDataSourceJNDI(jndiDS);
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String getDataSourceJNDI() {
+        return getPoolProperties().getDataSourceJNDI();
+    }
+    
 }

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
(original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
Fri Nov 20 21:39:36 2009
@@ -717,5 +717,39 @@
      */
     public int getSuspectTimeout();
     
+    /**
+     * Injects a datasource that will be used to retrieve/create connections.
+     * If a data source is set, the {@link PoolConfiguration#getUrl()} and {@link PoolConfiguration#getDriverClassName()}
methods are ignored
+     * and not used by the pool. If the {@link PoolConfiguration#getUsername()} and {@link
PoolConfiguration#getPassword()}
+     * values are set, the method {@link javax.sql.DataSource#getConnection(String, String)}
method will be called instead of the
+     * {@link javax.sql.DataSource#getConnection()} method.
+     * If the data source implements {@link javax.sql.XADataSource} the methods 
+     * {@link javax.sql.XADataSource#getXAConnection()} and {@link javax.sql.XADataSource#getXAConnection(String,String)}
+     * will be invoked.  
+     * @param ds the {@link javax.sql.DataSource} to be used for creating connections to
be pooled.
+     */
+    public void setDataSource(javax.sql.DataSource ds);
+    
+    /**
+     * Returns a datasource, if one exists that is being used to create connections.
+     * This method will return null if the pool is using a {@link java.sql.Driver}
+     * @return the {@link javax.sql.DataSource} to be used for creating connections to be
pooled or null if a Driver is used.
+     */
+    public javax.sql.DataSource getDataSource();
+    
+    /**
+     * Configure the connection pool to use a DataSource according to {@link PoolConfiguration#setDataSource(javax.sql.DataSource)}
+     * But instead of injecting the object, specify the JNDI location.
+     * After a successful JNDI look, the {@link PoolConfiguration#getDataSource()} will not
return null. 
+     * @param jndiDS -the JNDI string @TODO specify the rules here.
+     */
+    public void setDataSourceJNDI(String jndiDS);
+    
+    /**
+     * Returns the JNDI string configured for data source usage.
+     * @return
+     */
+    public String getDataSourceJNDI();
+    
 
 }
\ No newline at end of file

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java Fri
Nov 20 21:39:36 2009
@@ -73,8 +73,10 @@
     protected int abandonWhenPercentageFull = 0;
     protected long maxAge = 0;
     protected boolean useLock = false;
-    private InterceptorDefinition[] interceptors = null;
+    protected InterceptorDefinition[] interceptors = null;
     protected int suspectTimeout = 0;
+    protected javax.sql.DataSource dataSource = null;
+    protected String dataSourceJNDI = null;
     
     
     /** 
@@ -870,6 +872,36 @@
         this.useLock = useLock;
     }
     
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public void setDataSource(javax.sql.DataSource ds) {
+        this.dataSource = ds;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public javax.sql.DataSource getDataSource() {
+        return dataSource;
+    }
+    
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public void setDataSourceJNDI(String jndiDS) {
+        this.dataSourceJNDI = jndiDS;
+    }
+    
+    /** 
+     * {@inheritDoc}
+     */
+    public String getDataSourceJNDI() {
+        return this.dataSourceJNDI;
+    }
+    
         
     public static Properties getProperties(String propText, Properties props) {
         if (props==null) props = new Properties();

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
(original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PooledConnection.java
Fri Nov 20 21:39:36 2009
@@ -69,6 +69,11 @@
      * The underlying database connection
      */
     private volatile java.sql.Connection connection;
+    
+    /**
+     * If using a XAConnection underneath.
+     */
+    private volatile javax.sql.XAConnection xaConnection;
     /**
      * When we track abandon traces, this string holds the thread dump
      */
@@ -142,6 +147,47 @@
                 log.debug("Unable to disconnect previous connection.", x);
             } //catch
         } //end if
+        if (poolProperties.getDataSource()==null && poolProperties.getDataSourceJNDI()!=null)
{
+            //TODO lookup JNDI name
+        }
+        
+        if (poolProperties.getDataSource()!=null) {
+            connectUsingDataSource();
+        } else {
+            connectUsingDriver();
+        }
+        
+        //set up the default state, unless we expect the interceptor to do it
+        if (poolProperties.getJdbcInterceptors()==null || poolProperties.getJdbcInterceptors().indexOf(ConnectionState.class.getName())<0)
{
+            if (poolProperties.getDefaultReadOnly()!=null) connection.setReadOnly(poolProperties.getDefaultReadOnly().booleanValue());
+            if (poolProperties.getDefaultAutoCommit()!=null) connection.setAutoCommit(poolProperties.getDefaultAutoCommit().booleanValue());
+            if (poolProperties.getDefaultCatalog()!=null) connection.setCatalog(poolProperties.getDefaultCatalog());
+            if (poolProperties.getDefaultTransactionIsolation()!=DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION)
connection.setTransactionIsolation(poolProperties.getDefaultTransactionIsolation());
+        }        
+        this.discarded = false;
+        this.lastConnected = System.currentTimeMillis();
+    }
+    
+    protected void connectUsingDataSource() throws SQLException {
+        if (poolProperties.getDataSource() instanceof javax.sql.XADataSource) {
+            javax.sql.XADataSource xds = (javax.sql.XADataSource)poolProperties.getDataSource();
+            if (poolProperties.getUsername()!=null && poolProperties.getPassword()!=null)
{
+                xaConnection = xds.getXAConnection(poolProperties.getUsername(), poolProperties.getPassword());
+                connection = xaConnection.getConnection();
+            } else {
+                xaConnection = xds.getXAConnection();
+                connection = xaConnection.getConnection();
+            }
+        } else {
+            javax.sql.DataSource ds = poolProperties.getDataSource();
+            if (poolProperties.getUsername()!=null && poolProperties.getPassword()!=null)
{
+                connection = ds.getConnection(poolProperties.getUsername(), poolProperties.getPassword());
+            } else {
+                connection = ds.getConnection();
+            }
+        }
+    }
+    protected void connectUsingDriver() throws SQLException {
         java.sql.Driver driver = null;
         try {
             driver = (java.sql.Driver) Class.forName(poolProperties.getDriverClassName(),
@@ -180,16 +226,6 @@
         if (connection==null) {
             throw new SQLException("Driver:"+driver+" returned null for URL:"+driverURL);
         }
-        
-        //set up the default state, unless we expect the interceptor to do it
-        if (poolProperties.getJdbcInterceptors()==null || poolProperties.getJdbcInterceptors().indexOf(ConnectionState.class.getName())<0)
{
-            if (poolProperties.getDefaultReadOnly()!=null) connection.setReadOnly(poolProperties.getDefaultReadOnly().booleanValue());
-            if (poolProperties.getDefaultAutoCommit()!=null) connection.setAutoCommit(poolProperties.getDefaultAutoCommit().booleanValue());
-            if (poolProperties.getDefaultCatalog()!=null) connection.setCatalog(poolProperties.getDefaultCatalog());
-            if (poolProperties.getDefaultTransactionIsolation()!=DataSourceFactory.UNKNOWN_TRANSACTIONISOLATION)
connection.setTransactionIsolation(poolProperties.getDefaultTransactionIsolation());
-        }        
-        this.discarded = false;
-        this.lastConnected = System.currentTimeMillis();
     }
     
     /**
@@ -229,6 +265,7 @@
             }
         }
         connection = null;
+        xaConnection = null;
         lastConnected = -1;
         if (finalize) parent.finalize(this);
     }
@@ -502,6 +539,14 @@
         return this.connection;
     }
     
+    /**
+     * Returns the underlying XA connection
+     * @return the underlying XA connection as it was returned from the Datasource
+     */
+    public javax.sql.XAConnection getXAConnection() {
+        return this.xaConnection;
+    }
+    
     
     /**
      * Returns the timestamp of when the connection was last connected to the database.

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java (original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ProxyConnection.java Fri
Nov 20 21:39:36 2009
@@ -19,6 +19,8 @@
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.sql.SQLException;
+
+import javax.sql.XAConnection;
 /**
  * A ProxyConnection object is the bottom most interceptor that wraps an object of type 
  * {@link PooledConnection}. The ProxyConnection intercepts three methods:
@@ -95,6 +97,17 @@
             return this.toString();
         } else if (compare(GETCONNECTION_VAL,method) && connection!=null) {
             return connection.getConnection();
+        } else if (method.getClass().equals(XAConnection.class)) {
+            try {
+                return method.invoke(connection.getXAConnection(),args);
+            }catch (Throwable t) {
+                if (t instanceof InvocationTargetException) {
+                    InvocationTargetException it = (InvocationTargetException)t;
+                    throw it.getCause()!=null?it.getCause():it;
+                } else {
+                    throw t;
+                }
+            }
         }
         if (isClosed()) throw new SQLException("Connection has already been closed.");
         if (compare(UNWRAP_VAL,method)) {

Modified: tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java?rev=882723&r1=882722&r2=882723&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
(original)
+++ tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/jmx/ConnectionPool.java
Fri Nov 20 21:39:36 2009
@@ -570,5 +570,34 @@
    public void setSuspectTimeout(int seconds) {
        //no op
    }
+   
+   /** 
+    * {@inheritDoc}
+    */
+   public void setDataSource(javax.sql.DataSource ds) {
+       getPoolProperties().setDataSource(ds);
+   }
+   
+   /** 
+    * {@inheritDoc}
+    */
+   public javax.sql.DataSource getDataSource() {
+       return getPoolProperties().getDataSource();
+   }
+   
+   
+   /** 
+    * {@inheritDoc}
+    */
+   public void setDataSourceJNDI(String jndiDS) {
+       //noop
+   }
+   
+   /** 
+    * {@inheritDoc}
+    */
+   public String getDataSourceJNDI() {
+       return getPoolProperties().getDataSourceJNDI();
+   }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Mime
View raw message