我们如何改善Ebean的远程性能?

时间:2012-08-28 16:41:17

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

(免责声明:这是一个非常开放的问题,我认为不仅会有一个正确的答案,反正请关闭它,还要考虑添加社区维基的答案)

我们正在使用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

对同一操作使用与 ~6500ms 相同的resultSet Ebean个需求。 ( 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的项目)?

1 个答案:

答案 0 :(得分:1)

我在这里猜测,但这可能是因为连接没有汇总。

按照SettingsJDBC

中的说明检查'conf / application.conf'中的连接池设置
# [...] 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