ms-help://MS.NETFrameworkSDK.CHS/cpguidenf/html/cpconserveractivation.htm
解决方案 »
- 在窗体上放入一个DataGridView,怎么把在DataGridView新添加的数据保存到数据库
- .NET或者delhpi 如何写个组合键???
- c#中SendKeys.Send 如何输入汉字
- C# 尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
- 比较字符串问题。。
- 求c++转学c#的教材
- 怎样在DataGrid控件中获得用户点击的是哪一行??
- 关于asp.net web程序的访问,为什么老提示我输入密码!
- 如何在一个图片框中填充渐变色
- 请教高手:windows服务里可以用剪贴板吗?如何用?
- 怎么规定选中的datagrid中只读的行不变成的灰色??散分!!
- 错误的完全描述,希望大家帮忙,1935错误
ms-help://MS.VSCC/MS.MSDNVS.2052/Vbcon/html/vburfIntroductionToADOConnectionDesignTools.htm或者参考这个贴子:
http://expert.csdn.net/Expert/topic/1517/1517079.xml?temp=.8440515
1、创建Connection对象的时候,ADO.Net会根据连接串查看是否连接池,没有就创建
2、查看连接池中是否有闲置未用的连接,是的话直接取一个交给Connection对象,没有就创建一个数据库连接
3、Connection对象调用Close方法的时候,数据库连接会回到连接池,并保持闲置状态4、连接池会定期维护连接池,如果闲置连接太多,可能会利用某些算法来释放一些,以节省资源所以,每次使用完Connection对象都需要释放,让连接回到连接池,让其他需要的地方使用,这样才能使资源的使用达到最优化。
成“1”就可以了,对吧?这样所有要连接数据库的东东都会去使用那个唯一存在的连接资源,是不是?
public class PublicDataClass
{
private static PublicDataClass m_publicData=null;
public SqlConnection m_connection =null;
private PublicDataClass()
{
//
// TODO: Add constructor logic here
//
}
public static PublicDataClass CreateInstance()
{
//-------------------->创建单一实例<--------------------
if(m_publicData==null)
{
try
{
m_publicData=new PublicDataClass();
}
catch(Exception)
{
m_publicData=null;
}
}
return m_publicData;
//-----------------------------------------------------
}
public void SetConnectionString(string str)
{
//------------->设置连接字符串<----------------------
if(str.Trim()=="") throw new Exception("连接字符串为空!");
try
{
if(m_connection==null)
{
m_connection =new SqlConnection();
}
else
{
if(m_connection.State ==ConnectionState.Open) m_connection.Close();
}
m_connection.ConnectionString =str;
m_connection.Open();
m_connection.Close();
}
catch(Exception)
{
throw new Exception("不能连接数据库!");
}
//---------------------------------------------------
}
}
在程序的其他模块中只需要调用以下代码即可:
PublicDataClass m_pubdata=PublicDataClass.CreateInstance();
if(m_pubdata.m_connection==null)
{
str=m_pubdata.ReadConnectionString();
m_pubdata.SetConnectionString(str);
}
在模块退出时:
m_pubdata=null;
{
private static PublicDataClass m_publicData=null;
// public SqlConnection m_connection =null; 不要保留唯一的连接实例
private string _connectionStr = null; //保留连接字符串
//用属性封装对字段的访问,这是.Net组件设计的一个准则,这样方便以后的维护
public string ConnectionString
{
get {
return _connectionStr;
}
set {
//------------->设置连接字符串<----------------------
if(str.Trim()=="") throw new Exception("连接字符串为空!");
_connectionStr = value;
//---------------------------------------------------
}
} //获取连接对象,每次都返回一个新创建的连接,这样才能最有效率的使用连接池
public SqlConnection Connection
{
get {
try
{
SqlConnection con = new SqlConnection();
connection.ConnectionString =value;
con.Open();
}
catch(Exception)
{
throw new Exception("不能连接数据库!");
}
}
} private PublicDataClass()
{} //用属性代替方法,这是.Net中的做法
public static PublicDataClass Instance
{
get {
if( m_publicData==null )
try
{
m_publicData=new PublicDataClass();
}
catch(Exception)
{
m_publicData=null;
}
return m_publicData;
}
}
}
PublicDataClass m_pubdata=PublicDataClass.CreateInstance();
if(PublicDataClass.Instance.ConnectionString==null)
{
PublicDataClass.Instance.ConnectionString=m_pubdata.ReadConnectionString();
}然后使用:
PublicDataClass.Instance.Connection去连接数据库
PublicDataClass m_pubdata=PublicDataClass.CreateInstance();
这句可以不要了
你的建议,可是如果是存在多个相同连接,我看这已经和我的初衷背道而驰了,因为
数据库的连接毕竟是有限的,因此我们必须用最少的连接去完成很多事情(1个连接),
如果我把一个WebService的功能定义为访问某数据库的话,那么我要求就是只存在一个
连接,用它去访问数据,至于那些调用WebService的客户端(即,某某应用页面)则也只是
通过一个连接去访问数据库,而不是另外又多建多条相同的连接,那样做更会消耗我们的
数据库的现有资源的。
我对你的做法持不同的意见:
当使用你的方法后,每一次模块去调用一个连接时,就会创建一个新的连接,也就是说,如果你不进行立即释放的话,在这个单一实例的数据类中就会存在多个连接实例,而如果单一实例中还存在很多的数据表,而由于类的唯一性决定了这些数据表的唯一性,请问,这些数据表该与那个连接进行对应呢?另外,模块每次启动时只需要引用一个早已经存在的连接对象(只须创建一次),这样的技术难道还比不上你每次启动模块时还要去什么新建一个连接对象快吗?你不要说什么连接池技术,就是请来比尔.盖茨也没用。我上面的做法可以完成保证只有一个连接,因为连接字符串是打包在这个数据类中,只能读取,不能更改
if(m_pubdata.m_connection==null)
{
str=m_pubdata.ReadConnectionString(); //对一个XML文件进行读取(存放连接字符串)
m_pubdata.SetConnectionString(str);
}另外还有一点://用属性代替方法,这是.Net中的做法
我对这点也有不同的意见:
好象只听说过:用属性代替数据成员的说法,并且这种做法也不是.NET的什么新创,而是OO的思想。我在上面的数据类中将连接对象没有做成属性,只是为了偷懒而已。
如果我把你所提供的方法看成一个WebService服务的话,
即,创建实例的过程不是在WebService里面,而是放在其
应用页面中去的话,我该怎样创建这个唯一的实例呢?
你要知道,在创建应用程序的时候,我们通常是Reference(引用)
一个Web服务,我试过了,在那种情况下,不能够调用你前面
重新定义的构造函数CreateInstance(),那样的话我不是就不能够
创建一个Singelton了吗?你有什么办法可以解决它吗?
我上面的做法不是在WebService里面,而是在一个程序内部多个功能模块共享的数据类。
如果你要在一个WebService里面实现这样的效果,可能稍微变通一下:
将类的构造函数改成static形式:
public static PublicDataClass()
{
}
你用这种方式再试试看。
另外,刚才如果我所发的帖子对你有什么不敬的话,还请见谅!!!
学海无边,每个人都还有不足的地方!!!
连接池里面存在多少个连接,这要看你的应用,如果你的应用不是很频繁的访问数据库,那么有可能从头到尾只有一个连接,但是如果很频繁,那就说不定了,但是你可以通过设置Max Pool Size来限制最大连接数如果只有一个连接,而且数据库访问很频繁的话,你的程序会很迟缓,因为当一个线程访问数据库的时候,其他的线程不得不等待,而Web Service和Web Application的应用天生就是多线程的。如果100个用户同时在线,用一个连接访问数据库,那么一个人查找的时候,就有99个人在等待。我们来就这个来举个例子,如果100个人在线,每个人访问数据库的时间是5%,也就是说平均有20分之一的人可能会同时访问,这时候,如果连接池有5个连接,那么就可以满足要求了。实际上不是说每创建一个Connection对象,就会创建一个数据库连接,这我已经说了很多遍了;一般的应用,只要在前期的性能测试中获取一个服务器能支撑的连接最大值,然后设置Max Pool Size就可以保证服务器的资源,对于已存在的连接,如果正确的使用,那么连接池绝对会帮你让它发挥最大作用。其实你可以用Windows2000的“Perfermance”查看性能指数,一般来说,一台中等的Server支持100个人在线是没问题的
--
"模块每次启动时只需要引用一个早已经存在的连接对象(只须创建一次),这样的技术难道还比不上你每次启动模块时还要去什么新建一个连接对象快吗?"
--
没错,你这样是比较快,但是你还是没有听懂我的意思相对对于数据库连接和SqlConnection对象这两个资源来说,创建前者所耗的资源完全可以让创建SqlConnection对象的资源忽略不记,有时候写代码不是说每个地方都要保证最快,而是要从整体的设计角度来考虑。如果整个应用程序用一个连接实例的话,对于C/S的程序还勉强说的过去,但是对于Web程序来说是绝对的Bad Idea,每次都创建Connection对象浪费的时间比多个线程等待连接的时间相比完全可以不考虑。实际上正是由于SqlClient和OleDb的连接池服务是隐式创建的,所以很多人不注意这个问题,以为保存一个Connection实例可以节省系统资源,但这样做恰恰是让应用程序掉入另一个瓶颈之中。CSDN上对于这个问题已经探讨了很久,我也回答了很多朋友类似的问题,希望你去查找这方面的贴子。
另外,MSDN中连接池的说明:
OleDB:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforoledbnetdataprovider.htmSql Client:
ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm另外,提醒一句,保证只有一个连接,不一定是好提议
你的程序保证一个连接,但是在程序运行期间,这个连接始终被占用,其他程序要访问数据库只有另外创建连接。如果每次都创建的话,由于连接池的应用,连接只在第一次被创建,那么创建的消耗和你的一样,只是多了创建Connection对象的时间,实际上这个对象创建根本不会花费太多的消耗;但是只是每次访问的时候使用了数据库连接,用完之后就回到了连接池,连接空闲的时间就可以被其他应用程序或者其他线程来使用。
不过,他说的是对的。
为什么,要对数据连接使用singeton 模式呢
完全不应该。
你的singeton 连接将是一个大问题