0

TNS 文字列を Grails データソースの URL として使用し、2 つの Oracle DB (ora01、ora02) を使用します。通常の運用では正常に db サービスに接続します。構成は次のとおりです。

dbString = "jdbc:oracle:thin:@(DESCRIPTION = 
                  (ADDRESS_LIST = 
                        (LOAD_BALANCE = ON) 
                        (ADDRESS = (PROTOCOL = TCP)(HOST = ora01.foo)(PORT = 1521)) 
                        (ADDRESS = (PROTOCOL = TCP)(HOST = ora02.bar)(PORT = 1521))
                  ) 
                  (CONNECT_DATA = (SERVICE_NAME = orastage)))"

dataSource 
{
    pooled = true
    driverClassName = "oracle.jdbc.OracleDriver"
    username = foo
    password = bar
    url = dbString
    logSql = false
}   

DBA が ora01 をオフにし、ora02 をアクティブなものとして再起動すると、Grails アプリは認識せず、JDBC エラーをスローします。

2013-04-26 11:41:35,428 ERROR JDBCTransaction - JDBC commit failed
java.sql.SQLRecoverableException: No more data to read from socket
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1142)
at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1099)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:288)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:191)
at oracle.jdbc.driver.T4C7Ocommoncall.doOCOMMIT(T4C7Ocommoncall.java:75)
at oracle.jdbc.driver.T4CConnection.doCommit(T4CConnection.java:565)
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:3851)
at oracle.jdbc.driver.PhysicalConnection.commit(PhysicalConnection.java:3857)
at org.apache.commons.dbcp.DelegatingConnection.commit(DelegatingConnection.java:334)

私の設定は大丈夫ですか?Grails は TNS 文字列をデータソース URL として使用できると想定しています。これは、db を失敗させる前に問題なく接続できるためです。これは正しいですか? アプリがまだ死んだデータベースに接続しようとしていて、他のノードを試していないようです。現在動作しているノードに切り替えるために Grails に何か特別なことをさせる必要がありますか?

4

1 に答える 1

0

説明で使用(FAILOVER=ON)してみてください。

dbString = "jdbc:oracle:thin:@(DESCRIPTION = 
                  (ADDRESS_LIST = 
                        (LOAD_BALANCE = ON) 
                        (FAILOVER=ON)
                        (ADDRESS = (PROTOCOL = TCP)(HOST = ora01.foo)(PORT = 1521)) 
                        (ADDRESS = (PROTOCOL = TCP)(HOST = ora02.bar)(PORT = 1521))
                  ) 
                  (CONNECT_DATA = (SERVICE_NAME = orastage)))"
于 2013-04-26T13:52:51.437 に答える