MysqlPooledConnection.java
上传用户:tanyanyong
上传日期:2013-06-23
资源大小:1355k
文件大小:6k
源码类别:

电子政务应用

开发平台:

MultiPlatform

  1. /*
  2.    Copyright (C) 2002 MySQL AB
  3.    
  4.       This program is free software; you can redistribute it and/or modify
  5.       it under the terms of the GNU General Public License as published by
  6.       the Free Software Foundation; either version 2 of the License, or
  7.       (at your option) any later version.
  8.    
  9.       This program is distributed in the hope that it will be useful,
  10.       but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.       GNU General Public License for more details.
  13.    
  14.       You should have received a copy of the GNU General Public License
  15.       along with this program; if not, write to the Free Software
  16.       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.       
  18.  */
  19. package com.mysql.jdbc.jdbc2.optional;
  20. import java.sql.Connection;
  21. import java.sql.SQLException;
  22. import java.util.Enumeration;
  23. import java.util.Hashtable;
  24. import javax.sql.ConnectionEvent;
  25. import javax.sql.ConnectionEventListener;
  26. import javax.sql.PooledConnection;
  27. /**
  28.  * This class is used to wrap and return a physical connection within a logical handle.
  29.  * It also registers and notifies ConnectionEventListeners of any ConnectionEvents
  30.  *
  31.  * @see javax.sql.PooledConnection
  32.  * @see org.gjt.mm.mysql.jdbc2.optional.LogicalHandle
  33.  * @author Todd Wolff <todd.wolff_at_prodigy.net>
  34.  */
  35. public class MysqlPooledConnection
  36.     implements PooledConnection {
  37. /**
  38.  * The flag for an exception being thrown.
  39.  */
  40. public static final int CONNECTION_ERROR_EVENT = 1;
  41. /**
  42.  * The flag for a connection being closed.
  43.  */
  44. public static final int CONNECTION_CLOSED_EVENT = 2;
  45.     //~ Instance/static variables .............................................
  46.     private Hashtable eventListeners;
  47.     private Connection logicalHandle;
  48.     private Connection physicalConn;
  49.     
  50.     //~ Constructors ..........................................................
  51.     /**
  52.     * Construct a new MysqlPooledConnection and set instance variables
  53.     *
  54.     * @param connection physical connection to db
  55.     */
  56.     public MysqlPooledConnection(Connection connection) {
  57.         logicalHandle = null;
  58.         physicalConn = connection;
  59.         eventListeners = new Hashtable(10);
  60.     }
  61.     //~ Methods ...............................................................
  62.     /**
  63.      * Adds ConnectionEventListeners to a hash table to be used for notification of
  64.      * ConnectionEvents
  65.      *
  66.      * @param connectioneventlistener listener to be notified with ConnectionEvents
  67.      */
  68.     public synchronized void addConnectionEventListener(ConnectionEventListener connectioneventlistener) {
  69.         if (eventListeners != null) {
  70.             eventListeners.put(connectioneventlistener, 
  71.                                connectioneventlistener);
  72.         }
  73.     }
  74.     /**
  75.      * Removes ConnectionEventListeners from hash table used for notification of
  76.      * ConnectionEvents
  77.      *
  78.      * @param connectioneventlistener listener to be removed
  79.      */
  80.     public synchronized void removeConnectionEventListener(ConnectionEventListener connectioneventlistener) {
  81.         if (eventListeners != null) {
  82.             eventListeners.remove(connectioneventlistener);
  83.         }
  84.     }
  85.     /**
  86.      * Invoked by the container.  Return a logicalHandle object that wraps a physical 
  87.      * connection.
  88.      *
  89.      * @see java.sql.DataSource#getConnection()
  90.      */
  91.     public synchronized Connection getConnection()
  92.                                           throws SQLException {
  93.         if (physicalConn == null) {
  94.             SQLException sqlException = new SQLException(
  95.                                                 "Physical Connection doesn't exist");
  96.             callListener(CONNECTION_ERROR_EVENT, sqlException);
  97.             return null;
  98.         }
  99.         try {
  100.             if (logicalHandle != null) {
  101.                 ((ConnectionWrapper)logicalHandle).close(false);
  102.             }
  103.             logicalHandle = new ConnectionWrapper(this, physicalConn);
  104.         } catch (SQLException sqlException) {
  105.             callListener(CONNECTION_ERROR_EVENT, sqlException);
  106.             return null;
  107.         }
  108.         return logicalHandle;
  109.     }
  110.     /**
  111.      * Invoked by the container (not the client), and should close the physical connection.
  112.      * This will be called if the pool is destroyed or the connectionEventListener receives
  113.      * a connectionErrorOccurred event.
  114.      *
  115.      * @see java.sql.DataSource#close()
  116.      */
  117.     public synchronized void close()
  118.                             throws SQLException {
  119.         physicalConn.close();
  120.         physicalConn = null;
  121.     }
  122.     /**
  123.      * Notifies all registered ConnectionEventListeners of ConnectionEvents.  Instantiates
  124.      * a new ConnectionEvent which wraps sqlException and invokes either connectionClose
  125.      * or connectionErrorOccurred on listener as appropriate.
  126.      * 
  127.      * @param eventType value indicating whether connectionClosed or connectionErrorOccurred called
  128.      * @param sqlException the exception being thrown
  129.      */
  130.     protected synchronized void callListener(int eventType, SQLException sqlException) {
  131.         if (eventListeners == null) {
  132.             return;
  133.         }
  134.         Enumeration enumeration = eventListeners.keys();
  135.         ConnectionEvent connectionevent = new ConnectionEvent(this, 
  136.                                                               sqlException);
  137.         while (enumeration.hasMoreElements()) {
  138.             ConnectionEventListener connectioneventlistener = 
  139.                     (ConnectionEventListener) enumeration.nextElement();
  140.             ConnectionEventListener connectioneventlistener1 = 
  141.                     (ConnectionEventListener) eventListeners.get(
  142.                             connectioneventlistener);
  143.             if (eventType == CONNECTION_CLOSED_EVENT) {
  144.                 connectioneventlistener1.connectionClosed(connectionevent);
  145.             } else if (eventType == CONNECTION_ERROR_EVENT) {
  146.                 connectioneventlistener1.connectionErrorOccurred(
  147.                         connectionevent);
  148.             }
  149.         }
  150.     }
  151. }