複数のJavaアプリケーションとデータベースの整合性を休止状態
-
26-09-2019 - |
質問
私たちは、2のJava Webの両方が読み込まれる/書き込みと3スタンドアロンのJavaの読み取り/書き込みアプリケーションアプリ持つすべての使用は共通のコードベースを休止し、共有する(電子メールを介して負荷の質問に、1は、1つの加入者に電子メールを送信し、XMLフィードを処理します)ます。
私たちは最近遭遇した問題は、質問は電子メールを介してWebアプリケーションのいずれかで作成した時に上書き質問にロードされていることです。注、これらは別々のIDを持っている必要があり、別の質問があります。私たちは、もともとこれは、キャッシングの問題であると考えられています。私たちは、セカンドレベルキャッシュオフを試してみたが、これは違いはありません。
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
<property name="hibernate.current_session_context_class">thread</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
質問:
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false)
@DocumentId
public Integer getId() {
return this.id;
}
私たちはところでMySQLを使用しています。
CREATE TABLE `question` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
...
PRIMARY KEY (`id`),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8
私たちは、明示的に開閉セッションのではなく、HibernateはUtil.getSessionFactory().getCurrentSession()
を経由して、それらを管理できていません。
私たちのセットアップこの段階でクラスタ化された第二レベルのキャッシュこれは複雑な別の層を作成し、我々はより幸せな私たちは、全体として、アプリから取得した性能のレベルにしているようではなくはないと思います。
ですから、ウェブアプリでオープンセッションインビューパターンを実装し、手動ではこの問題を解決するだろうように、スタンドアロンでセッションを管理することは、音をアプリのでしょうか?
または任意の他の提案/アイデアください?
解決 2
この問題が判明したが、すべてで休止状態に関連していなかった。
ステージングサーバー上のデータベース・テーブルの一つがクリーンアップされている必要があります古いデータでいっぱいでした。これは、最初のIDのは、上書きされるの外観を与えたが、さらなる調査がそうでなければ証明!
私たちは危険なデータを削除したら、は、すべてが順調だった。
他のヒント
すべての質問がIDを持っているので、その後、私はすべての質問は、あなたのMySQLデータベースからフェッチされていることを前提としています。
あなたは、メモリ内の透明なオブジェクトとして質問を格納する必要がないと仮定すると、しかし、あなたは、あなたがそれらを提示たびにすべての質問を選択することを、私は1つの単純な提案を持っています。
データベースにおける配列とID発生器を交換します。 (MySQLでは自動番号として最終的にID)。そして、すべての質問には一意のIDを取得することを代わりにアプリケーション保証のデータベースます。
このソリューションは非常に簡単であり、あなたの複雑さを軽減します。あなたがデータベースにさまざまなソースからのすべての着信の質問を持続して、ここからそれらを選択した場合、それが唯一の作品。
このソリューションは、あなたのパフォーマンスの問題を与えた場合、あなたはより多くの方法をあなたのHibernateのIDジェネレータの仕事について調査する必要があります。 Hibernateは異なるシナリオのために、いくつかの異なる発電機を提供しています。
・ホープこのヘルプ!