mybatis执行比客户端直接执行慢的原因

项目场景:

在使用达梦数据库开发的过程中


问题描述:

查询百万数据库的表,偶尔会碰到通过mybatis执行的语句,相对于在客户端执行的语句慢很多。

原因分析:

是由于我使用#{}绑定的参数类型,与数据库表字段的类型不一致造成的。造成入参传入的数据类型和数据库字段数据类型无法对应,且当数据量大时就会出现替换慢的问题。

List<TcTicketSum> selectPeopleByIssDt(@Param("beginTime") String beginTime,
                                          @Param("endTime") String endTime);
<select id="selectPeopleByIssDt" resultType="com.csair.isa.domain.entity.TcTicketSum">
        SELECT
            AUDITOR_ID ,
            TICKET_TYPE_END ,
            MANUAL_AUDIT_FLAG  ,
            count(MANUAL_AUDIT_FLAG) as ticketCount
        FROM
            ACCA_TICKET_INFO
        WHERE
            ISS_DT between #{beginTime}
          AND #{endTime}
          AND AUDITOR_ID IS NOT NULL
          AND AUDIT_TYPE IS NOT NULL
        GROUP BY
            TICKET_TYPE_END ,
            AUDITOR_ID ,
            MANUAL_AUDIT_FLAG

    </select>

解决方案:

把传入的参数改为了Date类型,发现在mybatis里执行SQL有少许提升,但还是比在客户端执行SQL慢很多。
后来我经常多次尝试,把between改为了大于小于的方式查询。发现瞬间快了很多,基本与客户端执行的时间相差无几了。就是不知道这是什么原理,有大佬知道的求告知我一下。

List<TcTicketSum> selectPeopleByIssDt(@Param("beginTime") Date beginTime,
                                          @Param("endTime") Date endTime);
<select id="selectPeopleByIssDt" resultType="com.csair.isa.domain.entity.TcTicketSum">
        SELECT
            AUDITOR_ID ,
            TICKET_TYPE_END ,
            MANUAL_AUDIT_FLAG  ,
            count(MANUAL_AUDIT_FLAG) as ticketCount
        FROM
            ACCA_TICKET_INFO
        WHERE
            ISS_DT &gt; #{beginTime}
          AND ISS_DT &lt; #{endTime}
          AND AUDITOR_ID IS NOT NULL
          AND AUDIT_TYPE IS NOT NULL
        GROUP BY
            TICKET_TYPE_END ,
            AUDITOR_ID ,
            MANUAL_AUDIT_FLAG

    </select>
  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当MyBatis的count语句返回null时,可能是由于以下几个原因引起的: 1. 数据库查询没有匹配到任何记录。如果count语句中的条件不满足数据库中的任何记录,那么count语句返回null是正常的。 2. SQL语句错误。请检查SQL语句中是否存在语法错误或逻辑错误。可以使用数据库客户端工具执行相同的SQL语句,看是否能够正常返回结果。 3. MyBatis配置有误。请检查MyBatis的配置文件,确保数据库连接信息正确,并且mapper文件中的count语句与数据库表结构相匹配。 4. 数据库连接问题。请确认数据库连接是否正常,可以通过测试连接数据库的方式来验证。 如果以上原因都排除,仍然返回null,可以尝试使用其他方式进行统计,例如使用MyBatis的select语句进行count统计,或者使用Java代码对查询结果进行判断处理。另外,可以尝试使用debug模式进行调试,查看具体的执行过程,以便找出问题所在。 ### 回答2: 当MyBatis的count方法返回null时,通常是由于以下几个原因: 1. 查询条件不满足:count方法通常用于统计满足特定条件的记录数。如果查询条件不正确或者没有满足条件的记录,则count方法会返回null。此时,可以检查查询条件是否正确,并且确认数据库中是否存在满足条件的数据。 2. SQL语句问题:count方法的实现依赖于配置文件中的SQL语句。如果SQL语句有语法错误或者逻辑问题,可能会导致查询失败并返回null。可以查看SQL语句是否正确,并确保其逻辑正确。 3. 数据库连接问题:count方法执行时需要与数据库建立连接。如果数据库连接配置有问题或者数据库服务器无法访问,则会导致查询失败并返回null。可以检查数据库连接配置是否正确,并确保数据库服务器处于可用状态。 4. 数据库表结构变更:count方法执行时需要根据数据库表结构来统计记录数。如果数据库表结构有变更,可能会导致count方法无法执行或返回null。可以检查数据库表结构是否与MyBatis配置文件中定义的一致,并确保没有发生表结构变更。 综上所述,当MyBatis的count方法返回null时,可以通过检查查询条件、SQL语句、数据库连接以及数据库表结构来解决该问题。 ### 回答3: 当MyBatis的count返回null时,可能存在以下几种原因: 1. 数据库查询结果为空:在执行查询操作时,MyBatis的count语句可能返回null是因为查询条件不满足,没有查询到任何符合条件的记录。这种情况下,可以检查一下查询条件是否正确,是否与数据库中的数据匹配。 2. MyBatis中的count语句配置有误:可能是在配置MyBatis的映射文件中,count语句的配置有误,导致返回null。可以检查一下映射文件中count语句的配置是否正确,包括SQL语句的编写和参数的传递等。 3. 数据库连接问题:在执行count操作时,可能存在数据库连接问题,导致查询无法正常执行,返回null。可以检查一下数据库连接是否正常,是否能够正常访问数据库。 4. 数据库中的数据为空:如果数据库中没有任何数据,那么执行count操作也会返回null。可以检查一下数据库中是否有符合查询条件的数据。 针对以上情况,可以通过以下方式来解决: 1. 检查查询条件是否正确,并确认是否有符合条件的数据。 2. 检查MyBatis的映射文件中count语句的配置是否正确。 3. 检查数据库连接是否正常,是否能够正常访问数据库。 4. 确认数据库中是否有符合查询条件的数据。 根据具体情况,选择相应的解决方法来解决MyBatis count返回null的问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值