Mysql分页数据显示总数恒为1问题的分析与解决

1.1 问题描述

Doma连接Mysql数据库进行分页时,查询出来的总数据显示总是为1(不是想要的数据结果)。界面现象如下:

143606_0BMT_2829129.png

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()函数统计出的数量是离它最近的一次查询语句,所以如果在上面的两条查询语句之间有其他的查询语句出现就会导致结果数据不是我们实际想要得到的结果。(结果不对,不代表查询错误

那么在执行上面两条语句之间发生了什么?

让我们来看一个配置文件:

143647_Y5dP_2829129.png

没错这就是数据库连接池的配置文件,在配置项有个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中的语句就可以了。如何做?

143858_nS7D_2829129.png

在相应的查询方法上加上事务,这样就能保证使用的是同一个connection,就不会去执行validationQuery中的验证语句了。

最终界面效果:

143913_wwDT_2829129.png

以上资料仅供参考

友情链接:http://commons.apache.org/proper/commons-dbcp/configuration.html

            http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html

转载于:https://my.oschina.net/syuhaitao/blog/698469

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值