allow the underlying database implementation to use a JCA DataSource loaded
via JNDI, if configured that way
This commit is contained in:
		
							parent
							
								
									2966ab703a
								
							
						
					
					
						commit
						9e5d4f9f57
					
				@ -33,6 +33,10 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  <!-- This section is used to configure the database pool system. -->
 | 
					  <!-- This section is used to configure the database pool system. -->
 | 
				
			||||||
  <database>
 | 
					  <database>
 | 
				
			||||||
 | 
					    <!-- If this is specified, Venice looks for a JCA DataSource with this name and delegates all connection
 | 
				
			||||||
 | 
					         pooling work to it.  All the other paramerers are ignored. -->
 | 
				
			||||||
 | 
					    <!-- <jca-datasource>VeniceDB</jca-datasource> -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <!-- The fully-qualified Java classname of the JDBC driver we wish to load. -->
 | 
					    <!-- The fully-qualified Java classname of the JDBC driver we wish to load. -->
 | 
				
			||||||
    <driver>org.gjt.mm.mysql.Driver</driver>
 | 
					    <driver>org.gjt.mm.mysql.Driver</driver>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -9,9 +9,9 @@
 | 
				
			|||||||
 * 
 | 
					 * 
 | 
				
			||||||
 * The Original Code is the Venice Web Communities System.
 | 
					 * The Original Code is the Venice Web Communities System.
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@silcom.com>,
 | 
					 * The Initial Developer of the Original Code is Eric J. Bowersox <erbo@ricochet.com>,
 | 
				
			||||||
 * for Silverwrist Design Studios.  Portions created by Eric J. Bowersox are
 | 
					 * for Silverwrist Design Studios.  Portions created by Eric J. Bowersox are
 | 
				
			||||||
 * Copyright (C) 2001-02 Eric J. Bowersox/Silverwrist Design Studios.  All Rights Reserved.
 | 
					 * Copyright (C) 2001-2004 Eric J. Bowersox/Silverwrist Design Studios.  All Rights Reserved.
 | 
				
			||||||
 * 
 | 
					 * 
 | 
				
			||||||
 * Contributor(s): 
 | 
					 * Contributor(s): 
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -19,6 +19,8 @@ package com.silverwrist.venice.db;
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
import java.util.*;
 | 
					import java.util.*;
 | 
				
			||||||
import java.sql.*;
 | 
					import java.sql.*;
 | 
				
			||||||
 | 
					import javax.naming.*;
 | 
				
			||||||
 | 
					import javax.sql.*;
 | 
				
			||||||
import org.apache.log4j.*;
 | 
					import org.apache.log4j.*;
 | 
				
			||||||
import org.w3c.dom.*;
 | 
					import org.w3c.dom.*;
 | 
				
			||||||
import com.silverwrist.util.DOMElementHelper;
 | 
					import com.silverwrist.util.DOMElementHelper;
 | 
				
			||||||
@ -48,6 +50,7 @@ public class DataPool implements Runnable
 | 
				
			|||||||
   *--------------------------------------------------------------------------------
 | 
					   *--------------------------------------------------------------------------------
 | 
				
			||||||
   */
 | 
					   */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private DataSource m_dsource = null; // JCA DataSource (overrides everything else)
 | 
				
			||||||
  private String driver;               // name of JDBC driver class
 | 
					  private String driver;               // name of JDBC driver class
 | 
				
			||||||
  private String url;                  // URL for JDBC connection
 | 
					  private String url;                  // URL for JDBC connection
 | 
				
			||||||
  private String username;             // username for JDBC connection
 | 
					  private String username;             // username for JDBC connection
 | 
				
			||||||
@ -83,6 +86,33 @@ public class DataPool implements Runnable
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    // Use a DOMElementHelper to read off the configuration for the DataPool.
 | 
					    // Use a DOMElementHelper to read off the configuration for the DataPool.
 | 
				
			||||||
    DOMElementHelper cfgx = new DOMElementHelper(cfg);
 | 
					    DOMElementHelper cfgx = new DOMElementHelper(cfg);
 | 
				
			||||||
 | 
					    String dsname = cfgx.getSubElementText("jca-datasource");
 | 
				
			||||||
 | 
					    if (dsname!=null)
 | 
				
			||||||
 | 
					    { // they specified a JCA DataSource name - try to bind to it
 | 
				
			||||||
 | 
					      if (logger.isDebugEnabled())
 | 
				
			||||||
 | 
						logger.debug("DataPool JCA data source: " + dsname);
 | 
				
			||||||
 | 
					      try
 | 
				
			||||||
 | 
					      { // get the datasource
 | 
				
			||||||
 | 
						Context ctx = new InitialContext();
 | 
				
			||||||
 | 
						m_dsource = (DataSource)(ctx.lookup("java:/" + dsname));
 | 
				
			||||||
 | 
						if (m_dsource!=null)
 | 
				
			||||||
 | 
						  return;  // initialization is effectively done
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
						  logger.warn("No data source found with name \"" + dsname + "\"; trying regular initialization");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      } // end try
 | 
				
			||||||
 | 
					      catch (NamingException e)
 | 
				
			||||||
 | 
					      { // output an error message
 | 
				
			||||||
 | 
						logger.warn("Error getting data source \"" + dsname + "\"; trying regular initialization",e);
 | 
				
			||||||
 | 
						m_dsource = null;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      } // end catch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } // end if
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					      logger.info("no JCA data source name configured - init the old way");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // proceed with regular initialization
 | 
				
			||||||
    driver = cfgx.getSubElementText("driver");
 | 
					    driver = cfgx.getSubElementText("driver");
 | 
				
			||||||
    if (driver==null)
 | 
					    if (driver==null)
 | 
				
			||||||
    { // no driver found!
 | 
					    { // no driver found!
 | 
				
			||||||
@ -152,7 +182,7 @@ public class DataPool implements Runnable
 | 
				
			|||||||
    } // end catch
 | 
					    } // end catch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (logger.isDebugEnabled())
 | 
					    if (logger.isDebugEnabled())
 | 
				
			||||||
      logger.debug("DataPool initial connections: " + String.valueOf(initial_conns));
 | 
					      logger.debug("DataPool initial connections: " + initial_conns);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    try
 | 
					    try
 | 
				
			||||||
    { // retrieve the max-conns figure and make it an integer
 | 
					    { // retrieve the max-conns figure and make it an integer
 | 
				
			||||||
@ -181,7 +211,7 @@ public class DataPool implements Runnable
 | 
				
			|||||||
    } // end catch
 | 
					    } // end catch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (logger.isDebugEnabled())
 | 
					    if (logger.isDebugEnabled())
 | 
				
			||||||
      logger.debug("DataPool maximum connections: " + String.valueOf(max_conns));
 | 
					      logger.debug("DataPool maximum connections: " + max_conns);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wait_if_busy = cfgx.hasChildElement("wait-if-busy");
 | 
					    wait_if_busy = cfgx.hasChildElement("wait-if-busy");
 | 
				
			||||||
    if (logger.isDebugEnabled())
 | 
					    if (logger.isDebugEnabled())
 | 
				
			||||||
@ -295,7 +325,7 @@ public class DataPool implements Runnable
 | 
				
			|||||||
  private final static void closeConnections(Vector vconn)
 | 
					  private final static void closeConnections(Vector vconn)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    if (logger.isDebugEnabled())
 | 
					    if (logger.isDebugEnabled())
 | 
				
			||||||
      logger.debug("closeConnections(" + String.valueOf(vconn.size()) + " to be closed)");
 | 
					      logger.debug("closeConnections(" + vconn.size() + " to be closed)");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (int i=0; i<vconn.size(); i++)
 | 
					    for (int i=0; i<vconn.size(); i++)
 | 
				
			||||||
    { // loop over the entire vector
 | 
					    { // loop over the entire vector
 | 
				
			||||||
@ -366,9 +396,11 @@ public class DataPool implements Runnable
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  public synchronized int numConnections()
 | 
					  public synchronized int numConnections()
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (m_dsource!=null)
 | 
				
			||||||
 | 
					      return 1;
 | 
				
			||||||
    int rc = avail_connections.size() + busy_connections.size();
 | 
					    int rc = avail_connections.size() + busy_connections.size();
 | 
				
			||||||
    if (logger.isDebugEnabled())
 | 
					    if (logger.isDebugEnabled())
 | 
				
			||||||
      logger.debug("numConnections() => " + String.valueOf(rc));
 | 
					      logger.debug("numConnections() => " + rc);
 | 
				
			||||||
    return rc;
 | 
					    return rc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  } // end numConnections
 | 
					  } // end numConnections
 | 
				
			||||||
@ -383,6 +415,9 @@ public class DataPool implements Runnable
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  public synchronized Connection getConnection() throws SQLException
 | 
					  public synchronized Connection getConnection() throws SQLException
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (m_dsource!=null)
 | 
				
			||||||
 | 
					      return m_dsource.getConnection();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (;;)
 | 
					    for (;;)
 | 
				
			||||||
    { // loop until we get a connection or throw an exception
 | 
					    { // loop until we get a connection or throw an exception
 | 
				
			||||||
      if (avail_connections.isEmpty())
 | 
					      if (avail_connections.isEmpty())
 | 
				
			||||||
@ -393,7 +428,7 @@ public class DataPool implements Runnable
 | 
				
			|||||||
	  makeBackgroundConnection();  // try to create a new connection
 | 
						  makeBackgroundConnection();  // try to create a new connection
 | 
				
			||||||
	else if (!wait_if_busy)
 | 
						else if (!wait_if_busy)
 | 
				
			||||||
	{ // don't want to wait?  tough, we're h0sed!
 | 
						{ // don't want to wait?  tough, we're h0sed!
 | 
				
			||||||
	  logger.error("exhausted maximum connection limit (" + String.valueOf(max_conns) + ")");
 | 
						  logger.error("exhausted maximum connection limit (" + max_conns + ")");
 | 
				
			||||||
	  throw new SQLException("connection limit reached");
 | 
						  throw new SQLException("connection limit reached");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} // end else if
 | 
						} // end else if
 | 
				
			||||||
@ -447,6 +482,23 @@ public class DataPool implements Runnable
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  synchronized void releaseConnection(Connection c)
 | 
					  synchronized void releaseConnection(Connection c)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (m_dsource!=null)
 | 
				
			||||||
 | 
					    { // just close the connection
 | 
				
			||||||
 | 
					      try
 | 
				
			||||||
 | 
					      { // close the connection
 | 
				
			||||||
 | 
						c.close();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      } // end try
 | 
				
			||||||
 | 
					      catch (SQLException e)
 | 
				
			||||||
 | 
					      { // log exception and continue
 | 
				
			||||||
 | 
						logger.error("c.close() exception",e);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      } // end catch
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    } // end if
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (c!=null)
 | 
					    if (c!=null)
 | 
				
			||||||
    { // can release this connection
 | 
					    { // can release this connection
 | 
				
			||||||
      if (c instanceof WrappedConnection)
 | 
					      if (c instanceof WrappedConnection)
 | 
				
			||||||
@ -482,6 +534,8 @@ public class DataPool implements Runnable
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  public synchronized void closeAllConnections()
 | 
					  public synchronized void closeAllConnections()
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (m_dsource!=null)
 | 
				
			||||||
 | 
					      return;
 | 
				
			||||||
    if (logger.isDebugEnabled())
 | 
					    if (logger.isDebugEnabled())
 | 
				
			||||||
      logger.debug("closing ALL connections!");
 | 
					      logger.debug("closing ALL connections!");
 | 
				
			||||||
    closeConnections(avail_connections);
 | 
					    closeConnections(avail_connections);
 | 
				
			||||||
@ -498,6 +552,8 @@ public class DataPool implements Runnable
 | 
				
			|||||||
   */
 | 
					   */
 | 
				
			||||||
  public synchronized String toString()
 | 
					  public synchronized String toString()
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
 | 
					    if (m_dsource!=null)
 | 
				
			||||||
 | 
					      return "DataPool " + m_dsource.toString();
 | 
				
			||||||
    StringBuffer info = new StringBuffer();
 | 
					    StringBuffer info = new StringBuffer();
 | 
				
			||||||
    info.append("DataPool(\"").append(url).append("\",\"").append(username).append("\"), ");
 | 
					    info.append("DataPool(\"").append(url).append("\",\"").append(username).append("\"), ");
 | 
				
			||||||
    info.append(avail_connections.size()).append(" avail, ").append(busy_connections.size());
 | 
					    info.append(avail_connections.size()).append(" avail, ").append(busy_connections.size());
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user