Java

±¾ÀàÔĶÁTOP10

¡¤Ê¹ÓÃMyEclipse¿ª·¢Struts¿ò¼ÜµÄHello World!(¼Ïñ1)
¡¤hibernateÅäÖñʼÇ
¡¤AOP±à³ÌÈëÃÅ--Javaƪ
¡¤linuxÏÂTomcat 5.0.20 Óë Apache 2 °²×°/¼¯³É/ÅäÖÃ
¡¤ÔÚwin2003ÏÂÕûºÏÁËÕûºÏTomcat5.5+ apache_2.0.53+ mod_jk_2.0.47.dll
¡¤¹¹½¨LinuxÏÂIDE»·¾³--Eclipseƪ
¡¤Jsp Á¬½Ó mySQL¡¢Oracle Êý¾Ý¿â±¸Íü(Windowsƽ̨)
¡¤ASP¡¢JSP¡¢PHP ÈýÖÖ¼¼Êõ±È½Ï
¡¤Tomcat5.5.9µÄ°²×°ÅäÖÃ
¡¤AWT GUI Éè¼Æ±Ê¼Ç(¶þ)

¡ú ·ÖÀർº½
VCÓïÑÔDelphi
VBÓïÑÔASP
PerlJava
ScriptÊý¾Ý¿â
ÆäËûÓïÑÔÓÎÏ·¿ª·¢
Îļþ¸ñÊ½ÍøÕ¾ÖÆ×÷
Èí¼þ¹¤³Ì.NET¿ª·¢
ʹÓÃJAVAÖеĶ¯Ì¬´úÀíʵÏÖÊý¾Ý¿âÁ¬½Ó³Ø

×÷ÕߣºÎ´Öª À´Ô´£ºÔ¹âÈí¼þÕ¾ ¼ÓÈëʱ¼ä£º2005-2-28¡¡Ô¹âÈí¼þÕ¾

Êý¾Ý¿âÁ¬½Ó³ØÔÚ±àдӦÓ÷þÎñÊǾ­³£ÐèÒªÓõ½µÄÄ£¿é£¬Ì«¹ýƵ·±µÄÁ¬½ÓÊý¾Ý¿â¶Ô·þÎñÐÔÄÜÀ´½²ÊÇÒ»¸öÆ¿¾±£¬Ê¹Óûº³å³Ø¼¼Êõ¿ÉÒÔÀ´Ïû³ýÕâ¸öÆ¿¾±¡£ÎÒÃÇ¿ÉÒÔÔÚ»¥ÁªÍøÉÏÕÒµ½ºÜ¶à¹ØÓÚÊý¾Ý¿âÁ¬½Ó³ØµÄÔ´³ÌÐò£¬µ«ÊǶ¼·¢ÏÖÕâÑùÒ»¸ö¹²Í¬µÄÎÊÌ⣺ÕâЩÁ¬½Ó³ØµÄʵÏÖ·½·¨¶¼²»Í¬³Ì¶ÈµØÔö¼ÓÁËÓëʹÓÃÕßÖ®¼äµÄñîºÏ¶È¡£ºÜ¶àµÄÁ¬½Ó³Ø¶¼ÒªÇóÓû§Í¨¹ýÆä¹æ¶¨µÄ·½·¨»ñÈ¡Êý¾Ý¿âµÄÁ¬½Ó£¬ÕâÒ»µãÎÒÃÇ¿ÉÒÔÀí½â£¬±Ï¾¹Ä¿Ç°ËùÓеÄÓ¦Ó÷þÎñÆ÷È¡Êý¾Ý¿âÁ¬½ÓµÄ·½Ê½¶¼ÊÇÕâÖÖ·½Ê½ÊµÏֵġ£µ«ÊÇÁíÍâÒ»¸ö¹²Í¬µÄÎÊÌâÊÇ£¬ËüÃÇͬʱ²»ÔÊÐíʹÓÃÕßÏÔʽµÄµ÷ÓÃConnection.close()·½·¨£¬¶øÐèÒªÓÃÆä¹æ¶¨µÄÒ»¸ö·½·¨À´¹Ø±ÕÁ¬½Ó¡£ÕâÖÖ×ö·¨ÓÐÁ½¸öȱµã£º

µÚÒ»£º¸Ä±äÁËÓû§Ê¹ÓÃϰ¹ß£¬Ôö¼ÓÁËÓû§µÄʹÓÃÄѶȡ£

Ê×ÏÈÎÒÃÇÀ´¿´¿´Ò»¸öÕý³£µÄÊý¾Ý¿â²Ù×÷¹ý³Ì£º


int executeSQL(String sql) throws SQLException
{
	Connection conn = getConnection();	//ͨ¹ýijÖÖ·½Ê½»ñÈ¡Êý¾Ý¿âÁ¬½Ó
	PreparedStatement ps = null;
	int res = 0;
	try{
		ps = conn.prepareStatement(sql);
		res = ps.executeUpdate();
}finally{
try{
ps.close();
}catch(Exception e){}
try{
	conn.close();//
}catch(Exception e){}
}
return res;
}

ʹÓÃÕßÔÚÓÃÍêÊý¾Ý¿âÁ¬½Óºóͨ³£ÊÇÖ±½Óµ÷ÓÃÁ¬½ÓµÄ·½·¨closeÀ´ÊÍ·ÅÊý¾Ý¿â×ÊÔ´£¬Èç¹ûÓÃÎÒÃÇÇ°ÃæÌáµ½µÄÁ¬½Ó³ØµÄʵÏÖ·½·¨£¬ÄÇÓï¾äconn.close()½«±»Ä³Ð©Ìض¨µÄÓï¾äËùÌæ´ú¡£

µÚ¶þ£ºÊ¹Á¬½Ó³ØÎÞ·¨¶ÔÖ®ÖеÄËùÓÐÁ¬½Ó½øÐжÀÕ¼¿ØÖÆ¡£ÓÉÓÚÁ¬½Ó³Ø²»ÔÊÐíÓû§Ö±½Óµ÷ÓÃÁ¬½ÓµÄclose·½·¨£¬Ò»µ©Ê¹ÓÃÕßÔÚʹÓõĹý³ÌÖÐÓÉÓÚϰ¹ßÎÊÌâÖ±½Ó¹Ø±ÕÁËÊý¾Ý¿âÁ¬½Ó£¬ÄÇôÁ¬½Ó³Ø½«ÎÞ·¨Õý³£Î¬»¤ËùÓÐÁ¬½ÓµÄ״̬£¬¿¼ÂÇÁ¬½Ó³ØºÍÓ¦ÓÃÓɲ»Í¬¿ª·¢ÈËԱʵÏÖʱÕâÖÖÎÊÌâ¸üÈÝÒ׳öÏÖ¡£

×ÛºÏÉÏÃæÌáµ½µÄÁ½¸öÎÊÌ⣬ÎÒÃÇÀ´ÌÖÂÛÒ»ÏÂÈçºÎ½â¾öÕâÁ½¸öÒªÃüµÄÎÊÌâ¡£

Ê×ÏÈÎÒÃÇÏÈÉèÉí´¦µØµÄ¿¼ÂÇÒ»ÏÂÓû§ÊÇÏëÔõôÑùÀ´Ê¹ÓÃÕâ¸öÊý¾Ý¿âÁ¬½Ó³ØµÄ¡£Óû§¿ÉÒÔͨ¹ýÌØ¶¨µÄ·½·¨À´»ñÈ¡Êý¾Ý¿âµÄÁ¬½Ó£¬Í¬Ê±Õâ¸öÁ¬½ÓµÄÀàÐÍÓ¦¸ÃÊDZê×¼µÄjava.sql.Connection¡£Óû§ÔÚ»ñÈ¡µ½Õâ¸öÊý¾Ý¿âÁ¬½Óºó¿ÉÒÔ¶ÔÕâ¸öÁ¬½Ó½øÐÐÈÎÒâµÄ²Ù×÷£¬°üÀ¨¹Ø±ÕÁ¬½ÓµÈ¡£

ͨ¹ý¶ÔÓû§Ê¹ÓõÄÃèÊö£¬ÔõÑù¿ÉÒÔ½Ó¹ÜConnection.close·½·¨¾Í³ÉÁËÎÒÃÇÕâÆªÎÄÕµÄÖ÷Ìâ¡£

ΪÁ˽ӹÜÊý¾Ý¿âÁ¬½ÓµÄclose·½·¨£¬ÎÒÃÇÓ¦¸ÃÓÐÒ»ÖÖÀàËÆÓÚ¹³×ӵĻúÖÆ¡£ÀýÈçÔÚWindows±à³ÌÖÐÎÒÃÇ¿ÉÒÔÀûÓ**ook APIÀ´ÊµÏÖ¶Ôij¸öWindows APIµÄ½Ó¹Ü¡£ÔÚJAVAÖÐͬÑùÒ²ÓÐÕâÑùÒ»¸ö»úÖÆ¡£JAVAÌṩÁËÒ»¸öProxyÀàºÍÒ»¸öInvocationHandler£¬ÕâÁ½¸öÀà¶¼ÔÚjava.lang.reflect°üÖС£ÎÒÃÇÏÈÀ´¿´¿´SUN¹«Ë¾ÌṩµÄÎĵµÊÇÔõôÃèÊöÕâÁ½¸öÀàµÄ¡£


public interface InvocationHandler

InvocationHandler is the interface implemented by the invocation handler of a proxy instance. 

Each proxy instance has an associated invocation handler. 
When a method is invoked on a proxy instance, 
the method invocation is encoded and dispatched to the invoke method of its invocation handler.

SUNµÄAPIÎĵµÖйØÓÚProxyµÄÃèÊöºÜ¶à£¬ÕâÀï¾Í²»ÂÞÁгöÀ´¡£Í¨¹ýÎĵµ¶Ô½Ó¿ÚInvocationHandlerµÄÃèÊöÎÒÃÇ¿ÉÒÔ¿´µ½µ±µ÷ÓÃÒ»¸öProxyʵÀýµÄ·½·¨Ê±»á´¥·¢InvocationhanlderµÄinvoke·½·¨¡£´ÓJAVAµÄÎĵµÖÐÎÒÃÇҲͬʱÁ˽⵽ÕâÖÖ¶¯Ì¬´úÀí»úÖÆÖ»Äܽӹܽӿڵķ½·¨£¬¶ø¶ÔÒ»°ãµÄÀàÎÞЧ£¬¿¼Âǵ½java.sql.Connection±¾ÉíÒ²ÊÇÒ»¸ö½Ó¿ÚÓɴ˾ÍÕÒµ½Á˽â¾öÈçºÎ½Ó¹Üclose·½·¨µÄ³ö·¡£

Ê×ÏÈ£¬ÎÒÃÇÏȶ¨ÒåÒ»¸öÊý¾Ý¿âÁ¬½Ó³Ø²ÎÊýµÄÀ࣬¶¨ÒåÁËÊý¾Ý¿âµÄJDBCÇý¶¯³ÌÐòÀàÃû£¬Á¬½ÓµÄURLÒÔ¼°Óû§Ãû¿ÚÁîµÈµÈһЩÐÅÏ¢£¬¸ÃÀàÊÇÓÃÓÚ³õʼ»¯Á¬½Ó³ØµÄ²ÎÊý£¬¾ßÌ嶨ÒåÈçÏ£º


public class ConnectionParam implements Serializable
{
	private String driver;				//Êý¾Ý¿âÇý¶¯³ÌÐò
	private String url;					//Êý¾ÝÁ¬½ÓµÄURL
	private String user;					//Êý¾Ý¿âÓû§Ãû
	private String password;				//Êý¾Ý¿âÃÜÂë
	private int minConnection = 0;		//³õʼ»¯Á¬½ÓÊý
	private int maxConnection = 50;		//×î´óÁ¬½ÓÊý
	private long timeoutValue = 600000;//Á¬½ÓµÄ×î´ó¿ÕÏÐʱ¼ä
	private long waitTime = 30000;		//È¡Á¬½ÓµÄʱºòÈç¹ûûÓпÉÓÃÁ¬½Ó×î´óµÄµÈ´ýʱ¼ä

Æä´ÎÊÇÁ¬½Ó³ØµÄ¹¤³§ÀàConnectionFactory£¬Í¨¹ý¸ÃÀàÀ´½«Ò»¸öÁ¬½Ó³Ø¶ÔÏóÓëÒ»¸öÃû³Æ¶ÔÓ¦ÆðÀ´£¬Ê¹ÓÃÕßͨ¹ý¸ÃÃû³Æ¾Í¿ÉÒÔ»ñȡָ¶¨µÄÁ¬½Ó³Ø¶ÔÏ󣬾ßÌå´úÂëÈçÏ£º


/**
 * Á¬½Ó³ØÀà³§£¬¸ÃÀà³£ÓÃÀ´±£´æ¶à¸öÊý¾ÝÔ´Ãû³ÆºÏÊý¾Ý¿âÁ¬½Ó³Ø¶ÔÓ¦µÄ¹þÏ£
 * @author liusoft
 */
public class ConnectionFactory
{
	//¸Ã¹þÏ£±íÓÃÀ´±£´æÊý¾ÝÔ´ÃûºÍÁ¬½Ó³Ø¶ÔÏóµÄ¹ØÏµ±í
	static Hashtable connectionPools = null;
	static{
		connectionPools = new Hashtable(2,0.75F);
	} 
	/**
	 * ´ÓÁ¬½Ó³Ø¹¤³§Öлñȡָ¶¨Ãû³Æ¶ÔÓ¦µÄÁ¬½Ó³Ø¶ÔÏó
	 * @param dataSource	Á¬½Ó³Ø¶ÔÏó¶ÔÓ¦µÄÃû³Æ
	 * @return DataSource	·µ»ØÃû³Æ¶ÔÓ¦µÄÁ¬½Ó³Ø¶ÔÏó
	 * @throws NameNotFoundException	ÎÞ·¨ÕÒµ½Ö¸¶¨µÄÁ¬½Ó³Ø
	 */
	public static DataSource lookup(String dataSource) 
		throws NameNotFoundException
	{
		Object ds = null;
		ds = connectionPools.get(dataSource);
		if(ds == null || !(ds instanceof DataSource))
			throw new NameNotFoundException(dataSource);
		return (DataSource)ds;
	}

	/**
	 * ½«Ö¸¶¨µÄÃû×ÖºÍÊý¾Ý¿âÁ¬½ÓÅäÖðó¶¨ÔÚÒ»Æð²¢³õʼ»¯Êý¾Ý¿âÁ¬½Ó³Ø
	 * @param name		¶ÔÓ¦Á¬½Ó³ØµÄÃû³Æ
	 * @param param	Á¬½Ó³ØµÄÅäÖòÎÊý£¬¾ßÌåÇë¼ûÀàConnectionParam
	 * @return DataSource	Èç¹û°ó¶¨³É¹¦ºó·µ»ØÁ¬½Ó³Ø¶ÔÏó
	 * @throws NameAlreadyBoundException	Ò»¶¨Ãû×ÖnameÒѾ­°ó¶¨ÔòÅ׳ö¸ÃÒì³£
	 * @throws ClassNotFoundException		ÎÞ·¨ÕÒµ½Á¬½Ó³ØµÄÅäÖÃÖеÄÇý¶¯³ÌÐòÀà
	 * @throws IllegalAccessException		Á¬½Ó³ØÅäÖÃÖеÄÇý¶¯³ÌÐòÀàÓÐÎó
	 * @throws InstantiationException		ÎÞ·¨ÊµÀý»¯Çý¶¯³ÌÐòÀà
	 * @throws SQLException				ÎÞ·¨Õý³£Á¬½ÓÖ¸¶¨µÄÊý¾Ý¿â
	 */
	public static DataSource bind(String name, ConnectionParam param)
		throws NameAlreadyBoundException,ClassNotFoundException,
				IllegalAccessException,InstantiationException,SQLException
	{
		DataSourceImpl source = null;
		try{
			lookup(name);
			throw new NameAlreadyBoundException(name);
		}catch(NameNotFoundException e){
			source = new DataSourceImpl(param);
			source.initConnection();
			connectionPools.put(name, source);
		}
		return source;
	}
	/**
	 * ÖØÐ°ó¶¨Êý¾Ý¿âÁ¬½Ó³Ø
	 * @param name		¶ÔÓ¦Á¬½Ó³ØµÄÃû³Æ
	 * @param param	Á¬½Ó³ØµÄÅäÖòÎÊý£¬¾ßÌåÇë¼ûÀàConnectionParam
	 * @return DataSource	Èç¹û°ó¶¨³É¹¦ºó·µ»ØÁ¬½Ó³Ø¶ÔÏó
	 * @throws NameAlreadyBoundException	Ò»¶¨Ãû×ÖnameÒѾ­°ó¶¨ÔòÅ׳ö¸ÃÒì³£
	 * @throws ClassNotFoundException		ÎÞ·¨ÕÒµ½Á¬½Ó³ØµÄÅäÖÃÖеÄÇý¶¯³ÌÐòÀà
	 * @throws IllegalAccessException		Á¬½Ó³ØÅäÖÃÖеÄÇý¶¯³ÌÐòÀàÓÐÎó
	 * @throws InstantiationException		ÎÞ·¨ÊµÀý»¯Çý¶¯³ÌÐòÀà
	 * @throws SQLException				ÎÞ·¨Õý³£Á¬½ÓÖ¸¶¨µÄÊý¾Ý¿â
	 */
	public static DataSource rebind(String name, ConnectionParam param)
		throws NameAlreadyBoundException,ClassNotFoundException,
				IllegalAccessException,InstantiationException,SQLException
	{
		try{
			unbind(name);
		}catch(Exception e){}
		return bind(name, param);
	}
	/**
	 * ɾ³ýÒ»¸öÊý¾Ý¿âÁ¬½Ó³Ø¶ÔÏó
	 * @param name
	 * @throws NameNotFoundException
	 */
	public static void unbind(String name) throws NameNotFoundException
	{
		DataSource dataSource = lookup(name);
		if(dataSource instanceof DataSourceImpl){
			DataSourceImpl dsi = (DataSourceImpl)dataSource;
			try{
				dsi.stop();
				dsi.close();
			}catch(Exception e){
			}finally{
				dsi = null;
			}
		}
		connectionPools.remove(name);
	}
	
}

ConnectionFactoryÖ÷ÒªÌṩÁËÓû§½«½«Á¬½Ó³Ø°ó¶¨µ½Ò»¸ö¾ßÌåµÄÃû³ÆÉÏÒÔ¼°È¡Ïû°ó¶¨µÄ²Ù×÷¡£Ê¹ÓÃÕßÖ»ÐèÒª¹ØÐÄÕâÁ½¸öÀ༴¿ÉʹÓÃÊý¾Ý¿âÁ¬½Ó³ØµÄ¹¦ÄÜ¡£ÏÂÃæÎÒÃǸø³öÒ»¶ÎÈçºÎʹÓÃÁ¬½Ó³ØµÄ´úÂ룺


	String name = "pool";
	String driver = " sun.jdbc.odbc.JdbcOdbcDriver ";
	String url = "jdbc:odbc:datasource";
	ConnectionParam param = new ConnectionParam(driver,url,null,null);
	param.setMinConnection(1);
	param.setMaxConnection(5);
	param.setTimeoutValue(20000);
	ConnectionFactory.bind(name, param);
	System.out.println("bind datasource ok.");
	//ÒÔÉÏ´úÂëÊÇÓÃÀ´µÇ¼ÇÒ»¸öÁ¬½Ó³Ø¶ÔÏ󣬸òÙ×÷¿ÉÒÔÔÚ³ÌÐò³õʼ»¯Ö»×öÒ»´Î¼´¿É
	//ÒÔÏ¿ªÊ¼¾ÍÊÇʹÓÃÕßÕæÕýÐèҪдµÄ´úÂë
	DataSource ds = ConnectionFactory.lookup(name);
	try{
		for(int i=0;i<10;i++){
			Connection conn = ds.getConnection();
			try{
				testSQL(conn, sql);
			}finally{
				try{
					conn.close();
				}catch(Exception e){}
			}
		}
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		ConnectionFactory.unbind(name);
		System.out.println("unbind datasource ok.");
		System.exit(0);
	}

´ÓʹÓÃÕßµÄʾÀý´úÂë¾Í¿ÉÒÔ¿´³ö£¬ÎÒÃÇÒѾ­½â¾öÁ˳£¹æÁ¬½Ó³Ø²úÉúµÄÁ½¸öÎÊÌâ¡£µ«ÊÇÎÒÃÇ×î×î¹ØÐĵÄÊÇÈçºÎ½â¾ö½Ó¹Üclose·½·¨µÄ°ì·¨¡£½Ó¹Ü¹¤×÷Ö÷ÒªÔÚConnectionFactoryÖеÄÁ½¾ä´úÂ룺


source = new DataSourceImpl(param);
source.initConnection();

DataSourceImplÊÇÒ»¸öʵÏÖÁ˽ӿÚjavax.sql.DataSourceµÄÀ࣬¸ÃÀàά»¤×ÅÒ»¸öÁ¬½Ó³ØµÄ¶ÔÏó¡£ÓÉÓÚ¸ÃÀàÊÇÒ»¸öÊܱ£»¤µÄÀ࣬Òò´ËËü±©Â¶¸øÊ¹ÓÃÕߵķ½·¨Ö»ÓнӿÚDataSourceÖж¨ÒåµÄ·½·¨£¬ÆäËûµÄËùÓз½·¨¶ÔʹÓÃÕßÀ´Ëµ¶¼ÊDz»¿ÉÊӵġ£ÎÒÃÇÏÈÀ´¹ØÐÄÓû§¿É·ÃÎʵÄÒ»¸ö·½·¨getConnection


/**
 * @see javax.sql.DataSource#getConnection(String,String)
 */
	public Connection getConnection(String user, String password) throws SQLException 
	{
		//Ê×ÏÈ´ÓÁ¬½Ó³ØÖÐÕÒ³ö¿ÕÏеĶÔÏó
		Connection conn = getFreeConnection(0);
		if(conn == null){
			//ÅжÏÊÇ·ñ³¬¹ý×î´óÁ¬½ÓÊý,Èç¹û³¬¹ý×î´óÁ¬½ÓÊý
			//ÔòµÈ´ýÒ»¶¨Ê±¼ä²é¿´ÊÇ·ñÓпÕÏÐÁ¬½Ó,·ñÔòÅ׳öÒì³£¸æËßÓû§ÎÞ¿ÉÓÃÁ¬½Ó
			if(getConnectionCount() >= connParam.getMaxConnection())
				conn = getFreeConnection(connParam.getWaitTime());
			else{//ûÓг¬¹ýÁ¬½ÓÊý£¬ÖØÐ»ñȡһ¸öÊý¾Ý¿âµÄÁ¬½Ó
				connParam.setUser(user);
				connParam.setPassword(password);
				Connection conn2 = DriverManager.getConnection(connParam.getUrl(), 
				user, password);
				//´úÀí½«Òª·µ»ØµÄÁ¬½Ó¶ÔÏó
				_Connection _conn = new _Connection(conn2,true);
				synchronized(conns){
					conns.add(_conn);
				}
				conn = _conn.getConnection();
			}
		}
		return conn;
	}
	/**
	 * ´ÓÁ¬½Ó³ØÖÐȡһ¸ö¿ÕÏеÄÁ¬½Ó
	 * @param nTimeout	Èç¹û¸Ã²ÎÊýֵΪ0ÔòûÓÐÁ¬½ÓʱֻÊÇ·µ»ØÒ»¸önull
	 * ·ñÔòµÄ»°µÈ´ýnTimeoutºÁÃë¿´ÊÇ·ñ»¹ÓпÕÏÐÁ¬½Ó£¬Èç¹ûûÓÐÅ׳öÒì³£
	 * @return Connection
	 * @throws SQLException
	 */
	protected synchronized Connection getFreeConnection(long nTimeout) 
		throws SQLException
	{
		Connection conn = null;
		Iterator iter = conns.iterator();
		while(iter.hasNext()){
			_Connection _conn = (_Connection)iter.next();
			if(!_conn.isInUse()){
				conn = _conn.getConnection();
				_conn.setInUse(true);				
				break;
			}
		}
		if(conn == null && nTimeout > 0){
			//µÈ´ýnTimeoutºÁÃëÒԱ㿴ÊÇ·ñÓпÕÏÐÁ¬½Ó
			try{
				Thread.sleep(nTimeout);
			}catch(Exception e){}
			conn = getFreeConnection(0);
			if(conn == null)
				throw new SQLException("ûÓпÉÓõÄÊý¾Ý¿âÁ¬½Ó");
		}
		return conn;
	}

DataSourceImplÀàÖÐʵÏÖgetConnection·½·¨µÄ¸úÕý³£µÄÊý¾Ý¿âÁ¬½Ó³ØµÄÂß¼­ÊÇÒ»Öµģ¬Ê×ÏÈÅжÏÊÇ·ñÓпÕÏеÄÁ¬½Ó£¬Èç¹ûûÓеϰÅжÏÁ¬½ÓÊýÊÇ·ñÒѾ­³¬¹ý×î´óÁ¬½ÓÊýµÈµÈµÄһЩÂß¼­¡£µ«ÊÇÓÐÒ»µã²»Í¬µÄÊÇͨ¹ýDriverManagerµÃµ½µÄÊý¾Ý¿âÁ¬½Ó²¢²»ÊǼ°Ê±·µ»ØµÄ£¬¶øÊÇͨ¹ýÒ»¸ö½Ð_ConnectionµÄÀàÖнéһϣ¬È»ºóµ÷ÓÃ_Connection.getConnection·µ»ØµÄ¡£Èç¹ûÎÒÃÇûÓÐͨ¹ýÒ»¸öÖнéÒ²¾ÍÊÇJAVAÖеÄProxyÀ´½Ó¹ÜÒª·µ»ØµÄ½Ó¿Ú¶ÔÏó£¬ÄÇôÎÒÃǾÍûÓа취½Ø×¡Connection.close·½·¨¡£

ÖÕÓÚµ½Á˺ËÐÄËùÔÚ£¬ÎÒÃÇÏÈÀ´¿´¿´_ConnectionÊÇÈçºÎʵÏֵģ¬È»ºóÔÙ½éÉÜÊǿͻ§¶Ëµ÷ÓÃConnection.close·½·¨Ê±×ßµÄÊÇÔõÑùÒ»¸öÁ÷³Ì£¬ÎªÊ²Ã´²¢Ã»ÓÐÕæÕýµÄ¹Ø±ÕÁ¬½Ó¡£


/**
 * Êý¾ÝÁ¬½ÓµÄ×Ô·â×°£¬ÆÁ±ÎÁËclose·½·¨
 * @author Liudong
 */
class _Connection implements InvocationHandler
{
	private final static String CLOSE_METHOD_NAME = "close";
	private Connection conn = null;
	//Êý¾Ý¿âµÄæ״̬
	private boolean inUse = false;
	//Óû§×îºóÒ»´Î·ÃÎʸÃÁ¬½Ó·½·¨µÄʱ¼ä
	private long lastAccessTime = System.currentTimeMillis();
	
	_Connection(Connection conn, boolean inUse){
		this.conn = conn;
		this.inUse = inUse;
	}
	/**
	 * Returns the conn.
	 * @return Connection
	 */
	public Connection getConnection() {
		//·µ»ØÊý¾Ý¿âÁ¬½Ó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();
	}
	/**
	 * Returns the inUse.
	 * @return boolean
	 */
	public boolean isInUse() {
		return inUse;
	}

	/**
	 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
	 */
	public Object invoke(Object proxy, Method m, Object[] args) 
		throws Throwable 
	{
		Object obj = null;
		//ÅжÏÊÇ·ñµ÷ÓÃÁËcloseµÄ·½·¨£¬Èç¹ûµ÷ÓÃclose·½·¨Ôò°ÑÁ¬½ÓÖÃΪÎÞÓÃ״̬
		if(CLOSE_METHOD_NAME.equals(m.getName()))
			setInUse(false);		
		else
			obj = m.invoke(conn, args);	
		//ÉèÖÃ×îºóÒ»´Î·ÃÎÊʱ¼ä£¬ÒԱ㼰ʱÇå³ý³¬Ê±µÄÁ¬½Ó
		lastAccessTime = System.currentTimeMillis();
		return obj;
	}
		
	/**
	 * Returns the lastAccessTime.
	 * @return long
	 */
	public long getLastAccessTime() {
		return lastAccessTime;
	}

	/**
	 * Sets the inUse.
	 * @param inUse The inUse to set
	 */
	public void setInUse(boolean inUse) {
		this.inUse = inUse;
	}
}

Ò»µ©Ê¹ÓÃÕßµ÷ÓÃËùµÃµ½Á¬½ÓµÄclose·½·¨£¬ÓÉÓÚÓû§µÄÁ¬½Ó¶ÔÏóÊǾ­¹ý½Ó¹ÜºóµÄ¶ÔÏó£¬Òò´ËJAVAÐéÄâ»ú»áÊ×Ïȵ÷ÓÃ_Connection.invoke·½·¨£¬Ôڸ÷½·¨ÖÐÊ×ÏÈÅжÏÊÇ·ñΪclose·½·¨£¬Èç¹û²»ÊÇÔò½«´úÂëת¸øÕæÕýµÄûÓб»½Ó¹ÜµÄÁ¬½Ó¶ÔÏóconn¡£·ñÔòµÄ»°Ö»ÊǼòµ¥µÄ½«¸ÃÁ¬½ÓµÄ״̬ÉèÖÃΪ¿ÉÓᣵ½´ËÄú¿ÉÄܾÍÃ÷°×ÁËÕû¸ö½Ó¹ÜµÄ¹ý³Ì£¬µ«ÊÇͬʱҲÓÐÒ»¸öÒÉÎÊ£ºÕâÑùµÄ»°ÊDz»ÊÇÕâЩÒѽ¨Á¢µÄÁ¬½Ó¾ÍʼÖÕûÓÐ°ì·¨ÕæÕý¹Ø±Õ£¿´ð°¸ÊÇ¿ÉÒԵġ£ÎÒÃÇÀ´¿´¿´ConnectionFactory.unbind·½·¨£¬¸Ã·½·¨Ê×ÏÈÕÒµ½Ãû×Ö¶ÔÓ¦µÄÁ¬½Ó³Ø¶ÔÏó£¬È»ºó¹Ø±Õ¸ÃÁ¬½Ó³ØÖеÄËùÓÐÁ¬½Ó²¢É¾³ýµôÁ¬½Ó³Ø¡£ÔÚDataSourceImplÀàÖж¨ÒåÁËÒ»¸öclose·½·¨ÓÃÀ´¹Ø±ÕËùÓеÄÁ¬½Ó£¬Ïêϸ´úÂëÈçÏ£º


	/**
	 * ¹Ø±Õ¸ÃÁ¬½Ó³ØÖеÄËùÓÐÊý¾Ý¿âÁ¬½Ó
	 * @return int ·µ»Ø±»¹Ø±ÕÁ¬½ÓµÄ¸öÊý
	 * @throws SQLException
	 */
	public int close() throws SQLException
	{
		int cc = 0;
		SQLException excp = null;
		Iterator iter = conns.iterator();
		while(iter.hasNext()){
			try{
				((_Connection)iter.next()).close();
				cc ++;
			}catch(Exception e){
				if(e instanceof SQLException)
					excp = (SQLException)e;
			}
		}
		if(excp != null)
			throw excp;
		return cc;
	}

¸Ã·½·¨Ò»Ò»µ÷ÓÃÁ¬½Ó³ØÖÐÿ¸ö¶ÔÏóµÄclose·½·¨£¬Õâ¸öclose·½·¨¶ÔÓ¦µÄÊÇ_ConnectionÖжÔcloseµÄʵÏÖ£¬ÔÚ_Connection¶¨ÒåÖйرÕÊý¾Ý¿âÁ¬½ÓµÄʱºòÊÇÖ±½Óµ÷ÓÃûÓо­¹ý½Ó¹ÜµÄ¶ÔÏóµÄ¹Ø±Õ·½·¨£¬Òò´Ë¸Ãclose·½·¨ÕæÕýµÄÊÍ·ÅÁËÊý¾Ý¿â×ÊÔ´¡£

ÒÔÉÏÎÄ×ÖÖ»ÊÇÃèÊöÁ˽ӿڷ½·¨µÄ½Ó¹Ü£¬¾ßÌåÒ»¸öʵÓõÄÁ¬½Ó³ØÄ£¿é»¹ÐèÒª¶Ô¿ÕÏÐÁ¬½ÓµÄ¼à¿Ø²¢¼°Ê±ÊÍ·ÅÁ¬½Ó£¬ÏêϸµÄ´úÂëÇë²ÎÕÕ¸½¼þ¡£




Ïà¹ØÎÄÕ£º

Ïà¹ØÈí¼þ£º