2012-01-01 5 views
0

Spring + Hibernateを使用したMySqlレプリケーションの作業は簡単です。トランザクション中に読み込み専用のハイバネーションセッションを書き込む方法(マスター/スレーブDB)

オープンされたトランザクションは読み取り専用モード、つまりスレーブDBを指しています。 そのトランザクション中に何かを保存/更新/削除したい場合、書き込みモードに変換する最も良い方法は何ですか?

ほとんどの場合、私は読み物をしたいと思うので、書き込みモードのトランザクションを開きたくありません。

複製用のドライバ/ Hibernateテンプレートを上書きする必要がありますか?

+1

トランザクションが書き込みを行う必要がある場合は、読み取り専用モードで開くことはできません。それはそれと同じくらい簡単です。 Hibernateは書かれる必要があるものだけを書込み、読取り専用トランザクションは読取り/書込みトランザクションよりはるかに高速ではありません。途中で最適化しようとしないでください。 –

+1

少数のトランザクションにおいて、それらは書き込む必要はない。すなわち、わずかな条件または読みに基づいて書き込みは任意である。 – mtariq

+0

この質問に対する解決策を見つけましたか? –

答えて

1

トランザクションを読み取り専用モードで開き、書き込みモードに変換します。読み取り専用接続は、salve DBと同じように問題にはなりません。

我々はのHibernateTemplateクラスをオーバーライドして、我々は、単に書く
接続が書き込みモードになって確認してくださいライトモード、ライト前にアプリケーション・ロジックで

public final void writeEnabled(){ 
    getSession().doWork(jdbcWorkWriteEnabled); 
} 

public final void writeDisabled(boolean flush){ 
    if(flush) 
     flush(); 
    getSession().doWork(jdbcWorkWriteDisabled); 
} 

public static final void writeEnabled(Session session){ 
    session.doWork(jdbcWorkWriteEnabled); 
} 

public static final void writeDisabled(boolean flush,Session session){ 
    if(flush) 
     session.flush(); 
    session.doWork(jdbcWorkWriteDisabled); 
} 

final static Work jdbcWorkWriteEnabled = new Work(){ 
    public void execute(Connection connection) throws SQLException { 
     connection.setReadOnly(false); 
    } 
}; 

final static Work jdbcWorkWriteDisabled = new Work(){ 
    public void execute(Connection connection) throws SQLException { 
     connection.setReadOnly(true); 
    } 
}; 

でセッションを作成するためのメソッドを作成します。
else接続が読み取り専用の場合は、最初に書き込みモードにし、書き込み操作を行い、再び読み取り専用にします。

関連する問題