2

最近、数百万行のテーブルを読み取るバッチを作成する必要がありました。テーブルには約12列あり、操作を行うだけで済みますread。しかし、すべてのフィールドが必要だったため、永続オブジェクトの使用を検討しました。

私は実際にそれを達成するためだけに、微調整なしで最も基本的なコードのみを使用しました。とJPAでカスタムページングを使用せざるを得なかったため、非常に面倒でした。興味があれば、以下のおおよそのコードのハイパーリンクを表示できます。デフォルトのXMLファイルなどを除いて、実際には何もありません。maxResultsminResults

JPAコード:http
://codeviewer.org/view/code:297e Hibernateコード:http
://codeviewer.org/view/code:297f JDBCコード:上記と同じですが、末尾に「d」が付いています(申し訳ありませんが、2つのリンクしか投稿できません)

完成した操作の結果はそのようなものでした。私は読み取り操作について話しているだけです:

JPA:         Per 5 seconds: 1.000||Per Minute: 12.000||Per Hour: 720.000
Hibernate:   Per 5 seconds: 20.000||Per Minute: 240.000||Per Hour: 14.400.000
JDBC:        Per 5 seconds: 50.000-80.000||Per Minute: 600.000-960.000||Per Hour: 36.000.000-57.600.000

説明することはできませんが、JPAはばかげています。それは大きな悪い冗談にすぎない可能性があります。面白いことに、Hibernateコードと同じ速度で起動しますが、約30.000のレコードの後、5秒あたり1.000の読み取り操作で安定するまで、ますます遅くなりました。約10万件の記録を終えてその時点に達しました。しかし正直なところ...その速度には意味がありません。

どうしてこんなことに?説明してください。何が間違っているのか本当にわかりません。しかし、デフォルト設定であっても、それほど遅くなることはないと思います。ありえないし、あってはならない!それと比較して、休止状態とJDBC速度は許容可能であり、常に安定しています。

4

1 に答える 1

4

Hibernateを使用すると、1つのクエリとスクロール可能な結果のみを使用して優れたパフォーマンスを得ることができます。残念ながら、これは現在JPAでは不可能であり、すべての結果ページに対してクエリを実行する必要があります。

だから、あなたはそれを正しくやっています。ただし、ページサイズは20件の結果にしか設定されていません。これは非常に少ないため、コードは非常に多くのクエリを実行します。サイズを大きくしてみてください。たとえば、10000の結果と、パフォーマンスが向上する可能性があります。とにかく、Hibernateの数に近い数を取得することはできないと思います。

于 2012-09-05T08:28:27.213 に答える