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

bie*_*ior 5 java ebean playframework-2.0 azure-sql-database

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

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

声明

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

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

编辑: 在本地环境差异并不是那么好,一般所有查询都快得多.

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

我们还发现,例如,Page<Media>传递给Play视图时,类会对其列表中的每个项执行单独的选择.在这种情况下,它很容易getList()在控制器中传递List<Media>并添加一些信息用于普通类型参数的分页,但是...它很酷,一次性完成它:)

那些问题......

  1. 如何进行Ebean's配置优化?
  2. 如何进行查询优化(即提及List而不是Page使用或find.where().in(..., ...)代替使用for()语句单独获取每个对象).还有什么?
  3. 有没有其他东西可以让我们惊讶于Ebean(如分别查询Page的项目)?

Kar*_*rlP 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
Run Code Online (Sandbox Code Playgroud)