5

(免責事項:これは非常にオープンな質問です。さらに、正解は1つだけではないと思います。とにかく閉じないでください。回答をコミュニティwikiに追加することも検討してください)

Ebeanメインの ORM として使用する Play アプリケーションに取り組んでいます。ローカル サーバーで開発モードにいる間、すべてが非常にうまくいきました。しかし、アプリケーションのターゲット環境は、クラウド + 離れた SQL サーバーです。ターゲット データベースに接続した後、ローカル環境では目に見えない 1 つのことがわかりましEbeanた。それは、手動で記述されたステートメントよりも何倍も長い時間、個別のクエリを実行することです。例:

声明

resultSetこのクエリは、〜 1200 ミリ秒で一連のサブクエリを実行します。

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"));
    }
}

イービーン

同じ操作で約6500 ミリ秒の同じresultSet Ebeanニーズを使用します。(モデルには関係がないため、結合はありません):Media

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

編集: 一般的にすべてのクエリがはるかに高速であるため、ローカル環境の違いはそれほど素晴らしいものではありません。

もちろん、一連のクエリを単一のものに置き換えることができる場所はたくさんありますが、常に可能であるとは限りません。1 回のリクエストで複数の異なるテーブルをクエリする必要がある場合があります。他のケースでは、異なるデータベース間で数千のレコードを 1 つずつ照合する必要があります。

また、たとえば、Page<Media>クラスが Play のビューに渡されると、そのリストの各項目に対して個別の選択が実行されることがわかりました。この場合getList()、コントローラーでそれを渡しList<Media>、通常のタイプのパラメーターを使用してページネーション用の情報を追加するのは簡単ですが...すべてを一度に取得するのはとてもクールでした:)

さて、質問は...

  1. Ebean's構成を最適化するにはどうすればよいですか?
  2. どのようにクエリを最適化できますか (つまり、Listの代わりに言及するか、ステートメントを使用して各オブジェクトを個別にフェッチする代わりにPage使用します)。ほかに何か?find.where().in(..., ...)for()
  3. Ebean で私たちを驚かせる可能性があるものは他にありますか (Pageのアイテムを個別にクエリするなど)?
4

1 に答える 1

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
于 2012-12-19T12:08:14.687 に答える