【问题标题】:Java + Spring + Hibernate: "order by" slow on productionJava + Spring + Hibernate:生产“order by”缓慢
【发布时间】:2015-04-30 14:51:11
【问题描述】:

我有一个 Java Spring 服务器,使用 Hibernate 和 MySQL,我在我的数据库中有一个视图,我已经将它映射为一个带有 hibernate 的实体。

视图是完全平坦的,没有对其他实体的引用。没有获取等。

我可以使用简单的选择毫无问题地查询视图,既可以直接在 sql server 上使用“Workbench”,也可以使用 hql。
在本地,我也可以使用对性能没有明显影响的“order by”子句。

我的问题是,当我移动到开发服务器时,“order by”子句会导致查询非常慢,从而导致超时。
仅当服务器进行 hql 查询时才会发生这种情况。
我仍然可以使用“Workbench”直接查询开发数据库,​​而不会出现性能问题。

两个服务器之间的唯一区别(我能想到的)是开发服务器部署在 Google 的 appengine 上,并且休眠驱动程序不同。
在本地服务器上我使用com.mysql.jdbc.Driver,在appengine 上使用com.mysql.jdbc.GoogleDriver

我的本​​地数据库是 MySQL 数据库,而开发者是在 Google 的 Cloud SQL 上,这也是 MySQL(几乎)。

在我的 Dev DB 上,视图中总共有大约 28000 行,而在我的本地 DB 上,我有大约 21000 行,所以这也不应该有所作为。

如果您认为有帮助,我可以添加代码。我不知道从哪里开始。

非常感谢您。

【问题讨论】:

  • 您在本地使用mysql,您是否也在应用引擎或其他数据存储上使用mysql?
  • 云 SQL。我会更新我的问题。
  • 慢意味着返回 25 个结果至少需要 30 秒。我不知道 Google appengine 服务器在 30 秒后触发超时异常有多久了。

标签: java mysql spring hibernate google-app-engine


【解决方案1】:

我将启用“show_sql=true”以查看生成的查询,并将“GoogleDriver”与本地数据库一起使用以消除驱动程序的任何问题。

是否可以从本地工作区连接到 DEV DB?如果是这样,请尝试使用“com.mysql.jdbc.Driver”来消除 DEV DB 的任何问题。

如果可能,从 Mysql Manager 连接到 DEV_DB 并直接在 DEV_DB 上运行查询。

28K 对于“Order by”子句出现问题的计数非常少。

编辑

如果您在部署到 appEngine 之前没有启用 'connector-j',它仍然会尝试使用 'mysql' 驱动程序,最终会超时。

<?xml version="1.0" encoding="utf-8"?>
<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
  ...
  <use-google-connector-j>true</use-google-connector-j>
</appengine-web-app>

More info.

【讨论】:

  • 我没试过。尝试后我会返回更新。谢谢!
  • 看来这是不可能的。我没有找到连接到远程 Cloud SQL 数据库的方法。我确实直接在开发数据库上运行了查询,它工作正常。当服务器执行 HQL 查询时,问题似乎发生了。
  • 你看的不够仔细,你可以远程连接它在文档中有
  • @JarrodRoberson :D 这可能是真的。但是,我仍然找不到方法。我无法连接com.mysql.jdbc.Driver,也找不到将com.mysql.jdbc.GoogleDriver 添加到我的项目的方法。我是 Spring 和 Maven 的新手......我发现的文档只讨论了访问我配置的数据库所需的权限。
  • 启用了“连接器-j”。虽然我真的不知道那是什么意思。我也不确定应该在 hiberante.xml 中传递服务器的 url(我正在使用 Maven - 这对我来说是新的)。但是,唉,我现在真的要走了,所以我只能在星期天再说。非常感谢您的努力。
【解决方案2】:

您可能想查看 ORDER BY 字段上的索引是否存在于 DEV 服务器中,但不存在于 PROD 上。这会对排序和搜索产生深远的影响。

【讨论】:

  • 感谢您的快速回复!实际上,两个视图都是由同一个脚本创建的。视图中根本没有添加任何索引。我想也许添加一个索引,这真的可以帮助它更快。但我认为我需要为几乎所有列添加索引,我不确定这是否好。
  • 您肯定应该索引出现在 WHERE 子句中的列。您按什么变量排序?
猜你喜欢
  • 2010-10-16
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
  • 2021-06-23
  • 2018-08-30
  • 1970-01-01
  • 2023-02-01
相关资源
最近更新 更多