事实证明全局Connection不好使!
特别在用了连接池的情况下,很容易造成连接丢失的情况,以下是原因:
我们还是应该按照教科书写的那样,
需要用到的时候New一个新的连接,用完立即Close,
事实上因为有连接池的存在,系统并不会频繁做Open和Close的动作,只有当一个连接确实超过了Wait_Timeout设定值时才会真的去Open一次。
测试:首先我们将wait_timeout 和interactive_timeout 都设为10秒(PS:这两个mysql参数必须同时设定才能生效)
然后不使用全局Connection,每次刷新都New一个新的。
则当一个Connection被创建后,10秒内,无论你Open或Close多少次,都是使用同一个Connection,
注意:以下数值没有通用性,仅为了叙述方便,此值是我用的腾讯云返回一个小数据库常规查询所消耗的时间。
运行程序,创建Connection,然后频繁点击刷新按钮,观察计时器,大概60-80ms之间徘徊(说明Connection通过ADO.NET自动从连接池取出,并没有真正创建)
然后停顿10秒以上,再点击一次刷新按钮,这时候计时器大概100ms左右,说明Connection已经自动被服务器Kill了,客户端只得重新Open一个Connection,耗用了近40ms的时间。
结论:将wait_timeout设为10秒只是为了测试方便,真实情况下没必要设得这么低,一般设为3600秒即一小时即可,
该值设得太长也不好,大量的Connection短期内不被释放,则增加了服务器负担。
特别在用了连接池的情况下,很容易造成连接丢失的情况,以下是原因:
MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接的空闲时间超过8个小时,MySQL将自动断开该连接,而连接池却认为该连接还是有效的(因为并未校验连接的有效性),当应用申请使用该连接时,就会导致上面的报错。我们还是应该按照教科书写的那样,
需要用到的时候New一个新的连接,用完立即Close,
事实上因为有连接池的存在,系统并不会频繁做Open和Close的动作,只有当一个连接确实超过了Wait_Timeout设定值时才会真的去Open一次。
测试:首先我们将wait_timeout 和interactive_timeout 都设为10秒(PS:这两个mysql参数必须同时设定才能生效)
然后不使用全局Connection,每次刷新都New一个新的。
则当一个Connection被创建后,10秒内,无论你Open或Close多少次,都是使用同一个Connection,
注意:以下数值没有通用性,仅为了叙述方便,此值是我用的腾讯云返回一个小数据库常规查询所消耗的时间。
运行程序,创建Connection,然后频繁点击刷新按钮,观察计时器,大概60-80ms之间徘徊(说明Connection通过ADO.NET自动从连接池取出,并没有真正创建)
然后停顿10秒以上,再点击一次刷新按钮,这时候计时器大概100ms左右,说明Connection已经自动被服务器Kill了,客户端只得重新Open一个Connection,耗用了近40ms的时间。
结论:将wait_timeout设为10秒只是为了测试方便,真实情况下没必要设得这么低,一般设为3600秒即一小时即可,
该值设得太长也不好,大量的Connection短期内不被释放,则增加了服务器负担。