Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
C#Êý¾Ý¿âÁ¬½Ó³Ø
 
  2924  次浏览      27
 2018-2-1 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄͨ¹ý¾ÙÀý£¬½éÉÜÁËÈçºÎΪÄãµÄÀà¿âÌí¼ÓÔ­Éúͬ²½Ö§³Ö²¢Îªµ÷ÓÃÀà¿âµÄ¿ª·¢ÈËÔ±ÌṩÊÇ·ñʹÓÃͬ²½µÄÑ¡Ïî¡£

ʹÓÃC#Êý¾Ý¿âÁ¬½Ó³Ø

Á¬½Óµ½Êý¾Ý¿â·þÎñÆ÷ͨ³£Óɼ¸¸öÐèÒªÈí³¤Ê±¼äµÄ²½Öè×é³É¡£±ØÐ뽨Á¢ÎïÀíͨµÀ£¨ÀýÈçÌ×½Ó×Ö»òÃüÃû¹ÜµÀ£©£¬±ØÐëÓë·þÎñÆ÷½øÐгõ´ÎÁ¬½Ó£¬±ØÐë·ÖÎöÁ¬½Ó×Ö·û´®ÐÅÏ¢£¬±ØÐëÓÉ·þÎñÆ÷¶ÔÁ¬½Ó½øÐÐÉí·ÝÑéÖ¤£¬µÈµÈ¡£

ʵ¼ÊÉÏ£¬´ó²¿·ÝµÄÓ¦ÓóÌÐò¶¼ÊÇʹÓÃÒ»¸ö»ò¼¸¸ö²»Í¬µÄÁ¬½ÓÅäÖᣵ±Ó¦ÓóÌÐòµÄÊý¾ÝÁ¿ºÍ·ÃÎÊÁ¿´óµÄʱºò£¬ÕâÒâζ×ÅÔÚÔËÐÐÓ¦ÓóÌÐòµÄ¹ý³ÌÖУ¬Ðí¶àÏàͬµÄÁ¬½Ó½«·´¸´µØ±»´ò¿ªºÍ¹Ø±Õ£¬´Ó¶ø»áÒýÆðÊý¾Ý¿â·þÎñÆ÷ЧÂʵÍÏÂÉõÖÁÒý·¢³ÌÐò±ÀÀ£¡£ÎªÁËÈ·±£Ó¦ÓóÌÐòµÄÎȶ¨ºÍ½µµÍÐÔÄܳɱ¾£¬ÎÒÃÇ¿ÉÒÔÔÚADO.NETÖÐʹÓóÆÎªÁ¬½Ó³ØµÄÓÅ»¯·½·¨À´¹ÜÀíά»¤Á¬½Ó¡£

C#Êý¾Ý¿âÁ¬½Ó³Ø¿ÉÒÔ¼õÉÙ´´½¨Á¬½ÓµÄ´ÎÊý¡£¶¨Òå×îСÁ¬½ÓÊý£¨¹Ì¶¨Á¬½ÓÊý£©£¬µ±Óû§ÔÚÁ¬½ÓÉϵ÷ÓÃOpen£¬Á¬½Ó³Ø¾Í»á¼ì²é³ØÖÐÊÇ·ñÓпÉÓõÄÁ¬½Ó¡£Èç¹û·¢ÏÖÓÐÁ¬½Ó¿ÉÓ㬻Ὣ¸ÃÁ¬½Ó·µ»Ø¸øµ÷ÓÃÕߣ¬¶ø²»ÊÇ´´½¨ÐÂÁ¬½Ó¡£Ó¦ÓóÌÐòÔÚ¸ÃÁ¬½ÓÉϵ÷ÓÃCloseʱ£¬Á¬½Ó³Ø»áÅжϸÃÁ¬½ÓÊÇ·ñÔÚ×îСÁ¬½ÓÊýÖ®ÄÚ£¬Èç¹û¡°ÊÇ¡±»á½«Á¬½Ó»ØÊÕµ½»î¶¯Á¬½Ó³ØÖжø²»ÊÇÕæÕý¹Ø±ÕÁ¬½Ó£¬·ñÔò½«ÉÕ»ÙÁ¬½Ó¡£Á¬½Ó·µ»Øµ½³ØÖÐÖ®ºó£¬¼´¿ÉÔÚÏÂÒ»¸öOpenµ÷ÓÃÖÐÖØ¸´Ê¹Óá£

´´½¨C#Êý¾Ý¿âÁ¬½Ó³Ø

ÒÔÏÂʾÀýʹÓÃC#Á¬½ÓSQLÊý¾Ý¿â£º

class DbConn
{
//usingSystem.Data;
//usingSystem.Data.SqlClient;
private const int MaxPool=10;//×î´óÁ¬½ÓÊý
private const int MinPool=5;//×îСÁ¬½ÓÊý
private const bool Asyn_Process=true;//ÉèÖÃÒì²½·ÃÎÊÊý¾Ý¿â
//ÔÚµ¥¸öÁ¬½ÓÉϵõ½ºÍ¹ÜÀí¶à¸ö¡¢½öÏòǰÒýÓúÍÖ»¶ÁµÄ½á¹û¼¯(ADO.NET2.0)
private const bool Mars=true;
private const int Conn_Timeout=15;//ÉèÖÃÁ¬½ÓµÈ´ýʱ¼ä
private const int Conn_Lifetime=15;//ÉèÖÃÁ¬½ÓµÄÉúÃüÖÜÆÚ
private string ConnString="";//Á¬½Ó×Ö·û´®
private SqlConnection SqlDrConn=null;//Á¬½Ó¶ÔÏó
public DbConn()//¹¹Ô캯Êý
{
ConnString=GetConnString();
SqlDrConn=new SqlConnection(ConnString);
}
private string GetConnString()
{
return"server=localhost;"
+"integratedsecurity=sspi;"
+"database=pubs;"
+"MaxPoolSize="+MaxPool+";"
+"MinPoolSize="+MinPool+";"
+"ConnectTimeout="+Conn_Timeout+";"
+"ConnectionLifetime="+Conn_Lifetime+";"
+"AsynchronousProcessing="+Asyn_Process+";";
//+"MultipleActiveResultSets="+Mars+";";
}
public DataTable GetDataReader(string StrSql)//Êý¾Ý²éѯ
{
//µ±Á¬½Ó´¦ÓÚ´ò¿ª×´Ì¬Ê±¹Ø±Õ,È»ºóÔÙ´ò¿ª,±ÜÃâÓÐʱºòÊý¾Ý²»Äܼ°Ê±¸üÐÂ
if(SqlDrConn.State==ConnectionState.Open)
{
SqlDrConn.Close();
}
try
{
SqlDrConn.Open();
SqlCommandSql Cmd=new SqlCommand(StrSql,SqlDrConn);
SqlDataReader SqlDr=SqlCmd.ExecuteReader();
if(SqlDr.HasRows)
{
DataTable dt=new DataTable();
//¶ÁÈ¡SqlDataReaderÀïµÄÄÚÈÝ
dt.Load(SqlDr);
//¹Ø±Õ¶ÔÏóºÍÁ¬½Ó
SqlDr.Close();
SqlDrConn.Close();
returndt;
}
returnnull;
}
catch(Exception ex)
{
System.Windows.Forms.MessageBox.Show(ex.Message);
return null;
}
finally
{
SqlDrConn.Close();
}
}
}

ͨ¹ýµ÷ÓÃSqlDrConn.Open()·½·¨´ò¿ªÁ¬½Ó£¬ÕâʱºòÁ¬½Ó³Ø¾Í»á³õʼ»¯²¢½¨Á¢É趨µÄ×îСÁ¬½ÓÊý¡£Ïë¸üÇå³þÁ˽⵽Á¬½Ó³ØµÄ×´¿ö¿ÉÒÔͨ¹ýSQLµÄ²éѯ·ÖÎöÆ÷Ö´Ðд洢¹ý³Ìsp_Who£¬Ëü»áÁгöµ±Ç°µÄÊý¾Ý¿â½ø³Ì,²é¿´loginname¡¢dbname¿ÉÒÔÇø·ÖÓû§µÄÁ¬½ÓÐÅÏ¢£¬µ«Òª×¢ÒâµÄÊǵǼ²éѯ·ÖÎöÆ÷±¾Éí»áʹÓÃÁ½¸öÁ¬½Ó£¬ËùÒÔ×îºÃÓÃÁíÒ»¸öÓû§ÃûµÇ¼²éѯ·ÖÎöÆ÷¡£Ê¹Óô˷½·¨»¹ÓÐÒ»¸öÂé·³µØ·½¾ÍÊÇÒª¾­³£°´¡°Ö´Ðвéѯ¡±ÒÔ¸üнø³ÌÐÅÏ¢¡£»¹ÓÐÁíÒ»ÖÖ·½·¨¸öÈËÈÏΪ½ÏºÃµÄ£¬Í¨¹ý¿ØÖÆÃæ°å¡ú¹ÜÀí¹¤¾ß¡úÐÔÄÜ£¬ÓÒ»÷Ìí¼Ó¼ÆËãÆ÷£¬ÐÔÄܶÔÏóÑ¡ÔñSQlServer£ºGeneralStatistics£¨³£¹æÍ³¼Æ£©È»ºó¼ÆËãÆ÷Ñ¡ÔñUserConnections£¨Óû§Á¬½Ó£©×îºó°´¡°Ìí¼Ó¡±¾Í¿ÉÒÔʵʱ²é¿´µ±Ç°Á¬½ÓÊý¡£

µ½ÁËÕâÀÁ¬½Ó³ØÒѾ­ÊµÏÖÁË£¬µ«ÎÊÌâÍùÍù»á³öÏÖÔÚÔËÐйý³ÌÖС£ÈçÁ¬½Ó³ØµÄÁ¬½ÓÊýÂúÁ˸ÃÔõÑù´¦Àí£¿ÔÚÕâÀïÎÒÃÇÓ¦¸ÃºÏÀíÉèÖÃÁ¬½Ó×Ö·û´®ÖеÄConnectTimeoutÊôÐÔºÍConnectionLifetimeÊôÐÔ£¨ÉÏÃæÓнâÊÍ£©ÑÓ³¤µÈ´ýʱ¼ä£¬¾¡¿ÉÄܵØÔÚÿ´ÎʹÓÃÍêÁ¬½ÓÖ®ºóµ÷ÓÃClose·½·¨¹Ø±ÕÁ¬½Ó¡£µ«´ÓÖÐÒ²ÓÐû·¨±ÜÃâµÄ£¬µ±Á¬½ÓÊýÂúÁ˲¢ÇÒÉêÇëÁ¬½ÓµÄʱ¼ä³¬¹ýÉèÖÃÁ¬½ÓµÈ´ýµÄʱ¼äʱ£¬³ÌÐò½«»áÒý·¢InvalidOperationExceptioÒì³££¬ÎÒÃÇ¿ÉÒÔͨ¹ý²¶»ñ´ËÒì³£ÏòÓû§½çÃæÌáʾ¡°ÏµÍ³Õý棬ÇëÉÔºóÔÙÁ¬½Ó¡­¡­¡±Ö®ÀàµÄÐÅÏ¢À´»º½âÕâÖÖÇé¿ö¡£´ËÍ⣬ҲÓÐÁíÒ»ÖÖ·½·¨À´½â¾öÕâÖÖÇé¿ö£¬¾ÍÊÇÀûÓÃADO.NET2.0ÐÂÌØÐÔ¡°Òì²½½ø³Ì¡±£¬¶ÔÊý¾Ý¿â½øÐÐÒì²½²Ù×÷£¬È·±£Á¬½ÓÄܹ»¼°Ê±µ÷ÓÃClose·½·¨¹Ø±ÕÁ¬½Ó£¬ÕâÑùÄÜ´ó´ó¼õÉÙÕýÔÚʹÓõÄÁ¬½ÓÊý¡£

ʹÓ÷½·¨£ºÔÚÁ¬½Ó×Ö·û´®ÖмÓÉÏAsynchronousProcessing=true±íʾʹÓÃÒì²½´¦Àí²Ù×÷¡£

µ±Ó¦ÓóÌÐò²»ÔÙÐèÒªÓõ½Á¬½Ó³ØµÄʱºò¿ÉÒÔʹÓÃClearPool»òClearAllPools·½·¨Çå¿ÕÁ¬½Ó³ØÒ²¿É×÷ÖØÖÃÁ¬½Ó³ØÊ¹Ó㬷½·¨ÈçÏ£º

SqlConnection.ClearPool(SqlConnection connection)Çå¿Õ¹ØÁªµÄÁ¬½Ó³Ø

SqlConnection.ClearAllPools()Çå¿ÕËùÓÐÁ¬½Ó³Ø

µ÷ÓÃÉÏÊö·½·¨£¬Èç¹ûÁ¬½ÓÕýÔÚʹÓã¬Á¬½Ó³Ø»á×öÏàÓ¦±ê¼Ç£¬µÈÁ¬½Ó¹Ø±Õʱ×Ô¶¯ÉÕ»Ù¡£

С½áC#Êý¾Ý¿âÁ¬½Ó³Ø

Óŵ㣺µ±Êý¾Ý¿â²Ù×÷ºÍ·ÃÎÊÆµ·±µÄʱºò£¬¼õÉÙ´´½¨Á¬½ÓºÍ´ò¿ªÁ¬½ÓËùºÄµÄʱ¼ä£¬ÌáÉýÊý¾Ý¿â·þÎñÆ÷µÄÐÔÄÜ¡£

ȱµã£ºÊý¾Ý¿âÁ¬½Ó³ØÖпÉÄÜ´æÔÚ×Ŷà¸öûÓб»Ê¹ÓõÄÁ¬½ÓÒ»Ö±Á¬½Ó×ÅÊý¾Ý¿â£¬ÕâÒâζ×Å×ÊÔ´µÄÀË·Ñ¡£

ÔÚÆóÒµ¼¶Èí¼þ¿ª·¢¹ý³ÌÖУ¬ÎªÁ˸ÄÉÆÓ¦ÓóÌÐòµÄÐÔÄÜÐèҪͨ³£Ê¹ÓöÔÏó³ØÀ´¿ØÖƶÔÏóµÄʵÀý»¯¡£ÀýÈ磬ÔÚÎÒÃÇÿ´ÎÐèÒªÁ¬½ÓÒ»¸öÊý¾Ý¿âʱ¶¼ÐèÒª´´½¨Ò»¸öÊý¾Ý¿âÁ¬½Ó£¬¶øÊý¾Ý¿âÁ¬½ÓÊǷdz£°º¹óµÄ¶ÔÏó¡£ËùÒÔ£¬ÎªÁ˽ÚʡΪÿ´ÎÊý¾Ý¿âµ÷Óö¼ÊµÀý»¯Ò»¸öÊý¾Ý¿âÁ¬½ÓµÄ×ÊÔ´£¬ÎÒÃÇ¿ÉÒÔ»º´æ²¢ÖØÓÃһЩ´´½¨ºÃµÄÊý¾Ý¿âÁ¬½Ó¶ÔÏó²¢Í¨¹ý½ÚʡΪÿ´ÎÊý¾Ý¿âµ÷Óö¼´´½¨Ò»¸öÊý¾Ý¿âÁ¬½Ó¶ÔÏóµÄʱ¼äºÍ×ÊÔ´À´´ó·ù¶ÈÌá¸ß³ÌÐòÐÔÄÜ¡£

¶ÔÏó³ØÓëͼÊé¹ÝºÜÏñ¡£Í¼Êé¹ÝÀïά»¤ºÜ¶àÊé¼®¡£µ±¶Ôij±¾ÊéµÄÐèÇóÔö¼Óʱ£¬Í¼Êé¹Ý¾Í»áÂò¸ü¶àÊ飬·ñÔòµÄ»°¶ÁÕßÃǾͻáһֱʹÓÃͬһ±¾Êé¡£ÔÚ¶ÔÏó³ØÖУ¬Ê×ÏÈÎÒÃǼì²é¶ÔÏóÊÇ·ñÒѾ­±»´´½¨ÇÒ±»·Åµ½³ØÖУ¬Èç¹ûÒѾ­±»·Åµ½³ØÖУ¬ÎÒÃǾͻáµÃµ½¶ÔÏó³ØÖлº´æµÄ¶ÔÏó£»Èç¹ûûÓÐÕÒµ½¾Í»á´´½¨Ò»¸öеĶÔÏ󲢷ŵ½¶ÔÏó³ØÖÐÒÔ±¸Ö®ºóʹÓ᣶ÔÏ󳨼ÆÊý¹ã·ºµØÓÃÓÚ´ó¹æÄ£Ó¦ÓóÌÐò·þÎñ£¬±ÈÈçÆóÒµ¼¶Java×é¼þÄ£ÐÍ(Enterprise Java Beans Servers, EJB)£¬MTS/COM+, ÉõÖÁÔÚ.NET FrameworkÖÐ.

ÔÚÕⲿ·Ö£¬ÎÒÃǽ«¿ª·¢Ò»¸öÊý¾Ý¿âÁ¬½Ó³ØÀ´»º´æÊý¾Ý¿âÁ¬½Ó¡£´´½¨Êý¾Ý¿âÁ¬½ÓÊǺܰº¹óµÄ¡£ÔÚÒ»¸öµäÐ͵ÄWebÓ¦ÓÃÖпÉÄÜÓм¸Ç§¸öÓû§Í¬Ê±·ÃÎÊÕ¾µã¡£Èç¹ûÕâЩÓû§Ç¡ºÃÏëÒª·ÃÎÊÊý¾Ý¿âµÄ¶¯Ì¬Êý¾Ý¶øÎÒÃǼÌÐøÎªÃ¿¸öÓû§´´½¨Ò»¸öÊý¾Ý¿âÁ¬½ÓµÄ»°£¬ÎÒÃǽ«¶ÔÓ¦ÓóÌÐòµÄÐÔÄÜ´øÀ´¸ºÃæÓ°Ïì¡£´´½¨Ò»¸öеĶÔÏóÒªÇó¸ü¶àÄÚ´æ¡£ÄÚ´æ·ÖÅä»á½µµÍÓ¦ÓóÌÐòÐÔÄÜ£¬×îºóµÄ½á¹ûÊÇWebÕ¾µãÔÚ·Ö·¢¶¯Ì¬ÄÚÈÝʱ±äµÃ·Ç³£Âý£¬»òÕßµ½´ïÒ»¸öÁÙ½çÖµµ¼ÖÂÕ¾µã±ÀÀ£¡£Á¬½Ó³ØÎ¬»¤Ò»¸öÒÑ´´½¨µÄ¶ÔÏ󳨣¬ËùÒÔÐèÒªÒ»¸öÊý¾Ý¿âÁ¬½ÓµÄÓ¦ÓóÌÐò¿ÉÒÔ´Ó³ØÖнèÒ»¸öÁ¬½Ó²¢ÔÚÓÃÍêÒԺ󻹸ø¶ÔÏ󳨣¬¶ø²»ÊÇ´´½¨Ò»¸öеÄÊý¾Ý¿âÁ¬½Ó¡£Ò»µ©Êý¾Ý·¢Ë͸øÒ»¸öÓû§£¬¶ÔÏóµÄÊý¾Ý¿âÁ¬½Ó¾Í»á±»ÊÕ»ØÒÔ±¸Ö®ºóʹÓá£

ʵÏÖ¶ÔÏó³Ø

ÈÃÎÒÃÇ¿´Ò»¸öÎÒÃǵÄÓÉÀàͼÃèÊöµÄÊý¾Ý¿âÁ¬½Ó³ØÓ¦Óá£Í¼ 5 ÏÔʾÁËObjectPool ÀàºÍ¼Ì³Ð×ÔObjectPoolµÄDBConnectionSingleton Àà¡£

ObjectPool Àà

ÎÒÃÇÏÈÌù³öObjectPool ÀàµÄ´úÂëÈ»ºó¿ªÊ¼ÌÖÂÛ£º

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Timers;

namespace ObjectPoolSample
{
public abstract class ObjectPool
{
//Last Checkout time of any object from the pool.
private long lastCheckOut;

//Hashtable of the check-out objects.
private static Hashtable locked;

//Hashtable of available objects
private static Hashtable unlocked;

//Clean-Up interval
internal static long GARBAGE_INTERVAL = 90 * 1000; //90 seconds
static ObjectPool()
{
locked = Hashtable.Synchronized(new Hashtable());
unlocked = Hashtable.Synchronized(new Hashtable());
}

internal ObjectPool()
{
lastCheckOut = DateTime.Now.Ticks;

//Create a Time to track the expired objects for cleanup.
Timer aTimer = new Timer();
aTimer.Enabled = true;
aTimer.Interval = GARBAGE_INTERVAL;
aTimer.Elapsed += new ElapsedEventHandler(CollectGarbage);
}

protected abstract object Create();

protected abstract bool Validate(object o);

protected abstract void Expire(object o);

internal object GetObjectFromPool()
{
long now = DateTime.Now.Ticks;
lastCheckOut = now;
object o = null;

lock (this)
{
try
{
foreach (DictionaryEntry myEntry in unlocked)
{
o = myEntry.Key;
unlocked.Remove(o);
if (Validate(o))
{
locked.Add(o, now);
return o;
}
else
{
Expire(o);
o = null;
}
}
}
catch (Exception) { }
o = Create();
locked.Add(o, now);
}
return o;
}

internal void ReturnObjectToPool(object o)
{
if (o != null)
{
lock (this)
{
locked.Remove(o);
unlocked.Add(o, DateTime.Now.Ticks);
}
}
}

private void CollectGarbage(object sender, ElapsedEventArgs ea)
{
lock (this)
{
object o;
long now = DateTime.Now.Ticks;
IDictionaryEnumerator e = unlocked.GetEnumerator();

try
{
while (e.MoveNext())
{
o = e.Key;

if ((now - (long)unlocked[o]) > GARBAGE_INTERVAL)
{
unlocked.Remove(o);
Expire(o);
o = null;
}
}
}
catch (Exception) { }
}
}
}
}

ObjectPool ÀàÓÐÁ½¸öÖØÒªµÄ·½·¨£» GetObjectFromPool(), ´Ó¶ÔÏó³ØÖлñȡһ¸ö¶ÔÏó£¬ ReturnObjectToPool(), °Ñ¶ÔÏ󻹸ø¶ÔÏ󳨡£ÎÒÃÇÒÔÁ½¸ö¹þÏ£±íʵÏÖ¶ÔÏ󳨣¬Ò»¸ö³ÆÎªlocked, ÁíÒ»¸ö³ÆÎªunlocked. locked ¹þÏ£±í°üº¬ËùÓÐÕýÔÚʹÓõĶÔÏó¶øunlocked ¹þÏ£±í°üº¬ÁËËùÓÐδ±»Ê¹ÓÃÇÒ¿ÉËæÊ±Ê¹ÓõĶÔÏó¡£ObjectPool »¹ÓÐÈý¸öÈý¸ö±ØÐëÖØÔØµÄ·½·¨£ºCreate(), Validate() ºÍ Expire(), ËüÃDZØÐëÓɼ̳ÐÀàʵÏÖ¡£

×ܶøÑÔÖ®£¬ObjectPool ÀàÖÐÓÐÈý¸ö¹Ø¼ü²¿·Ö£º

ʹÓÃGetObjectFromPool() À´´Ó¶ÔÏó³ØÖлñȡһ¸ö¶ÔÏ󣬵±ÐèÒªÏò¶ÔÏó³ØÖÐÌí¼ÓÒ»¸ö¶ÔÏóʱ±ØÐëʹÓÃËø£¬ÓÉÓÚÕâ¸ö¹ý³Ìlocked ºÍ unlocked ¹þÏ£±íµÄÄÚÈݻᷢÉú±ä»¯¶øÎÒÃDz»ÏëÔÚÕâ¸ö¹ý³ÌÖз¢Éú³åÍ»¡£

ʹÓÃReturnObjectToPool() À´°ÑÒ»¸ö¶ÔÏ󷵻ظø¶ÔÏ󳨣¬Í¬ÑùÐèҪʹÓÃËø£¬ÀíÓÉͬÉÏ¡£

ʹÓÃCollectGarbage() ´Ó¶ÔÏó³ØÖÐÇå³ý¹ýÆÚ¶ÔÏó£¬ÔÚÕâ¸ö·½·¨ÖÐÎÒÃDZéÀúunlocked¹þÏ£±íÒÔ±ã´Ó¶ÔÏó³ØÖÐÕÒµ½²¢ÒƳý¹ýÆÚ¶ÔÏó¡£Õâ¸ö¹ý³ÌÖÐunlocked¹þÏ£±íµÄÄÚÈÝ¿ÉÄܻᷢÉú¸Ä±äËùÒÔÎÒÃÇÐèҪʹÓÃËøÀ´±£Ö¤ÕâÒ»¹ý³ÌÊÇÔ­×Ó²Ù×÷¡£

GetObjectFromPool() ·½·¨ÖУ¬ÎÒÃDZéÀúunlocked¹þÏ£±íÀ´»ñÈ¡µÚÒ»¸ö¿ÉÓöÔÏó¡£»ñµÃÁËÒÔºóʹÓÃValidate() ·½·¨È¥ÑéÖ¤Ö¸¶¨¶ÔÏó¡£»ùÓÚ²»Í¬µÄ»º´æ¶ÔÏóÀàÐÍ£¬Validate()·½·¨µÄʵÏÖÒ²¿ÉÄÜÓкܴó²»Í¬¡£ÀýÈ磬Èç¹û¶ÔÏóÊÇÒ»¸öÊý¾Ý¿âÁ¬½Ó£¬ÄÇô¼Ì³Ð¶ÔÏ󳨵ÄÀà¾ÍÐèҪʵÏÖValidate()·½·¨À´¼ì²éÊý¾Ý¿âÁ¬½ÓÊÇ´ò¿ªµÄ»¹Êǹرյġ£Èç¹û¶ÔÏ󳨶ÔÏóÑé֤ͨ¹ýÁË£¬ÎÒÃÇ´Óunlocked¹þÏ£±íÖÐÒÆ³ýÕâ¸ö¶ÔÏó²¢°ÑËü·Åµ½locked¹þÏ£±íÖС£locked ¹þÏ£±íÖеĶÔÏó±íʾÕýÔÚʹÓõĶÔÏó¡£Èç¹ûÑé֤ʧ°Ü£¬ÎÒÃǾÍʹÓÃExpired()·½·¨°Ñ¶ÔÏó×¢Ïú¡£Expire()·½·¨Ò²ÐèҪͨ¹ý¼Ì³ÐÀàʵÏÖ²¢¸ù¾Ý²»Í¬µÄ»º´æ¶ÔÏóÀàÐͶøÓв»Í¬µÄʵÏÖÐÎʽ¡£»¹ÊÇÒÔÒ»¸öÊý¾Ý¿âÁ¬½ÓΪÀý£¬¹ýÆÚ¶ÔÏ󽫹رÕÊý¾Ý¿âÁ¬½Ó¡£Èç¹ûûÓÐÕÒµ½Ò»¸ö»º´æ¶ÔÏó£¬ËµÃ÷unlocked¹þÏ£±íÊǿյģ¬ÎÒÃÇʹÓÃCreate()·½·¨´´½¨Ò»¸öжÔÏóÈ»ºó°ÑËü·ÅÈëµ½locked¹þÏ£±íÖС£

ReturnObjectToPool() ·½·¨µÄʵÏÖÏà¶Ô¼òµ¥Ò»Ð©¡£ÎÒÃǽö½öÐèÒª½«¶ÔÏó´Ólocked¹þÏ£±íÖÐÒÆ³ý²¢°ÑËü·Å»Øunlocked¹þÏ£±íÖÐÒÔ±¸ÁíÓá£ÔÚÕû¸ö»ØÊÕ¹ý³ÌÖУ¬ÎÒÃDz»µÃ²»¿¼ÂÇÓ¦ÓóÌÐòµÄÄÚ´æÊ¹ÓÃÇé¿ö¡£¶ÔÏó³ØÓëÄÚ´æÊ¹ÓÃÁ¿³ÉÕý±È¡£ËùÒÔ£¬ÎÒÃÇ»º´æµÄ¶ÔÏóÔ½¶à£¬¾ÍÐèҪʹÓøü¶àÄڴ档ΪÁË¿ØÖÆÄÚ´æÊ¹ÓÃÁ¿£¬ÎÒÃÇÓ¦¸ÃÖÜÆÚÐԵضԳØÖеĶÔÏó½øÐÐÀ¬»ø»ØÊÕ´¦Àí¡£Õâ¿ÉÒÔͨ¹ý¶Ô³ØÖÐÿ¸ö¶ÔÏó¼ÓÒ»¸ö³¬Ê±ÖÜÆÚÀ´ÊµÏÖ¡£Èç¹ûÔÚ³¬Ê±Ê±¼äÄÚÒ»¸ö»º´æ¶ÔÏóûÓб»Ê¹Óã¬ÄÇôËü½«»á±»×÷ΪÀ¬»ø»ØÊÕ¡£½á¹û¾ÍÊǶÔÏ󳨵ÄÄÚ´æÊ¹ÓÃÁ¿½«ºÜ´ó³ÌÐòÉÏÈ¡¾öÓÚϵͳ¸ºÔØ¡£

CollectGarbage() ·½·¨ÓÃÀ´´¦Àí¶ÔÏ󳨵ÄÀ¬»ø»ØÊÕ¡£Õâ¸ö·½·¨ÓÉObjectPool¹¹Ô캯ÊýÖгõʼ»¯µÄÒ»¸öTimerίÍнøÐе÷Óá£ÔÚÎÒÃǵÄÀý×ÓÖУ¬ÎÒÃÇͨ¹ýGARBAGE_COLLECT ³£Á¿½«À¬»ø»ØÊÕʱ¼ä¼ä¸ô¶¨Î»90Ãë¡£

ÎÒÃÇ»¹Ã»ÓÐʵÏÖÈκÎÊý¾Ý¿âÁ¬½ÓÏà¹ØµÄ´úÂ룬ËùÒÔÎÒÃǼÙÉèObjectPool Àà¿ÉÒÔÓÃÓÚ¶Ô.NET Framework ÖеÄËùÓÐÀàÐͽøÐлº´æ¡£

DBConnectionSingleton Àà

DBConnectionSingleton ÀàʵÏÖÁËÒ»¸öÊý¾Ý¿âÁ¬½Ó¶ÔÏ󳨡£Õâ¸öÀàµÄÖ÷ҪĿµÄÊÇΪ¼Ì³Ð×ÔObjectPool ÀàµÄÌØ¶¨Êý¾Ý¿âÁ¬½ÓʵÏÖCreate(), Validate() ºÍ Expire()·½·¨¡£Õâ¸öÀàÒ²ÌṩBorrowDBConnection() ºÍ ReturnDBConnection() ·½·¨À´´Ó¶ÔÏó³ØÖнè³ö/·µ»¹Êý¾Ý¿âÁ¬½Ó¡£

DBConnectionSignletion ÀàµÄÍêÕû´úÂëÆ¬¶ÎÈçÏ£º

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace ObjectPoolSample
{
public sealed class DBConnectionSingletion : ObjectPool
{
private DBConnectionSingletion() { }

public static readonly DBConnectionSingletion Instance =
new DBConnectionSingletion();

private static string connectionString =
@"server=(local);Trusted Connection=yes;database=northwind";

public static string ConnectionString
{
get
{
return connectionString;
}
set
{
connectionString = value;
}
}

protected override object Create()
{
SqlConnection conn = new SqlConnection(connectionString);
conn.Open();
return conn;
}

protected override bool Validate(object o)
{
try
{
SqlConnection conn = (SqlConnection)o;
return !conn.State.Equals(ConnectionState.Closed);
}
catch (SqlException)
{
return false;
}
}

protected override void Expire(object o)
{
try
{
SqlConnection conn = (SqlConnection)o;
conn.Close();
}
catch (SqlException) { }
}

public SqlConnection BorrowDBConnection()
{
try
{
return (SqlConnection)base.GetObjectFromPool();
}
catch (Exception e)
{
throw e;
}
}

public void ReturnDBConnection(SqlConnection conn)
{
base.ReturnObjectToPool(conn);
}
}
}

ÓÉÓÚÄãÕýÔÚ´¦ÀíµÄÊÇSqlConnection¶ÔÏó£¬ËùÒÔExpire()·½·¨ÓÃÀ´¹Ø±ÕSqlConnection, Create() ·½·¨ÓÃÀ´´´½¨SqlConnection ¶ø Validate() ÔòÓÃÀ´¼ì²éSqlConnection ÊÇ´ò¿ªµÄ»¹Êǹرյġ£Ê¹ÓÃDBConnectionSigleton ¶ÔÏóʵÀý¿ÉÒÔʹÕû¸öͬ²½ÎÊÌâ¶Ô¿Í»§¶ËÓ¦ÓóÌÐò͸Ã÷¡£

ΪʲôҪʹÓõ¥Àýģʽ£¿

Singleton ÊÇÒ»¸öÖøÃûµÄ´´½¨ÐÍÉè¼ÆÄ£Ê½£¬µ±ÄãÐèÒªÒ»¸ö¶ÔÏó½ö¶ÔÓ¦Ò»¸öʵÀýʱͨ³£ÐèҪʹÓÃËü¡£Éè¼ÆÄ£Ê½Ò»Êé(ISBN 0-201-70265-7)ÖжÔÉè¼Æµ¥ÀýģʽĿµÄ¶¨ÒåΪ±£Ö¤Ò»¸öÀà½öÓÐÒ»¸öʵÀý£¬²¢Ìṩȫ¾ÖΨһµÄ·½Ê½À´·ÃÎÊËü¡£ÎªÁËʵÏÖÒ»¸öµ¥Àý£¬ÎÒÃÇÐèÒªÒ»¸ö˽Óй¹Ô캯ÊýÒÔ±ãÓÚ¿Í»§¶ËÓ¦ÓóÌÐòÎÞÂÛÈçºÎ¶¼Ã»·¨´´½¨Ò»¸öжÔÏó£¬Ê¹Óþ²Ì¬µÄÖ»¶ÁÊôÐÔÀ´´´½¨µ¥ÀýÀàµÄΨһʵÀý¡£.NET Framework ÔÚJIT ¹ý³ÌÖнöµ±ÓÐÈκη½·¨Ê¹Óþ²Ì¬ÊôÐÔʱ²Å»á½«ÆäʵÀý»¯¡£Èç¹ûÊôÐÔûÓб»Ê¹Óã¬ÄÇôҲ¾Í²»»á´´½¨ÊµÀý¡£¸ü׼ȷµØËµ£¬½öµ±ÓÐÈκÎÀà/·½·¨¶ÔÀàµÄ¾²Ì¬³ÉÔ±½øÐе÷ÓÃʱ²Å»á¹¹Ôì¶ÔÓ¦µ¥ÀýÀàµÄʵÀý¡£Õâ¸öÌØÐÔ³Æ×÷¶èÐÔ³õʼ»¯²¢°Ñ´´½¨¶ÔÏóµÄ¹ý³ÌÁô¸øµÚÒ»´Î·ÃÎÊʵÀýÊôÐԵĴúÂë¡£.NET Framework ±£Ö¤¹²ÏíÀàÐͳõʼ»¯Ê±µÄÀàÐͰ²È«¡£ËùÒÔÎÒÃDz»ÐèÒªµ£ÐÄDBConnectionSingleton¶ÔÏóµÄḬ̈߳²È«ÎÊÌ⣬ÒòΪÔÚÓ¦ÓóÌÐòÕû¸öÉúÃüÖÜÆÚÄÚ½ð»Ô´´½¨Ò»¸öʵÀý¡£ÊµÀý¾²Ì¬ÊôÐÔά»¤DBConnectionSingletonÀà¶ÔÏóµÄΨһʵÀý¡£

ʹÓÃÊý¾Ý¿âÁ¬½Ó³Ø

ÏÖÔÚÒѾ­×¼±¸ºÃʹÓÃÊý¾Ý¿âÁ¬½Ó³ØÁË£¬ÏÂÃæµÄ´úÂëÆ¬¶ÎÏÔʾÁËÈçºÎʵÀý»¯²¢Ê¹ÓÃÊý¾Ý¿âÁ¬½Ó³Ø£º

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlClient;

namespace ObjectPoolSample
{
class Program
{
static void Main(string[] args)
{
//Initialize the Pool
DBConnectionSingletion pool = DBConnection

Singletion.Instance;

//Set the ConnectionString of the Database

ConnectionPool
ConnectionStringSettingssettings = ConfigurationManager.ConnectionStrings

["NorthwindConnectionString"];
DBConnectionSingletion.ConnectionString = settings.ConnectionString;
//Borrow the SqlConnection object from the pool
SqlConnection conn = pool.BorrowDBConnection();

//Return the Connection to the pool after

using it
pool.ReturnDBConnection(conn);

Console.ReadLine();
}
}
}

ÔÚÉÏÃæµÄÀý×ÓÖУ¬ÎÒÃÇͨ¹ýDBConnectionSingletion ÀàµÄʵÀýÊôÐÔÀ´³õʼ»¯ËüµÄʵÀý¡£ÈçÉÏÃæÌÖÂ۵ģ¬ÎÒÃǼÙÉèʹÓõ¥ÀýÉè¼ÆÄ£Ê½¿ÉÒÔ±£Ö¤ÎÒÃÇÓÐÇÒ½öÓÐÒ»¸öDBConnectionSingletion ¶ÔÏóµÄʵÀý¡£ÎÒÃǰÑConnectionString ÊôÐÔÉèÖÃΪ±¾»úSQL ServerʵÀýÉϵı±·çÊý¾Ý¿â¡£ÏÖÔÚ£¬ÎÒÃÇ¿ÉÒÔʹÓöÔÏ󳨵ÄBorrowDBConnection() ·½·¨À´´Ó¶ÔÏ󳨽èÒ»¸öÊý¾Ý¿âÁ¬½Ó£¬ È»ºóͨ¹ýµ÷ÓöÔÏ󳨵ÄReturnDBConnection() ·½·¨À´·µ»¹Êý¾Ý¿âÁ¬½Ó¡£Èç¹ûÄãÕæµÄÏë¿´¿´Ó¦ÓóÌÐò³ØÊÇÈçºÎÔËÐеģ¬ÄÇô×îºÃµÄ·½Ê½¾ÍÊÇ´ò¿ªVisual Studio .NET ÖеŤ³Ì²¢ÔÚµ÷ÊÔģʽϸú×ÙÉÏÃæ¸ø³öµÄÓ¦ÓóÌÐò´úÂë¡£

×ܽá

ÔÚÆóÒµ¼¶¼ÆËãµÄ¶àÏß³ÌÊÀ½çÖÐͬ²½ÊÇÒ»¸ö¼«ÆäÖØÒªµÄ¸ÅÄî¡£Ëü±»¹ã·ºÓÃÓÚÊý¾Ý¿â£¬ÏûÏ¢¶ÓÁÐÒÔ¼°Web ·þÎñÆ÷µÈÎÅÃûÓ¦ÓÃÉÏ¡£Èκοª·¢¶àÏß³ÌÓ¦ÓóÌÐòµÄ¿ª·¢ÈËÔ±¶¼±ØÐë¶ÔËûÃǵÄͬ²½¸ÅÄîÌØ±ðÇå³þ¡£²»ÊÇΪÁËÈÃÿ¸ö¶ÔÏó¶¼ÊÇḬ̈߳²È«µÄ¶øµ¼ÖÂϵͳ²»¿°Öظº£¬¶øÊÇÓ¦¸Ã¹Ø×¢ËÀËøÇé¿ö²¢ÔÚ³ÌÐòÉè¼ÆÖ®³õ¾Í½â¾ö¾¡¿ÉÄܶàµÄËÀËøÎÊÌâ¡£Àí½âͬ²½´øÀ´µÄÐÔÄÜÆ¿¾±ÎÊÌâͬÑùºÜÖØÒª£¬ÒòΪËü½«Ó°ÏìÓ¦ÓóÌÐòµÄ×ÜÌåÐÔÄÜ¡£ÔÚÕâÒ»Õ£¬³ýÁË̽ÌÖ.NET Framework ÖÐ×Ô´øµÄͬ²½ÌØÐÔ£¬ÎÒÃÇÒ²¿ª·¢ÁËÁ½¸öÓÐÓõÄÓ¦ÓóÌÐò£º

Ò»¸ö×Ô¶¨ÒåµÄḬ̈߳²È«°ü×°Æ÷¡£ÔÚÕâ¸öÀý×ÓÖУ¬Äãѧµ½ÁËÈçºÎΪÄãµÄÀà¿âÌí¼ÓÔ­Éúͬ²½Ö§³Ö²¢Îªµ÷ÓÃÀà¿âµÄ¿ª·¢ÈËÔ±ÌṩÊÇ·ñʹÓÃͬ²½µÄÑ¡Ïî¡£Õ⽫°ïÖúµÚÈý·½¿ª·¢ÈËÔ±¹Ø×¢ÓÚËûÃÇ×Ô¼ºµÄÓ¦ÓóÌÐò¶ø²»ÊÇÀà¿âµÄḬ̈߳²È«ÎÊÌâ¡£

Ò»¸öÊý¾Ý¿âÁ¬½Ó³Ø¡£ÔÚÕâ¸öÀý×ÓÖУ¬Ä㿪·¢ÁË¿ÉÒÔÓÃÓÚÈÎÒâÏàËÆ¶ÔÏóÀàÐ͵ĶÔÏ󳨡£ÓÐÁ˶ÔÏ󳨣¬ÎÒÃǼÌÐø¿ª·¢ÁËÒ»¸ö¼Ì³Ð×Ô¶ÔÏ󳨵ÄÊý¾Ý¿âÁ¬½Ó³Ø¡£¶ÔÏó³Ø¿ÉÒÔÓÃÓÚÈÎÒâ¶ÔÏó

   
2924 ´Îä¯ÀÀ       27
 
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
 
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
 
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì