【问题标题】:How can we improve Ebean's remote performance?我们如何提高 Ebean 的远程性能?
【发布时间】:2012-08-23 05:30:24
【问题描述】:

(免责声明:这是一个非常开放的问题,而且我认为不会只有一个正确答案,无论如何请不要关闭它,也可以考虑将答案添加到社区维基)

我们正在使用 Ebean 作为主要 ORM 开发 Play 应用程序,当我们在本地服务器上处于开发模式时,一切都非常好。但应用程序的目标环境是云 + 远程 SQL 服务器。连接到目标数据库后,我们发现了在本地环境中不可见的一件事:Ebean 执行单独查询的时间比手动编写的语句长很多倍。举个例子:

声明

此查询在 ~1200ms 内对resultSet 执行一系列子查询:

while (resultSet.next()) {
    Statement innerStatement = connection.createStatement();
    ResultSet innerSet
            = innerStatement.executeQuery("SELECT title FROM media WHERE id='" + resultSet.getInt("id") + "'");
    while (innerSet.next()) {
        Logger.info("Statement: " + innerSet.getString("title"));
    }
}

Ebean

使用相同的resultSet Ebean 需要大约 ~6500ms 来完成相同的操作。 (Media 模型没有任何关系,所以没有任何连接):

while (resultSet.next()) {
    Media media = Media.find.select("title").where().eq("id", resultSet.getInt("id")).findUnique();
    Logger.info("Ebean: " + media.title);
}

编辑:关于本地环境的差异并不是那么好,因为通常所有查询都快得多。

当然,有很多地方可以将查询系列替换为单个查询,但这并不总是可行的。有时我们需要在一个请求中查询多个不同的表。在其他情况下,我们需要将不同数据库之间的数千条记录一一匹配,等等。

我们还发现,例如,Page<Media> 类在传递给 Play 的视图时会对其列表中的每个项目执行单独的选择。在这种情况下,很容易在控制器中 getList() 并将其传递为 List<Media> 并添加一些信息以使用普通类型参数进行分页,但是......一次获得所有信息真是太酷了:)

那么问题...

  1. 如何优化Ebean's 配置?
  2. 如何优化查询(即提到List 而不是Page,或使用find.where().in(..., ...) 而不是使用for() 语句单独获取每个对象)。还有什么?
  3. Ebean 还有其他让我们感到惊讶的事情吗(例如单独查询Page 的项目)?

【问题讨论】:

  • 这里有些奇怪/奇怪的地方,因为 SQL 非常相似。如果这种事情再次发生,请联系我或发帖到 Ebean google group 调查(现在已经 3 岁了)。

标签: java playframework-2.0 azure-sql-database ebean


【解决方案1】:

我在这里有点猜测,但这可能是因为连接没有被池化。

检查“conf/application.conf”中的连接池设置,如SettingsJDBC中所述

# [...] thread-affine pools, basically
db.default.partitionCount=2

# The number of connections to create per partition. Setting this to 
# 5 with 3 partitions means you will have 15 unique connections to the 
# database. [...]
db.default.maxConnectionsPerPartition=5

# The number of initial connections, per partition.
db.default.minConnectionsPerPartition=5

【讨论】:

  • 谢谢,我会尽快检查,同时我重构了应用程序以尽可能缓存数据库查询。
猜你喜欢
  • 2018-09-29
  • 2014-04-09
  • 2019-08-11
  • 2011-09-28
  • 2010-12-23
  • 2011-02-09
  • 1970-01-01
  • 1970-01-01
  • 2013-12-15
相关资源
最近更新 更多