4

我想知道为什么 MyBatis 在我的应用程序中运行缓慢

对于 a SELECT COUNT(*),所用时间为:

  1. 20 秒 - 第一个请求
  2. 2-3 秒 - 后续请求

缓存很可能使后续请求更快。

配置

  • 3 层(WPF UI - Java 后端 - Oracle 数据库)
  • JBoss Server 将 Java Backed 作为 WPF UI 的 Web 服务公开
  • 请求时间== WPF UI 发送和接收结果之间的时间
  • 正在使用的Spring 框架

尝试的方法

  1. 禁用日志记录

    我不知道同时禁用日志子系统和 log4j 是否会有所不同;但是,我得到的最好成绩是 15 秒SELECT COUNT(*)

  2. 禁用缓存和延迟加载

    这也可能最多产生 5 秒的差异。

以下有帮助吗?

  1. 使用显式结果映射,通过关闭自动映射。(请参阅此处的结果图)。
  2. 使用池化。(请参阅此处的环境)。
  3. 事务是否有助于加快带有子查询的 SQL 语句?

此处列出了上述技术:

  1. MyBatis 论坛
  2. JBoss 最佳实践(第 9 页)

另一个例子

对于具有 2 个连接和 1 个子查询的嵌套 SQL 语句,所用时间为:

  1. 60-90 秒 - 第一次请求
  2. 2-3 秒 - 后续请求
4

1 回答 1

8

我解决了问题!MyBatis现在查询与直接针对数据库运行所需的时间相同。

这是N+1 选择问题(这里很好地描述)。

解决方案

嵌套结果(与嵌套选择相反),这也在上面提到的同一页面上进行了描述。

它对我的带有 4 个连接的 SQL 查询的影响是巨大的:

  • 之前: 38 秒
  • 之后: 3 秒

我通过将其隔离到MyBatis-Spring周围的JUnit测试用例来跟踪问题(删除了JBoss部分)。

于 2012-11-15T15:55:48.027 回答