首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

数据库访问层怎么优化实现高并发?

2012-01-23 
数据库访问层如何优化实现高并发??做了几年.Net的开发.这个问题越来越迷糊了.希望高手进来解释一下.比如做

数据库访问层如何优化实现高并发??
做了几年.Net的开发.这个问题越来越迷糊了.

希望高手进来解释一下.

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

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


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

conn.open();

Adapter.fill(ds);

conn.close();

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

那么请问:

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

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

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


先这几个问题吧.

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

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




[解决办法]
这个连接对象(物理连接)也不是每一次请求就会有一个新的,这是连接池在管理,找出空闲的物理连接,如果没有,就再创建一个,


[解决办法]
虽然只NEW了一次,但OPEN CLOSE了N多次,OPEN时会建立数据库连接,CLOSE关闭连接
[解决办法]
呵呵.高并发也是关于连接池的

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

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



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


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

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

[解决办法]
一般没什么问题,毕竟sql执行时间不会太长,同一秒内并发也不会有这么多
[解决办法]
博客园老赵刚写过这方面的文章,我的IE6打不开,你自己查一下。记得:

1、所有连接都是放在连接池里的。连接池里的链接数量是会根据并非情况自动调整的,而的最大(小)限制可以自己指定(web.config),也可使用默认(默认多少是根据cpu来的);

2、连接本身是一次一个;所有的连接对象按“队列”排队;

3. if you don't use mulitple threads, you don't need lock.
[解决办法]
注意两个地方, 别的不多说
1. 使用连接池, 每个访问都来个 conn.open(); conn.close(); 很恐怖的, 开销太大
2. 使用线程池, 高并发的程序, 肯定要用的
[解决办法]
连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接。一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程。

当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连接池而不是直接释放。

如果连接生存期已过期,或者连接池管理程序检测到与服务器的连接已断开,连接池管理程序将从池中移除该连接。只有在尝试与服务器进行通信后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。连接池管理程序会定期扫描连接池,查找已释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。


参考

[解决办法]
楼主,问题是并发,怎么内容是效率啊
如果是并发查询这个无所谓的,因为查询的都是一个内容
如果是并发添加,修改,就一定要上锁了。
其实您是想讨论并发下的效率问题吧??
我是这样想的首先是并发
并发的过程应该是很小的,只有当用户达到了一定的程度,或者是特定的时间才会产生
网站的访问就像工厂上班打卡,当你只有一个打卡机的时候就人在多也不会产生并发
人数多了就会产生延时,这时候就有了多打卡机同时工作,从而有了并发
暂时不讨论链接池的问题因为他是默认打开的,我想没有人回去显示的把它关闭
也因为我们的工厂不一样,工厂的人数也不一样
数据有效的链接就是open,那么控制好了open就能很好的提高效率了
我有两个方法,一:快开慢关,二:快开快关
很显然,在早上8:40到9:20之时候打卡的人多
就用一方案,打卡机链接数据库open然后从8:40到9:20一只打开
用来处理高密集性的打卡,
然后其余时间用方案二,当有人打卡的时候在open,打卡完毕马上clos
——————————————————
回到网站上,首先第一就是找到一个压力点,知道了压力点才能有针对性的优化
也可以从逻辑上入手,吧一写相关的逻辑归纳同时提交意见少链接数,但相对的要增加链接时间

最后给出最有效最直接的方法,"在买个服务器"
[解决办法]
除了连接池外,存储过程使用事务啊,没见过出错的情况。
连接池默认上限是整100,前些日测试并发数的时候1000线程死循环发送查询请求,MS SQL那边只有100个连接占用。
[解决办法]
如果你的conn也是单态的话,那可能会出现性能问题吧,因为所有的前功尽弃连接都在用一个连接对象,这和连接池已经没有关系了。应该还是每次都new一个conn好一些吧。
[解决办法]
1:同时访问该页面的IP有50个,这个时候数据库连接会有多少个?

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



3:有朋友说这里面需要使用Lock来实现,不然会出现异常,具体会怎么样的异常他也说不清,我理解的asp.net的页面访问是以线程方式实现的,多人访问,那么就是多线程访问静态对象,但是我的静态对象里只有方法不存在暂存什么数据,应该也不会错乱的呀,各位觉得如何?
===========================================================
上面讨论的问题,讨论着讨论着 渐渐变成对数据库连接池的打开关闭的讨论了。
我说下我个人的 观点,如果有问题欢迎指正

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

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

3.线程你知道了,即局部变量没问题,不是产生冲突,但是全局变量或者静态变量就会有冲突,所以最好加个锁,或者用局部变量(方法内的变量,非对象变量)。
[解决办法]
使用单件模式,保证每次只有一个用户独占资源.
[解决办法]
考虑全局只有一个conn的情况,任何查询都返回这一conn对象。并发情况下,当执行一个查询时,open后,这时另外一个查询再调用这一conn对象,会发生什么情况?
感觉这方面是个瓶颈,连接在连接池中,但对象呢?应该是要等上个查询处理完了,才能再处理下个查询吧?
如果Connection是new的,就可以利用连接池了。
[解决办法]
好像听某些高人说过, 以前用DAO dll时(ASP时代,不是.net时代),你每次new 一个connection 对象时, 系统可能不是真的给你创建了一个对象,他可能是从池里给你抓了个。 这是系统维护的, 你大可放心使用 new ,不用担心创建对象太多。反而是你共用一个 connection (就是楼主的方式)会影响性能。


在.net时代会不会变了? 不清楚, 楼主可以去测试一下, 实践是检验真理的唯一标准!
[解决办法]
楼主,我是新手,最起码对于中深层来说是新手,所以不会讨论

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

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

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

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

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




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

[解决办法]
探讨
引用:
用存储过程和SQLReader就能达到最高速度和能效!

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

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


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

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

热点排行