Play FrameworkのJavaでの利用を検討していますが、DBアクセスはどうするのがオススメでしょうか。


MySQL5.6を使用したいと思っています。Javaの経験は多数ありますが、PlayやScalaは初めてです。

調べてみると、JavaではEbeanを使うのが基本のように感じました。しかしEbeanでは、select句に指定する列を減らして無駄なデータを取ってこないようにしたり、USE INDEX などのヒントを使うことができる記述が見つかりませんでした。

自動生成されるSQLを使うしかなく、あとでパフォーマンス問題が出てきそうで不安です。

Ebeanでもそうしたことができる仕組みはあるのでしょうか。また、JavaではなくScalaだとAnormがあり、こちらはSQLを直接書けるので、そういう心配はないということでしょうか。しかしControllerではJavaを使いたいです。Model部分だけScaleでAnormを使うということは現実的なのでしょうか。

まとめると、

(1) Ebeanでもselect句の列の指定やMySQLのヒントは利用可能なのか
(2) ScalaのAnormなら可能なのか
(3) ControllerはJavaのままで、ModelだけScala+Anormにしてもいいのか。いいならそのやり方について。

以上、アドバイスいただけると幸いです。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2014/06/30 13:56:45
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:nacookan

書き忘れましたが、Playのバージョンは最新の2.3.0です。

ベストアンサー

id:watercooler No.2

回答回数289ベストアンサー獲得回数51

ポイント100pt

Ebeanでもselect句の列の指定でググればぐぬぬダイアリーが出てくるわ。
辿ればJava Play framework 2.0で、ebeanを利用した直接SQL 一言多いプログラマーの独り言にも行きつくわね。

でもあたしはJPAを推したいわ。JPQLのほうがNativeより早いという結果もあるわよ。
NativeQueryじゃだめ?~JPAクエリ表現ごとのパフォーマンス比較 - Dev3TechHack
JPQL速かった!~JPAクエリ表現ごとのパフォーマンス比較 その2 - Dev3TechHack

id:nacookan

なるほどJPAですか。SQLより速いというのは確かに気になりますね。でもこれDB製品に特化した記法は使えないわけですよね。単純なクエリじゃなく、凝ったやつでも、チューニング頑張ったSQLより速いんでしょうか。

なんというか、すべてを1秒でも速くしたい、というわけではないですが、何分たっても終わらないとか、そういう話にならないくらい重くなった場合に、インデックス+ヒントで劇的に改善して回避、みたいな余地があるのかという点がまだ心配です。

以前、SAStrutsでSQL自動生成を全面的に使っていて、結局そのあたりで困ってしまって部分的に生のSQLに書き換えた経緯があります。

しかしすごく参考になりました。ありがとうございます。

2014/06/27 13:30:26

その他の回答2件)

id:snow0214 No.1

回答回数470ベストアンサー獲得回数116

ポイント100pt

(1) Ebeanでもselect句の列の指定やMySQLのヒントは利用可能なのか

Ebean.createSqlQuery を使えば、ネイティブSQLが記述できます。

id:nacookan

なるほど、こういうのがあるんですね、ありがとうございます。

2014/06/27 13:23:39
id:watercooler No.2

回答回数289ベストアンサー獲得回数51ここでベストアンサー

ポイント100pt

Ebeanでもselect句の列の指定でググればぐぬぬダイアリーが出てくるわ。
辿ればJava Play framework 2.0で、ebeanを利用した直接SQL 一言多いプログラマーの独り言にも行きつくわね。

でもあたしはJPAを推したいわ。JPQLのほうがNativeより早いという結果もあるわよ。
NativeQueryじゃだめ?~JPAクエリ表現ごとのパフォーマンス比較 - Dev3TechHack
JPQL速かった!~JPAクエリ表現ごとのパフォーマンス比較 その2 - Dev3TechHack

id:nacookan

なるほどJPAですか。SQLより速いというのは確かに気になりますね。でもこれDB製品に特化した記法は使えないわけですよね。単純なクエリじゃなく、凝ったやつでも、チューニング頑張ったSQLより速いんでしょうか。

なんというか、すべてを1秒でも速くしたい、というわけではないですが、何分たっても終わらないとか、そういう話にならないくらい重くなった場合に、インデックス+ヒントで劇的に改善して回避、みたいな余地があるのかという点がまだ心配です。

以前、SAStrutsでSQL自動生成を全面的に使っていて、結局そのあたりで困ってしまって部分的に生のSQLに書き換えた経緯があります。

しかしすごく参考になりました。ありがとうございます。

2014/06/27 13:30:26
id:Sampo No.3

回答回数556ベストアンサー獲得回数104

ポイント100pt

(1) Ebeanでもselect句の列の指定やMySQLのヒントは利用可能なのか

ヒントを書くにはSQLを生で書き下ろすしかありませんが、取得列指定はEbeanの枠内でも簡単です。

フィールドを絞り込んだエンティティクラスを別に作ればいいのです。

  • ユーザテーブルのカラムを網羅した User クラス
  • 一覧表示に必要な文だけのユーザ情報を持った UserBasic クラス

などと。

ここで、色気を出して User extends UserBasic などとやろうとすると実行時にこけます。EBeanは単純なクラスしかエンティティとして認めません。

それでもあえてコードの重複を排除したいときは User クラスに @Embedded アノテーションを付けて UserBasic 型のフィールドを設けます。

他1件のコメントを見る
id:nacookan

ちなみに心配になったので念のため確認ですが、内部的に、select * ではなく、ちゃんとエンティティのフィールドの分だけでselect句を生成してる、ということですよね?

2014/06/27 13:34:51
id:Sampo

もちろんです!

2014/06/27 14:09:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません