人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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にしてもいいのか。いいならそのやり方について。

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

●質問者: nacookan
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

質問者から

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


1 ● snow0214
●100ポイント

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

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


nacookanさんのコメント
なるほど、こういうのがあるんですね、ありがとうございます。

2 ● 井戸端さん
●100ポイント ベストアンサー

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

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


nacookanさんのコメント
なるほどJPAですか。SQLより速いというのは確かに気になりますね。でもこれDB製品に特化した記法は使えないわけですよね。単純なクエリじゃなく、凝ったやつでも、チューニング頑張ったSQLより速いんでしょうか。 なんというか、すべてを1秒でも速くしたい、というわけではないですが、何分たっても終わらないとか、そういう話にならないくらい重くなった場合に、インデックス+ヒントで劇的に改善して回避、みたいな余地があるのかという点がまだ心配です。 以前、SAStrutsでSQL自動生成を全面的に使っていて、結局そのあたりで困ってしまって部分的に生のSQLに書き換えた経緯があります。 しかしすごく参考になりました。ありがとうございます。

3 ● Sampo
●100ポイント

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

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

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

などと。

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

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


nacookanさんのコメント
なるほど。そういえばそうですね、エンティティの定義を減らせばいいわけですか。これだと、エンティティを使いつつも、取得しない列を間違って参照してしまう問題も回避できて一番安全かもしれない。 クラスが多くなっちゃうことと、ヒントが使えない点は心配ですが、単純なクエリはこの方法を採用する、などのバランスのいい使い方はできるかも知れません。 ありがとうございます。

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

Sampoさんのコメント
もちろんです!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ