(免责声明:这是一个非常开放的问题,而且我认为不会只有一个正确答案,无论如何请不要关闭它,也可以考虑将答案添加到社区维基)
我们正在使用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"));
}
}
豆豆
使用相同的操作resultSet
Ebean
需要大约6500 毫秒。(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()
)。还有什么? - Ebean 还有其他让我们感到惊讶的事情吗(比如
Page
分别查询 's 的项目)?