2012-10-25 102 views
4

我想知道为什么MyBatis是在我的应用程序。MyBatis很慢

对于SELECT COUNT(*),所花费的时间是:

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

缓存,最有可能的,是使后续请求更快。

配置

  • 3层(WPF UI - Java后端 - Oracle数据库)
  • 的JBoss服务器公开了Java已备份的Web服务的WPF UI
  • 请求时间 == WPF UI发送和接收结果之间花费的时间
  • Spring Framewor ķ使用

途径试图

  1. 禁用日志

    我不知道,如果是禁用日志记录子系统和log4j的有差别;但是,我得到的最好的是SELECT COUNT(*) 15秒。

  2. 禁用缓存和延迟加载

    这也可能是在大多数做了一个5秒的差别。

请帮忙?

  1. 使用明确的结果映射,通过关闭自动映射。 (请参阅结果图here)。使用合并。 (请参阅环境here)。
  2. 交易帮助加快SQL语句与子查询

上述技术这里列出:

  1. MyBatis forums
  2. JBoss Best Practices(第9页)

又如

对于嵌套SQL语句与2的连接和1子查询,所花费的时间是:

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

您是否看到类似的行为直接在数据库上运行相同的查询? – AngerClown

+0

@AngerClown当我直接查询时,响应非常快。 “SELECT COUNT(*)”约为0.3秒,而具有2个连接和子查询的查询约为1.5秒。 – mauryat

回答

8

我得到解决的问题! MyBatis现在需要同时查询为直接针对数据库运行。

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

嵌套结果(相对于嵌套选择),这是上面提到的同一页上也有描述。

到我的SQL查询中所做的与4的不同连接是巨大的:

  • 前: 38号
  • 后: 3秒

我跟踪这个问题倒通过将其隔离到JUnit测试用例大约MyBatis-Spring(删除JBoss部分)。