持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
前言
小BUG中的大问题 —— CommonDao close 的坑
BUG就不具体说是什么了,只说技术上的表现,同样的创建数据库连接方式,同样的参数,同样的调用,在不同的方法中,数据插不进数据库了
然后就在疯狂的找不同。。。然后疯狂的试验。。。并在一个封装的方法中找到了问题。。。一个 close ⬇️
在这个封装的方法前后,调用什么都一样的方法插入数据库,在封装的方法之前都是正常的,在封装的方法之后的都是不通的,那么应该就是这个引起的,那么开始深挖是为什么
表现和原因
那么可以假设问题是出在了 dao 是由 new CommonDao4sSelf 创建的实例 (全局搜索是最简单的)
开始找 CommonDao4sSelf 是从哪里引进来的,继承和引用都有可能,需要都差一遍
最后在 Init.inc.php 文件中找到了
然后进去 CommonDao4sSelf.php 文件,解读源码
将 $mydbpools 输出,就会发现一个问题,只要是close过的就会在 数据库连接池子中留下标记,没有close过的 池子中什么都不会留下
这次BUG之所以会出现的原因就是因为,一旦程序中,恰巧连接同一个数据库,并且第一次连接之后就关闭了,导致第二次连接时,连接不上更新不了数据(不会报任何的错,也不会终止程序进行)
总结
解决方案:
1、把 $dao->close 干掉 || 再最后一次连接(或者报错)的时候进行close
2、把 CommonDao4sSelf.php 文件中的 判断当前数据库连接是否存在的判断干掉 (亲测有效)
3、业务代码中在mydbpools 中,本次(全部)纪录的排除掉,然后将 $mydbpools 重新赋值 (亲测有效)
4、在 close 方法里处理 $mydbpools (待测)