ÄúµÄλÖãºÊ×Ò³ >> ±à³Ì¿ª·¢ >> Java >> Êý¾Ý¿â >> ÕýÎÄ
Êý¾Ý¿â RSS
 

::Êý¾Ý¿âÁ¬½Ó³ØjavaʵÏÖС½á::

http://www.rdxx.com 02Äê03ÔÂ30ÈÕ 11:19 »¥ÁªÍø ÎÒҪͶ¸å

:: Êý¾Ý¿âÁ¬½Ó³ØjavaʵÏÖС½á ::

       ÒòΪ¹¤×÷ÐèҪҪʹÓõ½Á¬½Ó³Ø£¬ËùÒ԰ݶÁÁË»¥ÁªÍøÉÏÖÚ¶àǰ±²µÄÎÄÕ£¬Ñ§Á˲»ÉÙ¾­Ñ飬ÕâÀïÏë×öÒ»¸öС½á£¬¼ÓÉÏ×Ô¼ºµÄÏë·¨ºÍÔÚÒ»Æð£¬Ï£ÍûÄܸø´ó¼ÒһЩ°ïÖú¡£

Ä¿µÄ£º

  • Ïû³ýÊý¾Ý¿âƵ·±Á¬½Ó´øÀ´µÄ¿ªÏúºÍÆ¿¾±¡£

½â¾ö·½°¸£º

  • ²»¹ý¶àµÄÏÞÖÆÓû§µÄʹÓ㬼Ȳ»ÄÜÌ«¶àµÄÒªÇóÓû§°´¹æ¶¨µÄ·½·¨µÃµ½ºÍʹÓÃÊý¾Ý¿âÁ¬
  • ¾¡Á¿±£³ÖÓû§µÄϰ¹ß

ĿǰµÄºÜ¶à·½·¨¶¼ÊÇÒªÇóÓû§Ö»Äܰ´¹æ¶¨·½·¨Ê¹ÓÃÁ¬½Ó£¬²»ÄÜʹÓÃÖ±½Ó¹Ø±ÕÊý¾ÝÁ¬½ÓµÄ·½·¨¡£½â¾ö°ì·¨¾ÍÊÇʹÓôúÀíÀ࣬À´Öмä½â¾ö¡£¿ÉÒԲο¼http://www-900.ibm.com/developerWorks/cn/java/l-connpoolproxy/index.shtml

  • ÄÜά»¤Á¬½ÓµÄÕý³£×´Ì¬

ÒòΪÕë¶ÔÊý¾Ý¿âÁ¬½Ó´´½¨µÄ×ÊÔ´£¬Èç¹û²»Äܼ°Ê±µÄÊÍ·Å£¬¾Í»áÓ°ÏìÏÂÒ»´ÎÊý¾ÝÁ¬½ÓµÄʹÓá£ÀýÈçÔÚsql 2kÖУ¬Ò»¸öÁ¬½Ó²»Í¬´´½¨¶àÌõStatement·ñÔò²Ù×÷ʱ»áÓÐÊý¾ÝÁ¬½ÓÕ¼ÏßµÄÒì³££¬ËùÒÔ±ØÐëÔڹ黹Á¬½ÓÒÔºóÊÍ·ÅÕâЩ×ÊÔ´¡£

   //ÅжÏÊÇʹÓÃÁËcreateStatementÓï¾ä
   if (CREATESTATE.equals(method.getName()))
   {
    obj = method.invoke(conn, args);
    statRef = (Statement)obj;//¼Ç¼Óï¾ä
    return obj;
   }

   //ÅжÏÊÇ·ñµ÷ÓÃÁËcloseµÄ·½·¨£¬Èç¹ûµ÷ÓÃclose·½·¨Ôò°ÑÁ¬½ÓÖÃΪÎÞÓÃ״̬
   if(CLOSE.equals(method.getName()))
   {
    //ÉèÖò»Ê¹ÓñêÖ¾
    setIsFree(false);
    //¼ì²éÊÇ·ñÓкóÐø¹¤×÷£¬Çå³ý¸ÃÁ¬½ÓÎÞÓÃ×ÊÔ´
    if (statRef != null)
     statRef.close();
    if (prestatRef != null)
     prestatRef.close();
    return null;
   }

  • ÕýÈ·±£»¤À಻±»Î¥ÀýʹÓÃ

Ò»¸ö¿¼ÂǾÍÊDz»ÄÜÈÃÓû§Ëæ±ãʹÓôúÀíÀ࣬¶øÖ»ÄÜ×Ô¼ºÊ¹Óã¬Ò»¸ö¾ÍÊÇÓÃÄÚ²¿Ë½ÓÐÀ࣬һ¸ö¾ÍÊÇʹÓÃÖ»ÓÐÖ¸¶¨Àà²ÅÄܵ÷ÓõıêÖ¾¡£ÎÒµÄʵÏÖ¾ÍÊDzÉÓúóÕß¡£

 /**
  * ´´½¨Á¬½ÓµÄ¹¤³§£¬Ö»ÄÜÈù¤³§µ÷ÓÃ
  * @param factory Òªµ÷Óù¤³§£¬²¢ÇÒÒ»¶¨±»ÕýÈ·³õʼ»¯
  * @param param Á¬½Ó²ÎÊý
  * @return Á¬½Ó
  */
 static public _Connection getConnection(ConnectionFactory factory, ConnectionParam param)
 {
  if (factory.isCreate())//ÅжÏÊÇ·ñÕýÈ·³õʼ»¯µÄ¹¤³§
  {
   _Connection _conn = new _Connection(param);
   return _conn;
  }
  else
   return null;
 }
  • ÌṩÁ¼ºÃµÄÓû§½Ó¿Ú£¬¼òµ¥ÊµÓÃ

ʹÓþ²Ì¬·½·¨´´½¨¹¤³§£¬È»ºóÀ´µÃµ½Á¬½Ó£¬Ê¹ÓÃÍêÈ«ºÍÆÕͨµÄConnection·½·¨Ò»Ñù£¬Ã»ÓÐÏÞÖÆ¡£Í¬Ê±ÎªÁË·½±ã£¬ÉèÖÃÁËÁ¬½Ó²ÎÊýÀàºÍ¹¤³§²ÎÊýÀà¡£

  •  ConnectionParam param = new ConnectionParam(driver,url,user,password);
      ConnectionFactory cf = null;//new ConnectionFactory(param, new FactoryParam());
      try{
       cf = new ConnectionFactory(param,new FactoryParam());
       Connection conn1 = cf.getFreeConnection();
       Connection conn2 = cf.getFreeConnection();
       Connection conn3 = cf.getFreeConnection();
       Statement stmt = conn1.createStatement();
       ResultSet rs = stmt.executeQuery("select * from requests");
       if (rs.next())
       {
        System.out.println("conn1 y");  
       }
       else
       {
        System.out.println("conn1 n");  
       } 
       stmt.close();
       conn1.close();  
  • ΪÁËʵÏÖÁ¬½Ó³ØµÄÕý³£ÔË×÷£¬Ê¹ÓÃÁ˵¥Ì¬Ä£

 /**
  * ʹÓÃÖ¸¶¨µÄ²ÎÊý´´½¨Ò»¸öÁ¬½Ó³Ø
  */
 public ConnectionFactory(ConnectionParam param, FactoryParam fparam)
  throws SQLException
 {
  //²»ÔÊÐí²ÎÊýΪ¿Õ
  if ((param == null)||(fparam == null))
   throw new SQLException("ConnectionParamºÍFactoryParam²»ÄÜΪ¿Õ");
  if (m_instance == null)
  {
   synchronized(ConnectionFactory.class){
    if (m_instance == null)
    {
     //new instance
     //²ÎÊý¶¨ÖÆ
     m_instance = new ConnectionFactory();
     m_instance.connparam = param;
     m_instance.MaxConnectionCount = fparam.getMaxConn();
     m_instance.MinConnectionCount = fparam.getMinConn();
     m_instance.ManageType = fparam.getType();
     m_instance.isflag = true;
     //³õʼ»¯£¬´´½¨MinConnectionCount¸öÁ¬½Ó
     System.out.println("connection factory ´´½¨£¡");
     try{
      for (int i=0; i < m_instance.MinConnectionCount; i++)
      {
       _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);
       if (_conn == null) continue;
       System.out.println("connection´´½¨");
       m_instance.FreeConnectionPool.add(_conn);//¼ÓÈë¿ÕÏÐÁ¬½Ó³Ø
       m_instance.current_conn_count ++;
       //±êÖ¾ÊÇ·ñÖ§³ÖÊÂÎñ
       m_instance.supportTransaction = _conn.isSupportTransaction();    
      }
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
     //¸ù¾Ý²ßÂÔÅжÏÊÇ·ñÐèÒª²éѯ
     if (m_instance.ManageType != 0)
     {
      Thread t = new Thread(new FactoryMangeThread(m_instance));
      t.start();
     } 
    }
   }
  }
 }
 

  • Á¬½Ó³ØµÄ¹ÜÀí

¶ÔÓÚÁ¬½Ó³ØµÄ¹ÜÀí£¬ÎÒÊÇÉèÏëʹÓþ²Ì¬¹ÜÀíºÍ¶¯Ì¬¹ÜÀíÁ½ÖÖ²ßÂÔ£¬ÉèÖÃÁË×î´óÏÞÖÆ£¬ºÍºã¶¨µÄÁ¬½ÓÊý¡£Ê¹ÓÃÁË2¸ö³Ø£¬Ò»¸ö¿ÕÏгأ¬Ò»¸öʹÓóء£¾²Ì¬¾ÍÊÇʹÓõÄʱºò·¢ÏÖ¿ÕÏÐÁ¬½Ó²»¹»ÔÙÈ¥¼ì²é¡£¶¯Ì¬¾ÍÊÇʹÓÃÁËÒ»¸öÏ̶߳¨Ê±¼ì²é¡£

 //¸ù¾Ý²ßÂÔÅжÏÊÇ·ñÐèÒª²éѯ
     if (m_instance.ManageType != 0)
     {
      Thread t = new Thread(new FactoryMangeThread(m_instance));
      t.start();
     }
 //Á¬½Ó³Øµ÷¶ÈÏß³Ì
public class FactoryMangeThread implements Runnable {
 ConnectionFactory cf = null;
 long delay = 1000;
 public FactoryMangeThread(ConnectionFactory obj)
 {
  cf = obj;
 }
 /* (non-Javadoc)
  * @see java.lang.Runnable#run()
  */
 public void run() {
  while(true){
   try{
    Thread.sleep(delay);
   }
   catch(InterruptedException e){}
   System.out.println("eeeee");
   //ÅжÏÊÇ·ñÒѾ­¹Ø±ÕÁ˹¤³§£¬ÄǾÍÍ˳ö¼àÌý
   if (cf.isCreate())
    cf.schedule();
   else
    System.exit(1);
  }
 }
}

×îºó¸ø³öÍêÕûµÄÔ´´úÂ룺

 


 

_Connectio.java

package scut.ailab.connectionpool;
import java.lang.reflect.*;
import java.sql.*;
/**
 * @author youyongming
 * ¶¨ÒåÊý¾Ý¿âÁ¬½ÓµÄ´úÀíÀà
 */
public class _Connection implements InvocationHandler {
 //¶¨ÒåÁ¬½Ó
 private Connection conn = null;
 //¶¨Òå¼à¿ØÁ¬½Ó´´½¨µÄÓï¾ä
 private Statement statRef = null;
 private PreparedStatement prestatRef = null;
 //ÊÇ·ñÖ§³ÖÊÂÎñ±êÖ¾
 private boolean supportTransaction = false;
 //Êý¾Ý¿âµÄæ״̬
 private boolean isFree = false;
 //×îºóÒ»´Î·ÃÎÊʱ¼ä
 long lastAccessTime = 0;
 //¶¨ÒåÒª½Ó¹ÜµÄº¯ÊýµÄÃû×Ö
 String CREATESTATE = "createStatement";
 String CLOSE = "close";
 String PREPARESTATEMENT = "prepareStatement";
 String COMMIT = "commit";
 String ROLLBACK = "rollback";
 /**
  * ¹¹Ô캯Êý£¬²ÉÓÃ˽ÓУ¬·ÀÖ¹±»Ö±½Ó´´½¨
  * @param param Á¬½Ó²ÎÊý
  */
 private _Connection(ConnectionParam param) {
  //¼Ç¼ÈÕÖÁ
  
  try{
   //´´½¨Á¬½Ó
   Class.forName(param.getDriver()).newInstance();
   conn = DriverManager.getConnection(param.getUrl(),param.getUser(), param.getPassword());   
   DatabaseMetaData dm = null;
   dm = conn.getMetaData();
   //ÅжÏÊÇ·ñÖ§³ÖÊÂÎñ
   supportTransaction = dm.supportsTransactions();
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }

 /* (non-Javadoc)
  * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
  */
 public Object invoke(Object proxy, Method method, Object[] args)
  throws Throwable {
   Object obj = null;
   //ÅжÏÊÇ·ñµ÷ÓÃÁËcloseµÄ·½·¨£¬Èç¹ûµ÷ÓÃclose·½·¨Ôò°ÑÁ¬½ÓÖÃΪÎÞÓÃ״̬
   if(CLOSE.equals(method.getName()))
   {
    //ÉèÖò»Ê¹ÓñêÖ¾
    setIsFree(false);
    //¼ì²éÊÇ·ñÓкóÐø¹¤×÷£¬Çå³ý¸ÃÁ¬½ÓÎÞÓÃ×ÊÔ´
    if (statRef != null)
     statRef.close();
    if (prestatRef != null)
     prestatRef.close();
    return null;
   }
   //ÅжÏÊÇʹÓÃÁËcreateStatementÓï¾ä
   if (CREATESTATE.equals(method.getName()))
   {
    obj = method.invoke(conn, args);
    statRef = (Statement)obj;//¼Ç¼Óï¾ä
    return obj;
   }
   //ÅжÏÊÇʹÓÃÁËprepareStatementÓï¾ä
   if (PREPARESTATEMENT.equals(method.getName()))
   {
    obj = method.invoke(conn, args);
    prestatRef = (PreparedStatement)obj;
    return obj;
   }
   //Èç¹û²»Ö§³ÖÊÂÎñ£¬¾Í²»Ö´ÐиÃÊÂÎïµÄ´úÂë
   if ((COMMIT.equals(method.getName())||ROLLBACK.equals(method.getName())) && (!isSupportTransaction()))
    return null;   
   obj = method.invoke(conn, args); 
   //ÉèÖÃ×îºóÒ»´Î·ÃÎÊʱ¼ä£¬ÒԱ㼰ʱÇå³ý³¬Ê±µÄÁ¬½Ó
   lastAccessTime = System.currentTimeMillis();
   return obj;
 }
 /**
  * ´´½¨Á¬½ÓµÄ¹¤³§£¬Ö»ÄÜÈù¤³§µ÷ÓÃ
  * @param factory Òªµ÷Óù¤³§£¬²¢ÇÒÒ»¶¨±»ÕýÈ·³õʼ»¯
  * @param param Á¬½Ó²ÎÊý
  * @return Á¬½Ó
  */
 static public _Connection getConnection(ConnectionFactory factory, ConnectionParam param)
 {
  if (factory.isCreate())//ÅжÏÊÇ·ñÕýÈ·³õʼ»¯µÄ¹¤³§
  {
   _Connection _conn = new _Connection(param);
   return _conn;
  }
  else
   return null;
 }
 
 public Connection getFreeConnection() {
  //·µ»ØÊý¾Ý¿âÁ¬½ÓconnµÄ½Ó¹ÜÀ࣬ÒÔ±ã½Ø×¡close·½·¨
  Connection conn2 = (Connection)Proxy.newProxyInstance(
   conn.getClass().getClassLoader(),
   conn.getClass().getInterfaces(),this);
  return conn2;
 }
 /**
  * ¸Ã·½·¨ÕæÕýµÄ¹Ø±ÕÁËÊý¾Ý¿âµÄÁ¬½Ó
  * @throws SQLException
  */
 void close() throws SQLException{
  //ÓÉÓÚÀàÊôÐÔconnÊÇûÓб»½Ó¹ÜµÄÁ¬½Ó£¬Òò´ËÒ»µ©µ÷ÓÃclose·½·¨ºó¾ÍÖ±½Ó¹Ø±ÕÁ¬½Ó
  conn.close();
 }
   
 public void setIsFree(boolean value)
 {
  isFree = value;
 }
 
 public boolean isFree() {
  return isFree;
 } 
 /**
  * ÅжÏÊÇ·ñÖ§³ÖÊÂÎñ
  * @return boolean
  */
 public boolean isSupportTransaction() {
  return supportTransaction;
 } 
}

 


ConnectionFactory.java

 package scut.ailab.connectionpool;
/**
 * @author youyongming
 *
 */
import java.util.LinkedHashSet;
import java.sql.*;
import java.util.Iterator;
public class ConnectionFactory {
 private static ConnectionFactory m_instance = null;
 //ÔÚʹÓõÄÁ¬½Ó³Ø
 private LinkedHashSet ConnectionPool = null;
 //¿ÕÏÐÁ¬½Ó³Ø
 private LinkedHashSet FreeConnectionPool = null;
 //×î´óÁ¬½ÓÊý
 private int MaxConnectionCount = 4;
 //×îСÁ¬½ÓÊý
 private int MinConnectionCount = 2;
 //µ±Ç°Á¬½ÓÊý
 private int current_conn_count = 0;
 //Á¬½Ó²ÎÊý
 private ConnectionParam connparam = null;
 //ÊÇ·ñ´´½¨¹¤³§µÄ±êÖ¾
 private boolean isflag = false;
 //ÊÇ·ñÖ§³ÖÊÂÎñ
 private boolean supportTransaction = false;
 //¶¨Òå¹ÜÀí²ßÂÔ
 private int ManageType = 0;
 private ConnectionFactory() {
  ConnectionPool = new LinkedHashSet();
  FreeConnectionPool = new LinkedHashSet();
 }
 
 /**
  * ʹÓÃÖ¸¶¨µÄ²ÎÊý´´½¨Ò»¸öÁ¬½Ó³Ø
  */
 public ConnectionFactory(ConnectionParam param, FactoryParam fparam)
  throws SQLException
 {
  //²»ÔÊÐí²ÎÊýΪ¿Õ
  if ((param == null)||(fparam == null))
   throw new SQLException("ConnectionParamºÍFactoryParam²»ÄÜΪ¿Õ");
  if (m_instance == null)
  {
   synchronized(ConnectionFactory.class){
    if (m_instance == null)
    {
     //new instance
     //²ÎÊý¶¨ÖÆ
     m_instance = new ConnectionFactory();
     m_instance.connparam = param;
     m_instance.MaxConnectionCount = fparam.getMaxConn();
     m_instance.MinConnectionCount = fparam.getMinConn();
     m_instance.ManageType = fparam.getType();
     m_instance.isflag = true;
     //³õʼ»¯£¬´´½¨MinConnectionCount¸öÁ¬½Ó
     System.out.println("connection factory ´´½¨£¡");
     try{
      for (int i=0; i < m_instance.MinConnectionCount; i++)
      {
       _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);
       if (_conn == null) continue;
       System.out.println("connection´´½¨");
       m_instance.FreeConnectionPool.add(_conn);//¼ÓÈë¿ÕÏÐÁ¬½Ó³Ø
       m_instance.current_conn_count ++;
       //±êÖ¾ÊÇ·ñÖ§³ÖÊÂÎñ
       m_instance.supportTransaction = _conn.isSupportTransaction();    
      }
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
     //¸ù¾Ý²ßÂÔÅжÏÊÇ·ñÐèÒª²éѯ
     if (m_instance.ManageType != 0)
     {
      Thread t = new Thread(new FactoryMangeThread(m_instance));
      t.start();
     } 
    }
   }
  }
 }
 
 /**
  * ±êÖ¾¹¤³§ÊÇ·ñÒѾ­´´½¨
  * @return boolean
  */ 
 public boolean isCreate()
 {
  return m_instance.isflag;
 }
 
 /**
  * ´ÓÁ¬½Ó³ØÖÐȡһ¸ö¿ÕÏеÄÁ¬½Ó
  * @return Connection
  * @throws SQLException
  */
 public synchronized Connection getFreeConnection()
  throws SQLException
 {
  Connection conn = null;
  //»ñÈ¡¿ÕÏÐÁ¬½Ó
  Iterator iter = m_instance.FreeConnectionPool.iterator();
  while(iter.hasNext()){
   _Connection _conn = (_Connection)iter.next();
   //ÕÒµ½Î´ÓÃÁ¬½Ó
   if(!_conn.isFree()){
    conn = _conn.getFreeConnection();
    _conn.setIsFree(true);
    //ÒÆ³ö¿ÕÏÐÇø
    m_instance.FreeConnectionPool.remove(_conn);
    //¼ÓÈëÁ¬½Ó³Ø 
    m_instance.ConnectionPool.add(_conn);   
    break;
   }
  }
  //¼ì²é¿ÕÏгØÊÇ·ñΪ¿Õ
  if (m_instance.FreeConnectionPool.isEmpty())
  {
   //ÔÙ¼ì²éÊÇ·ñÄܹ»·ÖÅä
   if (m_instance.current_conn_count < m_instance.MaxConnectionCount)
   {
   //н¨Á¬½Óµ½¿ÕÏÐÁ¬½Ó³Ø
    int newcount = 0 ;
    //È¡µÃÒª½¨Á¢µÄÊýÄ¿
    if (m_instance.MaxConnectionCount - m_instance.current_conn_count >=m_instance.MinConnectionCount)
    {
     newcount = m_instance.MinConnectionCount;
    }
    else
    {
     newcount = m_instance.MaxConnectionCount - m_instance.current_conn_count;
    }
    //´´½¨Á¬½Ó
    for (int i=0;i <newcount; i++)
    {
     _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);
     m_instance.FreeConnectionPool.add(_conn);
     m_instance.current_conn_count ++;
    }
   }
   else
   {//Èç¹û²»ÄÜн¨£¬¼ì²éÊÇ·ñÓÐÒѾ­¹é»¹µÄÁ¬½Ó
    iter = m_instance.ConnectionPool.iterator();
    while(iter.hasNext()){
     _Connection _conn = (_Connection)iter.next();
     if(!_conn.isFree()){
      conn = _conn.getFreeConnection();
      _conn.setIsFree(false);
      m_instance.ConnectionPool.remove(_conn); 
      m_instance.FreeConnectionPool.add(_conn);   
      break;
     }
    }    
   }
  }//if (FreeConnectionPool.isEmpty())
 //Ôٴμì²éÊÇ·ñÄÜ·ÖÅäÁ¬½Ó
  if(conn == null){
   iter = m_instance.FreeConnectionPool.iterator();
   while(iter.hasNext()){
    _Connection _conn = (_Connection)iter.next();
    if(!_conn.isFree()){
     conn = _conn.getFreeConnection();
     _conn.setIsFree(true);
     m_instance.FreeConnectionPool.remove(_conn); 
     m_instance.ConnectionPool.add(_conn);   
     break;
    }
   }
   if(conn == null)//Èç¹û²»ÄÜÔò˵Ã÷ÎÞÁ¬½Ó¿ÉÓÃ
    throw new SQLException("ûÓпÉÓõÄÊý¾Ý¿âÁ¬½Ó");
  }
  System.out.println("get connection");
  return conn;
 }
 
 /**
  * ¹Ø±Õ¸ÃÁ¬½Ó³ØÖеÄËùÓÐÊý¾Ý¿âÁ¬½Ó
  * @throws SQLException
  */
 public synchronized void close() throws SQLException
 {
  this.isflag = false;
  SQLException excp = null;
  //¹Ø±Õ¿ÕÏгØ
  Iterator iter = m_instance.FreeConnectionPool.iterator();
  while(iter.hasNext()){
   try{
    ((_Connection)iter.next()).close();
    System.out.println("close connection:free");
    m_instance.current_conn_count --;
   }catch(Exception e){
    if(e instanceof SQLException)
     excp = (SQLException)e;
   }
  }
  //¹Ø±ÕÔÚʹÓõÄÁ¬½Ó³Ø
  iter = m_instance.ConnectionPool.iterator();
  while(iter.hasNext()){
   try{
    ((_Connection)iter.next()).close();
    System.out.println("close connection:inused");
    m_instance.current_conn_count --;
   }catch(Exception e){
    if(e instanceof SQLException)
     excp = (SQLException)e;
   }
  }  
  if(excp != null)
   throw excp;
 } 
 
 /**
  * ·µ»ØÊÇ·ñÖ§³ÖÊÂÎñ
  * @return boolean
  */
 public boolean isSupportTransaction() {
  return m_instance.supportTransaction;
 }  
 /**
  * Á¬½Ó³Øµ÷¶È¹ÜÀí
  *
  */
 public void schedule()
 {
  Connection conn = null;
  //ÔÙ¼ì²éÊÇ·ñÄܹ»·ÖÅä
  Iterator iter = null;
  //¼ì²éÊÇ·ñÓÐÒѾ­¹é»¹µÄÁ¬½Ó
  {
   iter = m_instance.ConnectionPool.iterator();
   while(iter.hasNext()){
    _Connection _conn = (_Connection)iter.next();
    if(!_conn.isFree()){
     conn = _conn.getFreeConnection();
     _conn.setIsFree(false);
     m_instance.ConnectionPool.remove(_conn); 
     m_instance.FreeConnectionPool.add(_conn);   
     break;
    }
   }    
  }
  if (m_instance.current_conn_count < m_instance.MaxConnectionCount)
  {
   //н¨Á¬½Óµ½¿ÕÏÐÁ¬½Ó³Ø
   int newcount = 0 ;
   //È¡µÃÒª½¨Á¢µÄÊýÄ¿
   if (m_instance.MaxConnectionCount - m_instance.current_conn_count >=m_instance.MinConnectionCount)
   {
    newcount = m_instance.MinConnectionCount;
   }
   else
   {
    newcount = m_instance.MaxConnectionCount - m_instance.current_conn_count;
   }
   //´´½¨Á¬½Ó
   for (int i=0;i <newcount; i++)
   {
    _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);
    m_instance.FreeConnectionPool.add(_conn);
    m_instance.current_conn_count ++;
   }
  }
 }
}

 


ConnectionParam.java

 package scut.ailab.connectionpool;
import java.io.Serializable;
/**
 * @author youyongming
 * ʵÏÖÊý¾Ý¿âÁ¬½ÓµÄ²ÎÊýÀà
 */
public class ConnectionParam implements Serializable {
 private String driver;    //Êý¾Ý¿âÇý¶¯³ÌÐò
 private String url;   //Êý¾ÝÁ¬½ÓµÄURL
 private String user;    //Êý¾Ý¿âÓû§Ãû
 private String password;   //Êý¾Ý¿âÃÜÂë
 
 /**
  * ΨһµÄ¹¹Ô캯Êý£¬ÐèÒªÖ¸¶¨Á¬½ÓµÄËĸö±ØÒª²ÎÊý
  * @param driver Êý¾ÝÇý¶¯
  * @param url  Êý¾Ý¿âÁ¬½Óurl
  * @param user  Óû§Ãû
  * @param password ÃÜÂë
  */
 public ConnectionParam(String driver,String url,String user,String password)
 {
  this.driver = driver;
  this.url = url;
  this.user = user;
  this.password = password;
 }
 public String getDriver() {
  return driver;
 }
 public String getPassword() {
  return password;
 }
 public String getUrl() {
  return url;
 }
 public String getUser() {
  return user;
 }
 public void setDriver(String driver) {
  this.driver = driver;
 }
 public void setPassword(String password) {
  this.password = password;
 }
 public void setUrl(String url) {
  this.url = url;
 }
 public void setUser(String user) {
  this.user = user;
 }
 /**
  * @see java.lang.Object#clone()
  */
 public Object clone(){
  ConnectionParam param = new ConnectionParam(driver,url,user,password);
  return param;
 }
 /**
  * @see java.lang.Object#equals(java.lang.Object)
  */
 public boolean equals(Object obj) {
  if(obj instanceof ConnectionParam){
   ConnectionParam param = (ConnectionParam)obj;
   return ((driver.compareToIgnoreCase(param.getDriver()) == 0)&&
   (url.compareToIgnoreCase(param.getUrl()) == 0)&&
   (user.compareToIgnoreCase(param.getUser()) == 0)&&
   (password.compareToIgnoreCase(param.getPassword()) == 0));
  }
  return false;
 }
}

 


FactoryMangeThread.java

 /*
 * Created on 2003-5-13
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package scut.ailab.connectionpool;
/**
 * @author youyongming
 *
 */
//Á¬½Ó³Øµ÷¶ÈÏß³Ì
public class FactoryMangeThread implements Runnable {
 ConnectionFactory cf = null;
 long delay = 1000;
 public FactoryMangeThread(ConnectionFactory obj)
 {
  cf = obj;
 }
 /* (non-Javadoc)
  * @see java.lang.Runnable#run()
  */
 public void run() {
  while(true){
   try{
    Thread.sleep(delay);
   }
   catch(InterruptedException e){}
   System.out.println("eeeee");
   //ÅжÏÊÇ·ñÒѾ­¹Ø±ÕÁ˹¤³§£¬ÄǾÍÍ˳ö¼àÌý
   if (cf.isCreate())
    cf.schedule();
   else
    System.exit(1);
  }
 }
}

 


FactoryParam.java

 /*
 * Created on 2003-5-13
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package scut.ailab.connectionpool;
/**
 * @author youyongming
 *
 */
//Á¬½Ó³Ø¹¤³§²ÎÊý
public class FactoryParam {
 //×î´óÁ¬½ÓÊý
 private int MaxConnectionCount = 4;
 //×îСÁ¬½ÓÊý
 private int MinConnectionCount = 2;
 //»ØÊÕ²ßÂÔ
 private int ManageType = 0;
 
 public FactoryParam() {
 }
 
 /**
  * ¹¹ÔìÁ¬½Ó³Ø¹¤³§²ÎÊýµÄ¶ÔÏó
  * @param max ×î´óÁ¬½ÓÊý
  * @param min ×îСÁ¬½ÓÊý
  * @param type ¹ÜÀí²ßÂÔ
  */
 public FactoryParam(int max, int min, int type)
 {
  this.ManageType = type;
  this.MaxConnectionCount = max;
  this.MinConnectionCount = min;
 }
 
 /**
  * ÉèÖÃ×î´óµÄÁ¬½ÓÊý
  * @param value
  */
 public void setMaxConn(int value)
 {
  this.MaxConnectionCount = value;
 }
 /**
  * »ñÈ¡×î´óÁ¬½ÓÊý
  * @return
  */
 public int getMaxConn()
 {
  return this.MaxConnectionCount;
 }
 /**
  * ÉèÖÃ×îСÁ¬½ÓÊý
  * @param value
  */
 public void setMinConn(int value)
 {
  this.MinConnectionCount = value;
 }
 /**
  * »ñÈ¡×îСÁ¬½ÓÊý
  * @return
  */
 public int getMinConn()
 {
  return this.MinConnectionCount;
 }
 public int getType()
 {
  return this.ManageType;
 }
}

 


testmypool.java

 /*
 * Created on 2003-5-13
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
package scut.ailab.connectionpool;
/**
 * @author youyongming
 *
 */
import java.sql.*;
public class testmypool {
 public void test1()
 {
  String user = "DevTeam";
  String password = "DevTeam";
  String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
  String url = "jdbc:odbc:gfqh2";
  ConnectionParam param = new ConnectionParam(driver,url,user,password);
  ConnectionFactory cf = null;//new ConnectionFactory(param, new FactoryParam());
  try{
   cf = new ConnectionFactory(param,new FactoryParam());
   Connection conn1 = cf.getFreeConnection();
   Connection conn2 = cf.getFreeConnection();
   Connection conn3 = cf.getFreeConnection();
   Statement stmt = conn1.createStatement();
   ResultSet rs = stmt.executeQuery("select * from requests");
   if (rs.next())
   {
    System.out.println("conn1 y");  
   }
   else
   {
    System.out.println("conn1 n");  
   } 
   stmt.close();
   conn1.close();  
   Connection conn4 = cf.getFreeConnection();
   Connection conn5 = cf.getFreeConnection();
   stmt = conn5.createStatement();
   rs = stmt.executeQuery("select * from requests");
   if (rs.next())
   {
    System.out.println("conn5 y");  
   }
   else
   {
    System.out.println("conn5 n");  
   } 
   conn2.close();
   conn3.close();
   conn4.close();
   conn5.close();
   }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  finally{
   try{
    cf.close();
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
  } 
 }
 public static void main(String[] args) {
  String user = "DevTeam";
  String password = "DevTeam";
  String driver = "sun.jdbc.odbc.JdbcOdbcDriver";
  String url = "jdbc:odbc:gfqh2";
  ConnectionParam param = new ConnectionParam(driver,url,user,password);
  ConnectionFactory cf = null;//new ConnectionFactory(param,new FactoryParam());
  try{
   cf = new ConnectionFactory(param,new FactoryParam());
   ConnectionFactory cf1= new ConnectionFactory(param,new FactoryParam());
   Connection conn1 = null;
   long time = System.currentTimeMillis();
   for (int i=0; i <10;i++)
   {
    conn1 = cf.getFreeConnection();
    Statement stmt = conn1.createStatement();
    ResultSet rs = stmt.executeQuery("select * from requests");
    if (rs.next())
    {
     System.out.println("conn1 y");  
    }
    else
    {
     System.out.println("conn1 n");  
    } 
    conn1.close();  
   }
   System.out.println("pool:" + (System.currentTimeMillis()-time));
   time = System.currentTimeMillis();
   Class.forName(param.getDriver()).newInstance();
   for (int i=0; i <10;i++)
   {
    conn1 = DriverManager.getConnection(param.getUrl(),param.getUser(), param.getPassword());   
    Statement stmt = conn1.createStatement();
    ResultSet rs = stmt.executeQuery("select * from requests");
    if (rs.next())
    {
     System.out.println("conn1 y");  
    }
    else
    {
     System.out.println("conn1 n");  
    } 
    conn1.close();  
   }   
   System.out.println("no pool:" + (System.currentTimeMillis()-time));
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
  finally{
   try{
    cf.close();
   }
   catch(Exception e)
   {
    e.printStackTrace();
   }
  }
 }
}

 

  • ÄÜά»¤Á¬½ÓµÄÕý³£×´Ì¬

ÒòΪÕë¶ÔÊý¾Ý¿âÁ¬½Ó´´½¨µÄ×ÊÔ´£¬Èç¹û²»Äܼ°Ê±µÄÊÍ·Å£¬¾Í»áÓ°ÏìÏÂÒ»´ÎÊý¾ÝÁ¬½ÓµÄʹÓá£ÀýÈçÔÚsql 2kÖУ¬Ò»¸öÁ¬½Ó²»Í¬´´½¨¶àÌõStatement·ñÔò²Ù×÷ʱ»áÓÐÊý¾ÝÁ¬½ÓÕ¼ÏßµÄÒì³££¬ËùÒÔ±ØÐëÔڹ黹Á¬½ÓÒÔºóÊÍ·ÅÕâЩ×ÊÔ´¡£

   //ÅжÏÊÇʹÓÃÁËcreateStatementÓï¾ä
   if (CREATESTATE.equals(method.getName()))
   {
    obj = method.invoke(conn, args);
    statRef = (Statement)obj;//¼Ç¼Óï¾ä
    return obj;
   }

   //ÅжÏÊÇ·ñµ÷ÓÃÁËcloseµÄ·½·¨£¬Èç¹ûµ÷ÓÃclose·½·¨Ôò°ÑÁ¬½ÓÖÃΪÎÞÓÃ״̬
   if(CLOSE.equals(method.getName()))
   {
    //ÉèÖò»Ê¹ÓñêÖ¾
    setIsFree(false);
    //¼ì²éÊÇ·ñÓкóÐø¹¤×÷£¬Çå³ý¸ÃÁ¬½ÓÎÞÓÃ×ÊÔ´
    if (statRef != null)
     statRef.close();
    if (prestatRef != null)
     prestatRef.close();
    return null;
   }

  • ÕýÈ·±£»¤À಻±»Î¥ÀýʹÓÃ

Ò»¸ö¿¼ÂǾÍÊDz»ÄÜÈÃÓû§Ëæ±ãʹÓôúÀíÀ࣬¶øÖ»ÄÜ×Ô¼ºÊ¹Óã¬Ò»¸ö¾ÍÊÇÓÃÄÚ²¿Ë½ÓÐÀ࣬һ¸ö¾ÍÊÇʹÓÃÖ»ÓÐÖ¸¶¨Àà²ÅÄܵ÷ÓõıêÖ¾¡£ÎÒµÄʵÏÖ¾ÍÊDzÉÓúóÕß¡£

 /**
  * ´´½¨Á¬½ÓµÄ¹¤³§£¬Ö»ÄÜÈù¤³§µ÷ÓÃ
  * @param factory Òªµ÷Óù¤³§£¬²¢ÇÒÒ»¶¨±»ÕýÈ·³õʼ»¯
  * @param param Á¬½Ó²ÎÊý
  * @return Á¬½Ó
  */
 static public _Connection getConnection(ConnectionFactory factory, ConnectionParam param)
 {
  if (factory.isCreate())//ÅжÏÊÇ·ñÕýÈ·³õʼ»¯µÄ¹¤³§
  {
   _Connection _conn = new _Connection(param);
   return _conn;
  }
  else
   return null;
 }
  • ÌṩÁ¼ºÃµÄÓû§½Ó¿Ú£¬¼òµ¥ÊµÓÃ

ʹÓþ²Ì¬·½·¨´´½¨¹¤³§£¬È»ºóÀ´µÃµ½Á¬½Ó£¬Ê¹ÓÃÍêÈ«ºÍÆÕͨµÄConnection·½·¨Ò»Ñù£¬Ã»ÓÐÏÞÖÆ¡£Í¬Ê±ÎªÁË·½±ã£¬ÉèÖÃÁËÁ¬½Ó²ÎÊýÀàºÍ¹¤³§²ÎÊýÀà¡£

  •  ConnectionParam param = new ConnectionParam(driver,url,user,password);
      ConnectionFactory cf = null;//new ConnectionFactory(param, new FactoryParam());
      try{
       cf = new ConnectionFactory(param,new FactoryParam());
       Connection conn1 = cf.getFreeConnection();
       Connection conn2 = cf.getFreeConnection();
       Connection conn3 = cf.getFreeConnection();
       Statement stmt = conn1.createStatement();
       ResultSet rs = stmt.executeQuery("select * from requests");
       if (rs.next())
       {
        System.out.println("conn1 y");  
       }
       else
       {
        System.out.println("conn1 n");  
       } 
       stmt.close();
       conn1.close();  
  • ΪÁËʵÏÖÁ¬½Ó³ØµÄÕý³£ÔË×÷£¬Ê¹ÓÃÁ˵¥Ì¬Ä£

 /**
  * ʹÓÃÖ¸¶¨µÄ²ÎÊý´´½¨Ò»¸öÁ¬½Ó³Ø
  */
 public ConnectionFactory(ConnectionParam param, FactoryParam fparam)
  throws SQLException
 {
  //²»ÔÊÐí²ÎÊýΪ¿Õ
  if ((param == null)||(fparam == null))
   throw new SQLException("ConnectionParamºÍFactoryParam²»ÄÜΪ¿Õ");
  if (m_instance == null)
  {
   synchronized(ConnectionFactory.class){
    if (m_instance == null)
    {
     //new instance
     //²ÎÊý¶¨ÖÆ
     m_instance = new ConnectionFactory();
     m_instance.connparam = param;
     m_instance.MaxConnectionCount = fparam.getMaxConn();
     m_instance.MinConnectionCount = fparam.getMinConn();
     m_instance.ManageType = fparam.getType();
     m_instance.isflag = true;
     //³õʼ»¯£¬´´½¨MinConnectionCount¸öÁ¬½Ó
     System.out.println("connection factory ´´½¨£¡");
     try{
      for (int i=0; i < m_instance.MinConnectionCount; i++)
      {
       _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam);
       if (_conn == null) continue;
       System.out.println("connection´´½¨");
       m_instance.FreeConnectionPool.add(_conn);//¼ÓÈë¿ÕÏÐÁ¬½Ó³Ø
       m_instance.current_conn_count ++;
       //±êÖ¾ÊÇ·ñÖ§³ÖÊÂÎñ
       m_instance.supportTransaction = _conn.isSupportTransaction();    
      }
     }
     catch(Exception e)
     {
      e.printStackTrace();
     }
     //¸ù¾Ý²ßÂÔÅжÏÊÇ·ñÐèÒª²éѯ
     if (m_instance.ManageType != 0)
     {
      Thread t = new Thread(new FactoryMangeThread(m_instance));
      t.start();
     } 
    }
   }
  }
 }
 

  • Á¬½Ó³ØµÄ¹ÜÀí

¶ÔÓÚÁ¬½Ó³ØµÄ¹ÜÀí£¬ÎÒÊÇÉèÏëʹÓþ²Ì¬¹ÜÀíºÍ¶¯Ì¬¹ÜÀíÁ½ÖÖ²ßÂÔ£¬ÉèÖÃÁË×î´óÏÞÖÆ£¬ºÍºã¶¨µÄÁ¬½ÓÊý¡£Ê¹ÓÃÁË2¸ö³Ø£¬Ò»¸ö¿ÕÏгأ¬Ò»¸öʹÓóء£¾²Ì¬¾ÍÊÇʹÓõÄʱºò·¢ÏÖ¿ÕÏÐÁ¬½Ó²»¹»ÔÙÈ¥¼ì²é¡£¶¯Ì¬¾ÍÊÇʹÓÃÁËÒ»¸öÏ̶߳¨Ê±¼ì²é¡£

 //¸ù¾Ý²ßÂÔÅжÏÊÇ·ñÐèÒª²éѯ
     if (m_instance.ManageType != 0)
     {
      Thread t = new Thread(new FactoryMangeThread(m_instance));
      t.start();
     }
 //Á¬½Ó³Øµ÷¶ÈÏß³Ì
public class FactoryMangeThread implements Runnable {
 ConnectionFactory cf = null;
 long delay = 1000;
 public FactoryMangeThread(ConnectionFactory obj)
 {
  cf = obj;
 }
 /* (non-Javadoc)
  * @see java.lang.Runnable#run()
  */
 public void run() {
  while(true){
   try{
    Thread.sleep(delay);
   }
   catch(InterruptedException e){}
   System.out.println("eeeee");
   //ÅжÏÊÇ·ñÒѾ­¹Ø±ÕÁ˹¤³§£¬ÄǾÍÍ˳ö¼àÌý
   if (cf.isCreate())
    cf.schedule();
   else
    System.exit(1);
  }
 }
}

×îºó¸ø³öÍêÕûµÄÔ´´úÂ