发现公司框架有点问题

         刚结束一个网络银行项目,新版本上线后第二天,中间业务平台突然down掉(即网银的大额转账发中间业务平台,但平台down掉了,所以网银在那等待返回信息,直到60秒返回超时),按说网银中只有和中间业务平台有关的业务受影响,但很多网银用户都投诉个人网银无法登录,卡死在登录首页(附:登录个人网银首页时会查询数据库中的网银公告信息并显示)
         解决上面问题,还要从数据库连接池说起。dbpool(一般将连接数据库缓冲池的数量设置为60,即60个数据库访问句柄,分配给网银20个连接,支付20个,卡通5个等等),现在有两种拿到数据库访问句柄的方式:1每次操作数据库前得到句柄,query或insert后释放该句柄2该客户执行一个网银操作(即执行一个action的execute或submit)前得到句柄,执行此操作后才释放句柄,怀疑公司框架采用的方法2从而导致:当一个交易(此交易首先查询数据库得到客户号,然后发此客户号到核心进行查询)连接核心系统60秒超时,此交易将占有一个访问数据库的句柄,而一分钟内有20个客户进行转帐交易,当第21个客户登录首页时(登录首页交易会查询网银数据库的银行公告信息,访问数据库句柄的线程都锁住了,他就无法访问数据库,就在那儿傻等直到连接数据库超时),就卡在首页不动
         如何判断我们的框架是采用那种方式锁住句柄的呢,看公司源码是一个方法,可公司框架源码都进过加密了,变量都是abcd,读起来很吃力,所以我想了个笨法子:首先我们将缓冲池的链接数量设置少一些设为2。在配置文件中写3个简单交易【A页面进过execute方法跳转到B页面,执行进入execute方法(方式2)中首先执行一条sql1(方式1),执行后再执行休眠1分钟Thread.sleep(1000*60L),然后再执行一条sql2语句(这句话的作用下面会说)】,第二个交易休眠1小时(让他始终占据一个访问数据库句柄线程),第三个交易是执行sql3语句。启动服务器开打并提交A页面,然后提交第二个交易,即现在仅有的2个连接都被我们锁住了。接下来我们执行第三个交易,但此时没有查询网银数据库的句柄可用,故IE卡在那里了。1分钟后(1000*60毫秒),后台日志发现先执行了sql1,然后执行了sql2,最后执行了sql3,则证明:公司框架的一个不足,即在执行过一个execute前拿到一个访问数据库句柄,执行execute之后方才释放此句柄,故会造成上面的现象:其他用户访问网银首页卡在那儿不动无法访问。

猜你喜欢

转载自damiao-cn.iteye.com/blog/277317