2017-04-21 8 views
0

プライマリ・データベースを参照する単一の接続プールを設定しようとしていますが、これは不健全になり、プールがフェールオーバーしてバックアップを埋めます。私は次のコードは、間違いなく、部分的にいくつかのひかりからcribbedいるプライマリ/バックアップDBを持つ単一JDBC OracleDataSource/HikariCP

jdbc:oracle:thin:@primary:1521:DB|jdbc:oracle:thin:@backup:1521:DB 

を:今まで私は、私は以下のようなものを2 JDBC接続URL文字列を指定することができ、当社のアプリケーションサーバーのJNDIデータソースのドキュメント化されていない機能を活用してきました/春のドキュメンテーション月前。

@Bean(name = "dataSource") 
public DataSource dataSource() throws SQLException { 
    String userName = "user"; 
    String password = "pass"; 
    String server = "primary"; 
    String database = "DB"; 

    OracleDataSource ods = new OracleDataSource(); 
    ods.setServerName(server); 
    ods.setDatabaseName(database); 
    ods.setNetworkProtocol("tcp"); 
    ods.setUser(userName); 
    ods.setPassword(password); 
    ods.setPortNumber(1521); 
    ods.setDriverType("thin"); 

    HikariConfig hkConfig = new HikariConfig(); 
    hkConfig.setDataSource(ods); 
    hkConfig.setDataSourceClassName("oracle.jdbc.pool.OracleDataSource"); 
    hkConfig.setPoolName("springHikariRECPool"); 
    hkConfig.setMaximumPoolSize(15); 
    hkConfig.setMinimumIdle(3); 
    hkConfig.setMaxLifetime(1800000); // 30 minutes 

    return new HikariDataSource(hkConfig); 
} 

私のGoogle-Fuが失敗しました。どのようにフェールオーバー機能を達成するためのアイディアがありますか?

編集 - re。 @M。 Deinum "OracleDataSourceの構築を削除し、HikariConfigでURLを設定するだけです。"そのhere - Hikaricp Oracle connection issue

Caused by: java.sql.SQLException: Invalid Oracle URL specified: OracleDataSource.makeURL 
    at oracle.jdbc.pool.OracleDataSource.makeURL(OracleDataSource.java:1277) 
    at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:185) 
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:356) 
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:199) 
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:444) 
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:515) 

調査とhere - Invalid Oracle URL specified: OracleDataSource.makeURLは、いくつかの追加のプロパティを追加するために私が発生します。

HikariConfig hkConfig = new HikariConfig(); 
hkConfig.setUsername(userName); 
hkConfig.setPassword(password); 
hkConfig.setJdbcUrl("jdbc:oracle:thin:@primary:1521:DB|jdbc:oracle:thin:@backup:1521:DB"); 
hkConfig.setDataSourceClassName("oracle.jdbc.pool.OracleDataSource"); 
hkConfig.setPoolName("springHikariRECPool"); 
hkConfig.setMaximumPoolSize(15); 
hkConfig.setMinimumIdle(3); 
hkConfig.setMaxLifetime(1800000); 

残念ながら、これはかなり長いスタックを生成する、のベースはこれです。

と爆弾今
hkConfig.addDataSourceProperty("portNumber", "1521"); 
hkConfig.addDataSourceProperty("driverType", "thin"); 

Caused by: java.net.UnknownHostException: null: Name or service not known 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) 
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:117) 
    at oracle.net.nt.ConnOption.connect(ConnOption.java:133) 
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:370) 

JDBCのURLは、もはや参照されている、それが表示されないだろう。 。 。と確認しました - 私はURLからバックアップ接続文字列を取り出し、標準の単一サーバー接続で同じ例外に達しました。したがって、ODSは最初に実行されたように設定されている必要があります(または、Propertiesとまったく同じです)。

Caused by: java.net.UnknownHostException: primary|backup: Name or service not known 
    at java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) 
    at java.net.InetAddress$2.lookupAllHostAddr(InetAddress.java:928) 
    at java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1323) 
    at java.net.InetAddress.getAllByName0(InetAddress.java:1276) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1192) 
    at java.net.InetAddress.getAllByName(InetAddress.java:1126) 
    at oracle.net.nt.TcpNTAdapter.connect(TcpNTAdapter.java:117) 
    at oracle.net.nt.ConnOption.connect(ConnOption.java:133) 
    at oracle.net.nt.ConnStrategy.execute(ConnStrategy.java:411) 
    ... 56 more 

を私が注意することができなかったこれまでのことをしている:だけでなく爆破予想通り、|「スタンバイプライマリ」と、私がServerNameプロパティを設定しようとしたこのメソッドの最後のあがきとして

、私はojdbc7.jarを使用しています。

+0

'OracleDataSource'の構造を削除し、' HikariConfig'でURLを設定するだけです。 –

+0

@M.Deinumの質問は更新されました。あなたのご意見ありがとうございます。 –

答えて

1

標準的な方法を使用してください。 DataGuardのサポート、フェイルオーバー、RACは、Oracle JDBCドライバのネイティブ機能です。

tnsnames.oraでここ"How to connect JDBC to tns oracle"

第二の使用複数のホストを説明するように第一の使用のtnsnames.ora:

DB = 
(DESCRIPTION= 
(ADDRESS_LIST= 
    (LOAD_BALANCE=off) 
    (FAILOVER=ON) 
    (ADDRESS=(PROTOCOL=TCP)(HOST=primary)(PORT=1521)) 
    (ADDRESS=(PROTOCOL=TCP)(HOST=backup)(PORT=1521))) 
(CONNECT_DATA=(SERVICE_NAME=DB))) 

OracleのJDBCドライバは、データベースが "OPEN" でホストに接続し、 「DB」という名前のサービスが存在します。

PS:tns接続文字列全体をパラメータとしてjdbcドライバに直接渡すこともできます。

url="jdbc:oracle:thin:@(DESCRIPTION= 
    (LOAD_BALANCE=on) 
    (ADDRESS_LIST= 
    (ADDRESS=(PROTOCOL=TCP)(HOST=primary)(PORT=1521)) 
    (ADDRESS=(PROTOCOL=TCP)(HOST=secondary)(PORT=1521))) 
    (CONNECT_DATA=(SERVICE_NAME=DB)))" 
+0

私は、Oracle Clientなどのインストールは含まれていない単純なバージョンが好きでしたが、それは他のパスのようです。ミドルウェアまたはクライアントです。ありがとう! –

関連する問題