(免责声明:这是一个非常开放的问题,我认为不仅会有一个正确的答案,反正请关闭它,还要考虑添加社区维基的答案)
我们正在使用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"));
}
}
对同一操作使用与 ~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>
传递,并为普通类型参数添加一些分页信息,但是......一次性完成所有内容真是太酷了:)
那么问题......
Ebean's
配置?List
而不是Page
,或使用find.where().in(..., ...)
而不是使用for()
语句单独提取每个对象)。还有什么?Page
的项目)?答案 0 :(得分:1)
我在这里猜测,但这可能是因为连接没有汇总。
中的说明检查'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