最近公司一个项目数据库在由Oracle更换为postgre过程中,项目使用的数据库框架为IBatis框架,在升级完后运营测试时,遇到了数据库的异常报错A command is already in progress.出现异常的是一条普通的select查询语句,而同样的查询在Oracle中并没有出现,一开始以为是线程并发或者上一次执行异常导致语句未正常结束,解决方向转向查询多线程和连接池的问题,怀疑每个线程不是独立的连接池的连接实例,但是并没有头绪,按这个报错去查了一些资料,然而没有得到什么有用的信息。
重新整理头绪之后,按这字面意思还是线程执行查询还未完成就又发起了另一个查询,重新调试检查了这一块代码和查询语句,发现查询语句使用了IBatis的懒加载lazyLoad,然后查询结果Entity中用到了懒加载查询的从表Entity,导致在执行主表的查询的同时在映射为Entity的时候就需要在去执行从表查询的语句,就在此时从表的查询语句就会报错,报的错就为上述描述的A command is already in progress.将查询的懒加载去除之后就没有问题。
由此可见,在使用postgre+ibatis的数据库底层框架时,查询中应该慎用或者不用懒加载,应该考虑使用其他方式来避免懒加载的功能,不能为了少些查询,懒加载可以用到Entity的从表实体时才触发执行查询,就随便使用懒加载,有可能会造成其他的一些不可预见的问题。