1

@OneToManyParent->Child->Child->Child DB 関係に使用します。

@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "THE_ID", nullable = false )
private List<ChildClass> children = new ArrayList<ChildClass>();

大量のデータ (100K の挿入) を使用するシナリオでは、挿入時にパフォーマンスが大幅に低下します (実際にはタイムアウトになります)。ただし、少量のデータ (1K 挿入) の場合は問題ありません。

そのため、正当な理由がないためnullable = false、子テーブルの DB 外部キーを削除して変更し、null を許可すると、パフォーマンスが非常に良好になりました。誰でもこれを説明できますか?


更新:デバッグをオンにしました..nullable = false子テーブルのIDを生成する大きなボトルネックがあるようです。ID が生成されるのを待ってタイムアウトし、これがログに何度も記録されます。

[org.hibernate.event.def.AbstractSaveEventListener] [ ] generated identifier: <743088>, using strategy: org.hibernate.id.IncrementGenerator

DBにデータを挿入することさえできません。id gen に行き詰まっています。現在、子テーブルに現在ある最大 ID 値を見て ID を生成するように Hibernate を設定します。

@Id
@GeneratedValue(generator = "DummyString")
@GenericGenerator(name = "DummyString", strategy = "increment")
@Column(name = "THE_ID", nullable = false)
private Long id;

これより前は、DB シーケンスを使用していましたが、同じ問題が発生していました。

を省略するnullable = falseと、これらの ID gen ステートメント (108K) が表示されますが、25 秒で完了します。では、なぜこれらのステートメントは (文字通り) 永遠にかかるのnullable = falseでしょうか?

4

1 に答える 1

0

ブードゥー?Oracle トレースの実行方法を確認します。DBA が役に立ちます。

トレース ファイルを使用すると、Oracle の待機イベントを確認できます。これにより、「パフォーマンスがひどい」ときにデータベースが何をしていたかがわかります。ロックで待機している可能性もあれば、テーブルを読み取っている可能性もあります....

遅い理由がわかれば、多くの場合、解決策が明らかになります。

データベースの操作に関する開発者向けの指示として、このホワイトペーパーをお勧めします。

于 2010-02-06T05:50:40.493 に答える