现在维护的公司系统每天访问人数800万左右,在数据库连接的时候,数据库频繁报连接池达到最大错误。.net 默认连接池100,也设置了连接池到512个,但是并没有解决问题,依然报连接池达到最大,请高手指点。
错误如下:
A SimpleSql Save Exception Ocurred: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
一般都是因为有sql执行时间太长造成的.
用profiler监视看把太长的找出来.
这种一般加连接池是没意义的.
看了 也没有执行时间很长的。
@枫小子: 你筛选条件选超过300MS的,或者100毫秒的数量要是多肯定受不了的
不过都已经这个流量,没有做缓存吗?
@吴瑞祥: 看了 都没有超过100毫秒的,这个数据是必须存数据库的。
@枫小子:
Audit Login/Logout 这个占用的时间挺长,会不会这里问题。
@枫小子: 要是实在不能减少数据库连接了.那更高端的我就没实际操作过了.我做过的也就减少连接长度和次数了.要是实在单机瓶颈就只能做分布式
@吴瑞祥: 恩 好的 谢谢指点
先使用计划任务将数据缓存到服务器,直接访问缓存,当数据库数据变化时候,再更新缓存数据
Memcache
一天800万的请求,memcache 容量是否够用。
一楼和二楼说的都很对
Memcached存放不经常变动的数据,减少与数据库的交互
如果访问的数据都是需要从数据库中实时读取的话,可以考虑把应用跟数据库分开两台服务器部署,如果一台服务器放数据库还扛不住,可以考虑拆分数据库。
介绍一种简单有效的基于USB口的分布处理方式:一台机器接受服务请求,并通过usb口把数据库请求发送到1-10台机器(usb2.0 480Mbps\USB3.0 5Gbps)上, 这些机器完成数库操作,低成本即可完成大并发量,并发量轻易就可翻倍。
usb口的编程接口,这里有个资料:
http://blog.csdn.net/zzkjliu/article/details/8110718
800W?什么系统?政府部门的系统吧?:
Remember to close the connections. Always
using(SqlConnection conn = new SqlConnection("....")){
//your db execution here.
}
数据库 读取性能问题,建议缓存一些 数据、、、
或者查看一下 哪里死循环,哪里SELECT性能过低。。。或者建议增加数据库索引优化。。。
800w的访问量,可以考虑从硬件方面下手了。。
缓存+读写分离+只读数据库负载均衡