数据库访问层如何优化实现高并发??

MasDn 2009-07-30 11:19:47
加精
做了几年.Net的开发.这个问题越来越迷糊了.

希望高手进来解释一下.

比如做的是Asp.Net的程序.

一个页面是个查询绑定数据到页面上.


数据库访问层是一个静态的单例来实现的,里面就是

conn.open();

Adapter.fill(ds);

conn.close();

之类的方法,其他通过调用这些方法来获得数据.

那么请问:

1:同时访问该页面的IP有50个,这个时候数据库连接会有多少个?

2:我理解的是应该只有 1 个,那么1个效率是不是太慢? 而且数据请求的是序列的还是错序的?(里面没有使用异步).

3:有朋友说这里面需要使用Lock来实现,不然会出现异常,具体会怎么样的异常他也说不清,我理解的asp.net的页面访问是以线程方式实现的,多人访问,那么就是多线程访问静态对象,但是我的静态对象里只有方法不存在暂存什么数据,应该也不会错乱的呀,各位觉得如何?


先这几个问题吧.

各位即使不回答几个问题,觉得你现在使用的实现的方式比我的好,也请简单说明,学习了...

先感谢一番,这里只讲Asp.net里的机制 不讲数据库.


...全文
3021 101 打赏 收藏 转发到动态 举报
写回复
用AI写文章
101 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzq12345 2010-01-28
  • 打赏
  • 举报
回复
[Quote=引用 64 楼 ljh6680374 的回复:]

[/Quote]
i fu l you
fcpslove 2009-09-07
  • 打赏
  • 举报
回复
只看不说,期待SP1234的出现。。。
buqi1234 2009-08-06
  • 打赏
  • 举报
回复
匆匆岁月我想你,心中有话说给你。说说笑笑想想你,http://www.k9991.com/ 注意身体提醒你。在不在意却由你,发个信息问候你。不是存心想烦你,真的真的想念你!
HenryLubin 2009-08-04
  • 打赏
  • 举报
回复
1.可以使用数据库默认的连接池功能,即在链接字符串中定义
2.在中间层中自己写程序来实现连接池的功能。
zwyDell 2009-08-04
  • 打赏
  • 举报
回复
学习~
hui2tao 2009-08-04
  • 打赏
  • 举报
回复
学习了
jianb103 2009-08-04
  • 打赏
  • 举报
回复
好主题,值得学习
德仔 2009-08-03
  • 打赏
  • 举报
回复
看看这个,也许对你有帮助
[译]连接池和 "Timeout expired"异常

http://www.dezai.cn/blog/article.asp?id=226#comm_593
deifyjack 2009-08-03
  • 打赏
  • 举报
回复
看看~~~~~~~~~~~~
toshabca 2009-08-02
  • 打赏
  • 举报
回复
好贴,力顶!
tqwboy 2009-08-02
  • 打赏
  • 举报
回复
学习,mark一下
wshcdr 2009-08-02
  • 打赏
  • 举报
回复
UP
hsdyyz 2009-08-02
  • 打赏
  • 举报
回复
虽然还看不懂,看来还学得太少了
MasDn 2009-08-02
  • 打赏
  • 举报
回复
结帖咯!!!
MasDn 2009-08-02
  • 打赏
  • 举报
回复
应有网友留言说要在我结帖的时候总结一下,呵呵 毕竟领悟和总结还是有点差距的,所以多花了两天,下面是我摘出的对我比较有用的回复。


cpp2017:#3
这个连接对象(物理连接)也不是每一次请求就会有一个新的,这是连接池在管理,找出空闲的物理连接,如果没有,就再创建一个,
幕白兄的这几句话的意思我理解下来,好象是说一个客户端连接到服务器可能会有多个连接,以前我一直认为这些连接都是最底层的socket进行通信的,而数据库是有固定的连接端口,同一个连接端口不可能同时有多个连接,那么我就认为一台客户端到服务器只会有一个连接.但是这里讲到连接池,那么只有一个连接还要连接池做什么呢?所以我想SQL连接应该是在socket连接之上模拟的通道,可以模拟多个通道,以便更多的连接得到及时响应.

homesos:#7
虽然只NEW了一次,但OPEN CLOSE了N多次,OPEN时会建立数据库连接,CLOSE关闭连接

Open的时候会打开新连接??不知道,也没测试过,但是确实很有可能.

zyug:#12
呵呵.高并发也是关于连接池的

连接池就是一个线程.维护了连接的一个队列

对于一个连接字符串.默认的连接池是打开,并且默认最大值是 100个
如果Close之后这个连接其实是保持在连接池中,并没有立既销毁,
而是下一个 new Connection().Open()
的时候直接使用的


对于同样的连接字符串,如果再来一个数据连接请求,最大值没有达到 100,
那么,会创建一个连接
,如果已经达到了 100,会抛出连接池已满的异常


如果你要高并发,建议你增大连接池大小,指定MaxPoolCount =1000或是更大(好像是这样拼的具体查msdn)

连接池对应连接字符串,如果字符串不同,少个多个空格,连接池都不同


这里感谢zyug讲到了连接池的基本概念,希望对其他浏览者有用.

Tomzzu:#29
注意两个地方, 别的不多说
1. 使用连接池, 每个访问都来个 conn.open(); conn.close(); 很恐怖的, 开销太大
2. 使用线程池, 高并发的程序, 肯定要用的

这两点确实是需要注意的,但是open跟close的开销要影响很大的效率的时候,你的数据库操作的确实已经达到很大的一个压力值了.

mb_1985:#32
.net 2.0默认就是使用连接池的,无需多关心,放心使用是了

原来默认就使用了连接池了..


xuejie09242:#56
如果你的conn也是单态的话,那可能会出现性能问题吧,因为所有的前功尽弃连接都在用一个连接对象,这和连接池已经没有关系了。应该还是每次都new一个conn好一些吧。

没错这也是我那位朋友担心的地方,单例里的conn被同时请求和访问会不会有问题?
这些单例里的方法会不会被同时请求访问???如果不会的话,那么是不是在排队??效率怎么如何?
如果可以被同时访问,那么会不会存在一个方法刚把conn.open另外一个就close掉了呢??这些我都还不是太清楚,得测试才知道.
.


jaylongli:#61
1.楼主应该用的连接池,那这个连接数无法确定,因为一般情况下是打开一个连接进行操作,结束后就进行关闭了,连接就返回到连接池中,在进复用,所以无法确定个数。连接池的个数 可以自己进行配置,并不是越大越好,最后根据预期用户访问量来,因为维持连接数需要内存来维护的。

2。CONN对象只有一个,但是连接不只一个。打开关闭 就是新建连接于关闭连接的过程,只不过是在池中。

3.线程你知道了,即局部变量没问题,不是产生冲突,但是全局变量或者静态变量就会有冲突,所以最好加个锁,或者用局部变量(方法内的变量,非对象变量)。


xihuag:#70
好像听某些高人说过, 以前用DAO dll时(ASP时代,不是.net时代),你每次new 一个connection 对象时, 系统可能不是真的给你创建了一个对象,他可能是从池里给你抓了个。 这是系统维护的, 你大可放心使用 new ,不用担心创建对象太多。反而是你共用一个 connection (就是楼主的方式)会影响性能。


在.net时代会不会变了? 不清楚, 楼主可以去测试一下, 实践是检验真理的唯一标准!

确实要测试下才知道..

likevs:#76
楼主,我是新手,最起码对于中深层来说是新手,所以不会讨论

但我见过老外的程序,数据库操作方面的,他们用了静态类,静态方法,后来我也问过别人,静态类到底能不能提高性能,生命周期如何等问题,到现在还一样迷糊中

当时查出静态类对象,自始至终就实例化一次(我理解成全局共享),这样能不能并发还是个味知数,但人家用了,当然有用它的理由,只不过我还是没法明白

看来老外跟我用一样的原理,哈哈..

dvdvip:#77 好象被删除了。。。

用存储过程和SQLReader就能达到最高速度和能效!

不要在程序里直接写SQL语句和LING!

SQLReader??高效??我理解的SQLReader是数据量很大的时候,要需要一步一步的进行读取,但是我确实需要这么多数据,你一步步给我 那不是吊我胃口么!!..

liveweb:#88
呵呵,刚写了个关于数据静态缓存的技术介绍"凌驾于数据库之上的数据静态缓存技术思考和范例"

推荐自己写的东西,虽然我还没看完,但是能凌驾于数据库之上 还是很有兴趣的.
liveweb 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 79 楼 cam6778102 的回复:]
引用 77 楼 dvdvip 的回复:
用存储过程和SQLReader就能达到最高速度和能效!

不要在程序里直接写SQL语句和LING!

切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!切记!


http://www.zhu-ji.net/?fromuid=831

朋友你似乎忘记了“缓存(cache)”,在必要时对数据进行缓存,而不用频繁的连接数据库和操作数据库。
合理运用缓存和数据库操作才能保证性能。
------
至于LZ的并发问题,可以利用一些压力测试软件来测试。
祝进步~
[/Quote]

呵呵,刚写了个关于数据静态缓存的技术介绍"凌驾于数据库之上的数据静态缓存技术思考和范例"
wuxuankaishi 2009-08-02
  • 打赏
  • 举报
回复
关注中
超维电脑科技 2009-08-02
  • 打赏
  • 举报
回复
学习了。
超维电脑科技 2009-08-02
  • 打赏
  • 举报
回复
学习了
xuershan 2009-08-02
  • 打赏
  • 举报
回复
访问人多了以后会出现连接已关闭错误
加载更多回复(77)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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