2012-01-01 48 views
0

使用Spring + hibernate進行MySql複製,我有一個快速問題;如何在事務(主/從DB)中將只讀休眠會話進行轉換

打開的事務處於只讀模式,即指向從DB。 如果我想在該事務期間保存/更新/刪除任何事物,將其轉換爲寫入模式的最佳方法是什麼?

我不想打開一個寫模式的事務,因爲大部分時間我都想讀東西。

我是否需要覆蓋複製驅動程序/休眠模板這個東西?

+1

如果事務必須寫入,則不能以只讀模式打開。這很簡單。 Hibernate只會寫入需要寫入的內容,而只讀事務的速度並不比讀寫速度快得多。不要試圖過早優化。 – 2012-01-01 17:13:06

+1

在少數交易中,他們不是必須寫的,即基於少量條件或閱讀,寫作是可選的。 – mtariq 2012-01-02 04:56:19

+0

您是否找到解決這個問題的方法? – 2012-05-30 07:40:26

回答

1

我們以只讀模式打開事務,然後將其轉換爲寫模式,因爲只讀連接不會像使用從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); 
    } 
}; 

在應用程序邏輯寫入前會議上,我們檢查
連接在寫模式,然後簡單地寫。
否則如果連接是隻讀的,那麼首先使其處於寫入模式,進行寫入操作並再次使其恢復爲只讀