扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
数据库访问层如何优化实现高并发?
比如做的是Asp.Net的程序. 一个页面是个查询绑定数据到页面上.
数据库访问层是一个静态的单例来实现的,里面就是
conn.open();
Adapter.fill(ds);
conn.close();
之类的方法,其他通过调用这些方法来获得数据.
那么请问:
1:同时访问该页面的IP有50个,这个时候数据库连接会有多少个?
2:我理解的是应该只有 1 个,那么1个效率是不是太慢? 而且数据请求的是序列的还是错序的?(里面没有使用异步).
3:有朋友说这里面需要使用Lock来实现,不然会出现异常,具体会怎么样的异常他也说不清,我理解的asp.net的页面访问是以线程方式实现的,多人访问,那么就是多线程访问静态对象,但是我的静态对象里只有方法不存在暂存什么数据,应该也不会错乱的呀,各位觉得如何?
高并发也是关于连接池的
连接池就是一个线程.维护了连接的一个队列
对于一个连接字符串.默认的连接池是打开,并且默认最大值是 100个
如果Close之后这个连接其实是保持在连接池中,并没有立既销毁,
而是下一个 new Connection().Open()
的时候直接使用的
对于同样的连接字符串,如果再来一个数据连接请求,最大值没有达到 100,
那么,会创建一个连接,如果已经达到了 100,会抛出连接池已满的异常.
如果你要高并发,建议你增大连接池大小,指定MaxPoolCount =1000或是更大(好像是这样拼的具体查msdn) 连接池对应连接字符串,如果字符串不同,少个多个空格,连接池都不同
连接池允许应用程序从连接池中获得一个连接并使用这个连接,而不需要为每一个连接请求重新建立一个连接。一旦一个新的连接被创建并且放置在连接池中,应用程序就可以重复使用这个连接而不必实施整个数据库连接创建过程。
当应用程序请求一个连接时,连接池为该应用程序分配一个连接而不是重新建立一个连接;当应用程序使用完连接后,该连接被归还给连接池而不是直接释放。
如果连接生存期已过期,或者连接池管理程序检测到与服务器的连接已断开,连接池管理程序将从池中移除该连接。只有在尝试与服务器进行通信后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。连接池管理程序会定期扫描连接池,查找已释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者