请问,是否每次查询数据库时都要做数据库的连接?

mansohu 2014-04-11 12:17:42

请问:
1. 是否每次查询数据库时都要做数据库的连接?
2. 是否需要声明成公共变量,以便每次操作数据库时省略掉连接这个过程。请问大家一般是怎么做的?
3. 如果每次都进行连接,会有什么时候弊端?
谢谢!

public Cnn

Set Cnn = CreateObject("ADODB.Connection")
CnnStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=xxxxxx;Initial Catalog=DBname;Data Source=ServerName"

Cnn.Open CnnStr
...全文
1759 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2014-04-14
  • 打赏
  • 举报
回复
一般来说不建议每次查询都联接,因为这样消耗很多的资源。通常是缓冲池保证联接的重用[/quote] 请问: 1. 每资连接所消耗的资源是数据库服务器的资源吗?还是客户端的资源? 根据2005技术内幕的资料,每次连接数据库,服务器需要花费大概50KB的内存来维护这个联接。主要还是对服务器的资源消耗。 2. 如果多次连接后,会有积累的消耗吗?还是只在连接时消耗,连接后就释放了呢? 单纯联接来说,多次连接不会消耗很明显的资源,而且很多配置信息是可以重用,一般不会马上释放。 3. 如果是多个客户端直接连接数据库服务器,而每次操作完都断开连接,是否会有更大消耗呢? 每个客户端会有自己的连接,有些会公用连接,消耗大不大这个很难说,只要是合理的,就可以了
mansohu 2014-04-12
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
一般来说不建议每次查询都联接,因为这样消耗很多的资源。通常是缓冲池保证联接的重用
请问: 1. 每资连接所消耗的资源是数据库服务器的资源吗?还是客户端的资源? 2. 如果多次连接后,会有积累的消耗吗?还是只在连接时消耗,连接后就释放了呢? 3. 如果是多个客户端直接连接数据库服务器,而每次操作完都断开连接,是否会有更大消耗呢? 谢谢!
吉普赛的歌 2014-04-12
  • 打赏
  • 举报
回复
引用 12 楼 mansohu 的回复:
[quote=引用 11 楼 yupeigu 的回复:] 另一方面,sql server为了提高效率,一般会预先创建一定数量的连接,放到一个连接池中。 当有一个用户,链接到sql server中时,不需要创建连接,而是从这个池中取出一个连接,给这个用户使用。 当这个用户暂时用完后,释放这个链接,于是这个连接再次回到了连接池中,这样就不必每次都创建-释放链接了,这个就是链接池的好处。 所以,如果你的用户数不多,可以用完后就断开连接,当然,如果机器的性能还可以,那么不断开连接也可以,因为用户不多,也不会消耗很多链接资源。
如果我有50个、100个、200个、500个、1000个用户,哪个算多呢?[/quote] 其实你不能这么说的, 虽然你有1000个用户, 但1000个用户会同时操作你的数据库吗? 其实这种可能性是并不大的, 即使有, 也不需要这样子来支持, 比如最大只支持100个连接, 前100个人在用, 其它人在等, 但其它人等的时间一般不过太长, 一般只需要0.0xxx秒即可。 当然, 如果你希望更多的人, 时时刻刻都可以操作你的DB, 那就不是这么简单的问题了。 其实, 你可以结贴了, 你问的其实是个很简单的问题, 没有必要想这么复杂……
LongRui888 2014-04-12
  • 打赏
  • 举报
回复
引用 12 楼 mansohu 的回复:
[quote=引用 11 楼 yupeigu 的回复:] 另一方面,sql server为了提高效率,一般会预先创建一定数量的连接,放到一个连接池中。 当有一个用户,链接到sql server中时,不需要创建连接,而是从这个池中取出一个连接,给这个用户使用。 当这个用户暂时用完后,释放这个链接,于是这个连接再次回到了连接池中,这样就不必每次都创建-释放链接了,这个就是链接池的好处。 所以,如果你的用户数不多,可以用完后就断开连接,当然,如果机器的性能还可以,那么不断开连接也可以,因为用户不多,也不会消耗很多链接资源。
如果我有50个、100个、200个、500个、1000个用户,哪个算多呢?[/quote] 500个用户,1000个,就是多了
mansohu 2014-04-12
  • 打赏
  • 举报
回复
引用 11 楼 yupeigu 的回复:
另一方面,sql server为了提高效率,一般会预先创建一定数量的连接,放到一个连接池中。 当有一个用户,链接到sql server中时,不需要创建连接,而是从这个池中取出一个连接,给这个用户使用。 当这个用户暂时用完后,释放这个链接,于是这个连接再次回到了连接池中,这样就不必每次都创建-释放链接了,这个就是链接池的好处。 所以,如果你的用户数不多,可以用完后就断开连接,当然,如果机器的性能还可以,那么不断开连接也可以,因为用户不多,也不会消耗很多链接资源。
如果我有50个、100个、200个、500个、1000个用户,哪个算多呢?
LongRui888 2014-04-12
  • 打赏
  • 举报
回复
另一方面,sql server为了提高效率,一般会预先创建一定数量的连接,放到一个连接池中。 当有一个用户,链接到sql server中时,不需要创建连接,而是从这个池中取出一个连接,给这个用户使用。 当这个用户暂时用完后,释放这个链接,于是这个连接再次回到了连接池中,这样就不必每次都创建-释放链接了,这个就是链接池的好处。 所以,如果你的用户数不多,可以用完后就断开连接,当然,如果机器的性能还可以,那么不断开连接也可以,因为用户不多,也不会消耗很多链接资源。
LongRui888 2014-04-12
  • 打赏
  • 举报
回复
请问: 1. 每资连接所消耗的资源是数据库服务器的资源吗?还是客户端的资源? 2. 如果多次连接后,会有积累的消耗吗?还是只在连接时消耗,连接后就释放了呢? 3. 如果是多个客户端直接连接数据库服务器,而每次操作完都断开连接,是否会有更大消耗呢? 1.这个主要是指数据库服务器的资源,呵呵,昨天忘记说了,每个连接,在sql server内部就是一个线程,如果有10个连接,那么机会有10个线程,每个线程在创建的时候,默认需要分配1M的内存,所以链接越多,需要消耗的内存资源就会越多。 2.连接时会消耗一定的资源,直到释放了链接,才能释放资源。 3.每次操作后都断开,确实能释放一部分资源,但是如果马上又要查询数据,那么又得再次连接,这样,就得再次创建一个线程。 于是频繁的创建连接,断开后释放连接,这个创建-释放的过程,也需要消耗服务器的cpu资源。 所以,连接上后不断开,那么消耗了内存资源,而连接上用了一会就断开,那么消耗cpu资源,这个需要平衡。
吉普赛的歌 2014-04-11
  • 打赏
  • 举报
回复
引用 7 楼 mansohu 的回复:
[quote=引用 5 楼 yenange 的回复:] [quote=引用 4 楼 mansohu 的回复:] 请问,连接池是否适用于cs结构呢?
连接池是.net 内部已处理好的东西,你只需要把连接串写好,基本上不需要你在代码里东改西改的了…… B/S和C/S与连接串没有任何关系, 谁来都是连…… 其它要注意的是每次使用连接, 要注意关闭。[/quote] 我用的是VB,有没有这个东西啊?[/quote] 没用过, 你试一下吧
mansohu 2014-04-11
  • 打赏
  • 举报
回复
引用 5 楼 yenange 的回复:
[quote=引用 4 楼 mansohu 的回复:] 请问,连接池是否适用于cs结构呢?
连接池是.net 内部已处理好的东西,你只需要把连接串写好,基本上不需要你在代码里东改西改的了…… B/S和C/S与连接串没有任何关系, 谁来都是连…… 其它要注意的是每次使用连接, 要注意关闭。[/quote] 我用的是VB,有没有这个东西啊?
吉普赛的歌 2014-04-11
  • 打赏
  • 举报
回复
server=.;uid=sa;pwd=tcaccp;database=pubs;pooling=true;min pool size=10;max pool size=150
吉普赛的歌 2014-04-11
  • 打赏
  • 举报
回复
引用 4 楼 mansohu 的回复:
请问,连接池是否适用于cs结构呢?
连接池是.net 内部已处理好的东西,你只需要把连接串写好,基本上不需要你在代码里东改西改的了…… B/S和C/S与连接串没有任何关系, 谁来都是连…… 其它要注意的是每次使用连接, 要注意关闭。
mansohu 2014-04-11
  • 打赏
  • 举报
回复
引用 2 楼 yenange 的回复:
[quote=引用 楼主 mansohu 的回复:] 请问: 1. 是否每次查询数据库时都要做数据库的连接? 2. 是否需要声明成公共变量,以便每次操作数据库时省略掉连接这个过程。请问大家一般是怎么做的? 3. 如果每次都进行连接,会有什么时候弊端? 谢谢! public Cnn Set Cnn = CreateObject("ADODB.Connection") CnnStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=xxxxxx;Initial Catalog=DBname;Data Source=ServerName" Cnn.Open CnnStr
你可以先看下这篇文章, http://www.cnblogs.com/jxnclyk/archive/2010/04/27/1722007.html 一般来说, 你最好配置中写上连接池,.net 在连接串相同的情况下,会用同一个连接池里的连接而不是重新创建的——即使你的代码是new SqlConnection, 最终也不一会新创建连接。  如果在用户量非常小的情况下, 也可以创建一个静态的连接, 所有人共用这个连接即可。 当然, 这样做还是会产生一些问题的。 连接池技术已经非常成熟了, 你不需要考虑很多的。[/quote] 请问,连接池是否适用于cs结构呢?
mansohu 2014-04-11
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
一般来说不建议每次查询都联接,因为这样消耗很多的资源。通常是缓冲池保证联接的重用
真不好意思,我还不懂连接池,过两天研究一下哈,请问对于每个客户端,用一个公共变量是否也可以省略重复的连接呢?另外,如果每个客户端都是这种模式,那么100个客户端的规模对于server2008来说,不是事吧应该
吉普赛的歌 2014-04-11
  • 打赏
  • 举报
回复
引用 楼主 mansohu 的回复:
请问: 1. 是否每次查询数据库时都要做数据库的连接? 2. 是否需要声明成公共变量,以便每次操作数据库时省略掉连接这个过程。请问大家一般是怎么做的? 3. 如果每次都进行连接,会有什么时候弊端? 谢谢! public Cnn Set Cnn = CreateObject("ADODB.Connection") CnnStr = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Password=xxxxxx;Initial Catalog=DBname;Data Source=ServerName" Cnn.Open CnnStr
你可以先看下这篇文章, http://www.cnblogs.com/jxnclyk/archive/2010/04/27/1722007.html 一般来说, 你最好配置中写上连接池,.net 在连接串相同的情况下,会用同一个连接池里的连接而不是重新创建的——即使你的代码是new SqlConnection, 最终也不一会新创建连接。  如果在用户量非常小的情况下, 也可以创建一个静态的连接, 所有人共用这个连接即可。 当然, 这样做还是会产生一些问题的。 连接池技术已经非常成熟了, 你不需要考虑很多的。
發糞塗牆 2014-04-11
  • 打赏
  • 举报
回复
一般来说不建议每次查询都联接,因为这样消耗很多的资源。通常是缓冲池保证联接的重用

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧