日期:2014-05-20  浏览次数:20407 次

数据库访问层如何优化实现高并发??
做了几年.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个效率是不是太慢? 而且数据请求的是序列的还是错序的?(里面没有使用异步).