关于sql连接语句中的Integrated Security
integrated security 即:Security Support Provider Interface
设置Integrated Security为 True 的时候,
Integrated Security 可以设置为: True, false, yes, no ,sspi ,其中sspi相当于 True,建议用sspi。
当Integrated Security=SSPI 时,表示以当前WINDOWS系统用户身份去登录SQL SERVER服务器,如果SQL SERVER服务器不支持WINDOWS系统用户方式登录时,就会出错。
当Integrated Security=SSPI 时,连接语句前面的 UserID, PW 是不起作用的,只有设置为 False 或省略该项的时候,才按照 UserID, PW 来连接。
initial catalog与database的区别是什么
Initial Catalog, DataBase 两者没有任何区别只是名称不一样
Integrated Security - 或 - Trusted_Connection
ADO.net 中数据库连接方式
System.Data.SqlClient.SqlConnection
常用的一些连接字符串:
"Server=(local); Integrated Security=SSPI; database=Pubs"
"server=(local)/NetSDK; Integrated Security=SSPI; database=pubs“
"Data Source=localhost; Integrated Security=SSPI; Initial Catalog=Northwind;“
"data source=(local); initial catalog=xr; integrated security=SSPI; persist security info=False; workstation id=XURUI; packet size=4096; "
"Persist Security Info=False; Integrated Security=SSPI; database=northwind; server=mySQLServer“
"uid=sa;pwd=passwords;initial catalog=pubs;data source=127.0.0.1;Connect Timeout=900“
"Data Source=(local);Integrated security=SSPI;Initial Catalog=Taxi;"
"Data Source=(local);User Id=sa;Password=123;Initial Catalog=Taxi;";
"server=localhost; database=testing; user=sa; password=123"
连接字符串中的一些属性
Connection lifetime 连接生存时间,默认为0,表示无限长,单位为秒.在SQL集群环境中我们才设置为具体的数值.
Connection timeout 连接生成时间,默认为15秒,通俗的讲当你conn.Open等15秒后还没连接成功,那么就会抛出一个连接超时的错误,这也是为什么其他错误来的那么突然,而数据库连接超时错误,非要你等15秒的原因了.
Pooling 是否使用连接池, 默认是起用的,使用Pooling=false来禁止.
Min Pool Size,Max Pool Size 默认情况下最小是0,最大是100.
关于pooling属性在上面所有的连接字符串中多是默认开启的,连接池能有效的提高数据库访问性能,因为创建一个连接需要消耗很多资源,尤其是进行异地访问时(一般指局域网,最好不要进行跨internet的数据库访问)更加如此,因此你在多数情况下不需要显式的禁止(也许你没在意微软一直帮你开通着), 事实上在你使用 conn.open() ,conn.close() 多少数情况下不是真的打开一个连接,而是向连接池中取一条可用连接,跟归还一条连接,conn.open操作只有在池中没有可用连接时才会创建一条连接,当然如果池中可用接数目达到Max Pool Size时,他将不再创建新的连接,而是等待一条可用连接的到来,这个时间是Connection timeout. 当然你的conn.Open操作涉及的连接池,取决于你的连接字符串,比如:
"Data Source=127.0.0.1/SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI"
与
"Data Source=127.0.0.1/SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI;" ,注意后面多了";"
会开启两个独立的连接池,ADO.NET 判断字符串是否相同的依据是对字符串进行2进制的比较,所以任何变动(空格,大小写)都会被判断为不同的连接字符串.
有如下代码
-----------------------------------
string strConn="Data Source=127.0.0.1/SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI;";
for(int i=0;i<10;i++){
SqlConnection conn=new SqlConnection(strConn);
conn.Open();
conn.Close()
}
跟
string strConn="Data Source=127.0.0.1/SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI;";
for(int i=0;i<10;i++){
strConn +=" "; //空格
SqlConnection conn=new SqlConnection(strConn);
conn.Open();
conn.Close()
}
两段代码分别运行,看企业管理器->管理->进程信息(请刷新先) ,可以看到前面的只启用了一个进程,而后面的则启用了10个进程,每个进程对应一条连接.前一段代码10个open +close()操作使用的是同一个连接池中的同一个连接,而后一个则开启了10个连接池,每个连接池中有一个连接.
再看下面的代码
for (int i = 0; i <= 10; i++)
{
Thread t = new Thread(new ThreadStart(Command));
t.Start();
}
---------------------
//Command定义
private void Command(){
string strConn="Data Source=127.0.0.1/SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI;";
Sqlconnection conn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand("一个运行比较长的查询",conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close()
}
运行后可以看,企业管理器->管理->进程信息里会开启10个到MyDBA数据库的连接进程,但是需要注意的是,这10个进程是属于同个连接池的,为了证明这一点你可以将上面的连接字符串改为
private void command(){
string strConn="Data Source=127.0.0.1/SQL2K;Initial Catalog=MyDBA;Integrated
Security=SSPI;Max pool Size=5;"; //加了Max Pool Size=5;
SqlConnection conn=new SqlConnection(strConn);
SqlCommand cmd=new SqlCommand("一个运行比较长的查询",conn);
conn.Open();
cmd.ExecuteNonQuery();
conn.Close()
}
结果可以看到他只开启了5个到MyDBA数据库的连接,这证明他们是同个连接池的.当然这里能成功演示的前提是,cmd执行的任务时间要在15秒内,不然会出现后5个线程连接超时,另外使用SQL2000 的跟踪工具(SQL2005中是,SQL Server Profiler)是你观察以上实验的一个绝好的工具!
英文详细说明:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx