1.1 问题描述
Doma连接Mysql数据库进行分页时,查询出来的总数据显示总是为1(不是想要的数据结果)。界面现象如下:
1.2 问题分析
Doma调用MySql语句时会自动在sql语句中加入sql_calc_found_rows关键字,然后配合found_rows()函数的使用,统计出去除limit 限制条件的所有数据的总数。语句如下:
select sql_calc_found_rows rce_message_id, message_service_id, message_name, message_description, depart_path, create_time, createby, update_time, updateby, update_count, delete_time, deleteby, delete_flag from rce_message_dict where delete_flag='0' order by update_time desc limit 0, 10
. . . . . . select found_rows()
|
found_rows()函数统计出的数量是离它最近的一次查询语句,所以如果在上面的两条查询语句之间有其他的查询语句出现就会导致结果数据不是我们实际想要得到的结果。(结果不对,不代表查询错误)
那么在执行上面两条语句之间发生了什么?
让我们来看一个配置文件:
没错这就是数据库连接池的配置文件,在配置项有个validationQuery配置项,该配置项的作用就是来验证数据库连接的有效性。常见的validationQuery语句有:
数据库 | validationQuery(仅供参考,并非固定) |
Oracle | select 1 from dual |
DB2 | select 1 from sysibm.sysdummy1 |
mysql | select 1 |
microsoft sql | select 1 |
hsqldb | select 1 from INFORMATION_SCHEMA.SYSTEM_USERS |
postgresql | select version(); |
ingres | select 1 |
derby | select 1 |
H2 | select 1 |
还有另外一个配置项testOnBorrow,就是在进行borrowObject进行处理时,对拿到的connection进行validateObject校验,判断其是否有效。
这样问题就出现了,在执行select found_rows()语句之前,其实就执行了配置项validationQuery中的语句“select 1”,所以返回结果就变成了1。
1.3 解决方法
思路很清楚,只要在执行select found_rows()语句之前不去执行validationQuery中的语句就可以了。如何做?
在相应的查询方法上加上事务,这样就能保证使用的是同一个connection,就不会去执行validationQuery中的验证语句了。
最终界面效果:
以上资料仅供参考
友情链接:http://commons.apache.org/proper/commons-dbcp/configuration.html
http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html