2016-08-10 9 views
1

私のサーバー側のJavaプログラムの一部を最適化するのに助けが必要です。私はできるだけ説明を簡潔にしようとします。複数の反復で使用されるJPAクエリの最適化機能

私は、A、B、Cの3つのオブジェクトの機能を最大限にする必要があるJavaサーバーを持っています。私は常に3つのうちの最小のフィッティングを見つけて、データベースで見つかった別のランダムなものに置き換えます。

約100回の反復には約2.5秒、250回の反復では約9秒です。

私は、最も時間がかかるものを見つけようとしましたが、JPAクエリでは時間の約70%を失います。私は問題は、毎回ランダムな新しいObjectを取得するためのクエリを実行することだと思います。

Query q = em.createQuery("SELECT object FROM Obj o WHERE .... ORDER BY random()"); 

設定パラメータobjがA、B又はCの各タイプは、それがPostgresのDBに独自のテーブルの有するいずれかとすることができる

q.setFirstResult(0) 
q.setMaxResults(1) 
List<Obj> myMcb = q.getResultList(); 

1つのクエリから多くのデータを取得し、Javaリスト内の「検索」を行うソリューションはありますか? JPAでのキャッシュやJavaでのマルチスレッドを利用する方法はありますか? 私のアプローチに関する他のアイデアは?私はこれのようなものを初めて実装することは即興的なものです。

+0

Select *は何行返されますか?代わりに単一行を返すネイティブクエリを考えてみましょう。 – farrellmr

+0

「ランダム」がJPQL関数であったのはいつですか?ヒント:そうではない –

+0

@farrellmrデータベースには数千ものオブジェクトがあると思う。私は今夜​​ネイティブクエリーを行い、パフォーマンスがどれくらい向上するかを見てみましょう。 – silidragos

答えて

2

私はIDを推測しようとします。

これはオブジェクトを見つけてはなりませんが、それは、はるかに高速になる可能性が

SELECT object FROM Obj o WHERE id = random(select max(id) from obj) 

にSELECT文を変更し

。 正しいランダム関数は、ここで説明されています。もちろんhttp://www.techonthenet.com/postgresql/functions/random.php

あなたがobjからすべての既存のIDのリストを作成し、 クエリのランダムに次々と選ぶことができます。これは、IDの数がすべてのIDをメモリに保持するのに十分小さい場合に機能します。すべてのIDに対して4バイトをカウントすると、非常に簡単に と見積もることができます。

java.util.List<Integer> idList = em.createQuery("SELECT id FROM Obj).getResultList(); 
java.util.Collections.shuffle(idList) 
+0

random()についての本当に興味深いもの。しかし、私はいくつかの制約があるため、0とmax(id)の間にランダムを作ることはできません。だから、すべてのObjが実行可能な候補者ではありません。 – silidragos

関連する問題