2

こんにちは私はテーブルからデータを選択したいアプリケーションがあり、見つからない場合は新しい値を生成してデータベースに挿入し、次に統計をループして次の値をチェックします。これは、新しいリクエストに対して約10億回実行されます。

だから私は使うべきですhibernateか、それとも単純JDBCですか?

休止状態では使用する必要があります

    session.saveOrUpdate(obj);

また

        session.save(obj);

もう1つ質問したいのは、挿入ごとにテーブルクラスobject(new Mytable)を初期化する必要があるということです。値を設定するだけで十分ですか?

お気に入り

   MyTable obj=new Mytable();
    obj.setName("dasd");
    obj.set...

obj.save();

または、一度だけ初期化できますか

 `MyTable obj=new Mytable();`

and in a loop put
for(...
obj.setName("dasda");
obj.save

)
4

5 に答える 5

7
  1. HibernateはORマッピングツールです。簡単に言うと、アプリケーションのデータレイヤーをオブジェクト化するため、データベースの相互作用の複雑さに対処する必要がありません。

  2. そうは言っても、休止状態が適切でない場合があります。

  3. スキーマが非常に単純で(8〜10テーブル未満)、それらの間に非常に複雑な関係がない場合、このシナリオでは休止状態の使用はやややり過ぎになります。

  4. 作業しようとしているデータのサイズが非常に大きい場合(mn / bnのオーダー)、休止状態での使用もお勧めしません。古き良きJDBCはここの方が良い

  5. アプリケーションが大量の静的データを使用する場合、キャッシングは適切なオプションであり、Hibernateは透過的にキャッシングをサポートします。

したがって、それはすべて、あなたが持っているシナリオのタイプに依存します。saveOrUpdate(obj);JDBCを使用していつでもビルドできます。

于 2012-05-21T09:03:38.083 に答える
2

私はそれが比喩であると仮定/期待していaround a billion timesます。そうでない場合、それは確かに多くの操作であるため、デザインを再確認することをお勧めします。

そうは言っても、最初の質問については、基本的にJDBC上に構築されており、データベースに依存しないクエリを作成できるなど、クエリを書き直す必要がないという便利な機能を備えているため、Hibernateをお勧めします。データベースを変更する必要があります。

あなたの2番目の質問によると、それは本当にあなたが何をしたいかに依存します:

このAPIによると:

saveOrUpdate

void saveOrUpdate(Object object)はHibernateExceptionをスローします

未保存値チェックの解決に応じて、指定されたインスタンスをsave(Object)またはupdate(Object)します(未保存値チェックの説明については、マニュアルを参照してください)。アソシエーションがcascade="save-update"でマップされている場合、この操作はアソシエートされたインスタンスにカスケードされます。

パラメータ:object-新しい状態または更新された状態を含む一時的またはデタッチされたインスタンススロー:HibernateException関連項目:save(java.lang.Object)、update(Object object)

保存する

保存する

シリアル化可能なsave(オブジェクトオブジェクト)はHibernateExceptionをスローします

指定された一時インスタンスを永続化し、最初に生成された識別子を割り当てます。(または、割り当てられたジェネレーターが使用されている場合は、識別子プロパティの現在の値を使用します。)関連付けがcascade = "save-update"でマップされている場合、この操作は関連付けられたインスタンスにカスケードされます。パラメータ:オブジェクト-永続クラスの一時的なインスタンス戻り値:生成された識別子スロー:HibernateException

3番目の質問に従って、より多くの情報を提供する必要があります。データベースに値を書き込まないように値を設定することもできnullますが、これは実際にはアプリケーションとそれが実装されるコンテキストによって異なります。

于 2012-05-21T09:03:09.393 に答える
1
1) So should i use hibernate or simple JDBC ??

冬眠を回避する方法を知っているなら、私はそれを選ぶと言います。そうでなければ、それを学ぶのに十分な時間とリソースがある場合にのみそれを使用してください。事実、あなたがそれを上手に使うならば、それはあなたの親友になることができます、さもなければ、それはただ絶え間ない苦痛の源になるでしょう。

2) and in hibernate should i use

    session.saveOrUpdate(obj);
or

    session.save(obj);

この質問については、ここにあるJavaDocを読むことをお勧めします。スニペット:

save(Object object) 
Persist the given transient instance, first assigning a generated identifier.

saveOrUpdate(Object object) 
    Either save(Object) or update(Object) the given instance, depending upon resolution of the unsaved-value checks (see the manual for discussion of unsaved-value checking).

よくわからない3番目の質問です。拡大してください。

于 2012-05-21T08:59:39.783 に答える
1

あなたの質問のほとんどは上で答えられたので、あなたの最後の質問に答えさせてください。はい、新しいオブジェクトを作成する必要があります。新しいオブジェクトはそれぞれ(理想的には、関連する依存関係がない場合)、dbに新しい行になります。したがって、新しいオブジェクトを作成する必要があります->それに値を設定します->それを休止状態のセッションに関連付けます->そしてそれをdbに保存します.dbに別の行を挿入したい場合は、はい、作成する必要がありますさまざまなオブジェクト。

お役に立てれば。

于 2012-05-22T06:44:50.640 に答える
1

Hibernateのカーペットの下の技術的側面にも注意してください。

  1. プロパティ(ゲッターとセッターまたはフィールドのいずれか)を呼び出すためのリフレクションスキーマを構築します
  2. HibernateはとにかくSQLクエリを生成し、データセットからデータを読み取り、クエリされた値を割り当てるためにリフレクションメソッドを呼び出します。
  3. キーであるプロパティを入力した場合、Hibernateは最初にそれをクエリ形成に使用します(まだ1つの操作)

したがって、hibernateは、オブジェクトをロードおよび永続化するときに、少なくとも2回追加の操作を実行します。本当に-それははるかに多くのことをします。したがって、データベースをワークフローモードではなく機能モードで使用すると、データセットからデータを読み取り(Hibernateも同じように実行します)、ローカル変数に保持できます。変数の操作は、オブジェクトのルックアップテーブルを使用するよりも高速です。

しかし、1つの状況:JPAはクラスをテーブルにマップします。データベースを最初から構築した後、またはデータベースが適切な設計になっている場合は、それは良いことです。数値テーブルのフィールドをマージする必要がある場合はどうなりますか?ただし、Hibernateには挿入する@OneToOneアノテーションがあり、別のテーブルに対応するオブジェクトがあります。それでも、必要なフィールドが少ない場合は、Hibernateが1対1のリンクされたオブジェクトの作業サイクルを実行します。

簡単に言うと、パフォーマンスが究極の基準である場合は、操作を計算します。データセットを呼び出すには、少なくとも2時間必要です。Hibernateは、次の理由でメリットがある場合に、重いワークフロー操作に適しています。

  1. データセットからではなく、オブジェクトからフィールドを何度も読み取ります
  2. どのデータオブジェクトよりもはるかに重いデータセットをリリースすることをお勧めします
于 2015-10-28T17:38:12.573 に答える