正常情况下,对于数据库的open然后close,是没有任何问题的
但是当大家觉得这种open或者close多了的时候会影响数据库的性能,嗯,经过测试确实很影响性能。可能相差很多倍;
于是产生了连接池和某些其他持久化连接方案。
但是有些东西非常重要,就是连接次也好,其他持久化也好,对于数据库来说都不是即时关闭,有的时候会导致在数据库层面打开的socket一直存在,存在达到8个小时;
很多数据库连接池的设计可能对于数据库的通信并不熟悉,或者很多人在使用方案的不完备导致数据库的连接关闭没有
最后达到了max_connection.然后新的数据库请求进不来,从而整个系统瘫痪。这种瘫痪其实并不是大流量导致的,而是数据库连接释放的问题;
所以有的时候对于很多系统来说使用的技术越落后反而越稳健。
wait_timeout
interactive_timeout
上面这两个参数都是8个小时。
如果你使用php的mysqli的持久化方案,某些情况下php异常后,在max_connection以上的用户就进不来了。必须等8个小时自然释放。
由于mysqli在持久化的时候对于持久化的标识有ip做为依据,所以你在同一个ip的测试下始终都是一个mysql的连接,但是ip一多,你就懂了。
这种问题的根源其实有2:
1,对于连接层的方案不熟悉使用了方案;
2,对于数据库的连接机制不熟悉写了连接层。
那种只open,不close的情况都不说了。
补充一下:
连接池里面的连接数一定要小于数据库允许的max_connection,留出一下活路;或者某些关键地方的数据库操作不使用连接池?