web-dev-qa-db-ja.com

Java JDBC-tnsnames.oraを使用してOracleに接続する方法

tnsnames.oraファイルには、Databasesとその説明(Host + port)が含まれています。

  • 上記のファイルに依存して接続を確立することは可能ですか? (DB名のみを指定して言います):

  • このファイルを見つけるには、WindowsレジストリでHKEY_LOCAL_MACHINE\Software\Oracleを確認し、すべてのKEY_XXXファイルを取得してから、どちらが最初に表示されるかを確認する必要があるデフォルトのOracleホームを知る必要があります。 %PATH%。クライアントコンピューターでこのファイルを自動的に見つける方法はありますか?

14
Maroun

Thinドライバでtnsnamesを使用できることも知りませんでしたが、バージョン10のどこかに追加されたようです。

http://docs.Oracle.com/cd/B19306_01/Java.102/b14355/urls.htm#BEIDIJCE

特に:

注意:

JDBC ThinドライバでTNSNamesを使用する場合、Oracle.net.tns_adminプロパティをtnsnames.oraファイルを含むディレクトリに設定する必要があります。

Java -Doracle.net.tns_admin=%Oracle_HOME%\network\admin

前述のように、このが実際に動作するかどうかは確認していません。

「実際のネットワーク構成ディレクトリを見つける」ロジックは、Oracle関数を介して利用できるとは思いません。質問で概説されているように手動で行う必要があります。または、TNS_ADMIN環境変数が存在することに依存している可能性があります。その場合、Java呼び出しは

Java -Doracle.net.tns_admin=%TNS_ADMIN%
20
Chris

まあ、いくつかのGUIでは、TNSドライバーの設定が単に実装されていないか、機能していません(たとえば、NetBeans :-))

https://netbeans.org/bugzilla/show_bug.cgi?id=231526

ここに簡単な回避策があります。 tnsnames.oraファイルから直接エントリを取得し、次のようにjdbcドライバ文字列に添付できます。

Odbc7.jar(JDK 7用のOracle 12c JDBCドライバー)を使用してOracle 11gR2 RACクラスターに接続する例:

jdbc:Oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(Host = hostA)(PORT = 1522))(ADDRESS =(PROTOCOL = TCP)(Host = hostB)(PORT = 1521) ))(SOURCE_ROUTE = yes)(CONNECT_DATA =(SERVICE_NAME = DatabaseService)))

次のように::を最後に追加する場合は、Host:port:serviceとして二重::文字を最後に追加することに注意してください。

jdbc:Oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL = TCP)(Host = hostA)(PORT = 1522))(ADDRESS =(PROTOCOL = TCP)(Host = hostB)(PORT = 1521) ))(SOURCE_ROUTE = yes)(CONNECT_DATA =(SERVICE_NAME = DatabaseService)))::

「NL例外が生成されました」という例外が発生します。

別のアプローチは、次のプロパティを構成することです。System.setProperty( "Oracle.net.tns_admin"、 "C:/app/product/11.2.0/client_1/NETWORK/ADMIN");

もちろん、ハードコードされた値の代わりに、たとえば、Oracle_TNS_ADMINのようなオペレーティングシステムで環境変数を設定し、それを参照できます。

System.setProperty("Oracle.net.tns_admin",System.getenv("Oracle_TNS_ADMIN"));

または、Java Linuxの-Dスイッチ経由で処理します:

-Doracle.net.tns_admin=$Oracle_TNS_ADMIN

およびwindows:as

-Doracle.net.tns_admin=%Oracle_TNS_ADMIN%

アプリケーションがTNS構成ファイルを認識すると、次の完全な例のように、TNSNAMES.oraファイル内の参照サービス名で接続できます。

 // tell the driver where to look for the TNSNAMES.ORA file
System.setProperty(
          "Oracle.net.tns_admin",
          "C:/app/product/11.2.0/client_1/NETWORK/ADMIN");

// ORCL is net service name from the TNSNAMES.ORA file
String dbURL = "jdbc:Oracle:thin:@ORCL";

// load the driver
Class.forName("Oracle.jdbc.OracleDriver");

Connection conn = null;
Statement stmt = null;

try {
  conn = DriverManager.getConnection(dbURL,
                                     "your_username",
                                     "your_password");

  stmt = conn.createStatement();

  ResultSet rs = stmt.executeQuery("SELECT dummy FROM dual");
13
kensai

まず、SQL Developerソフトウェアがマシンに適切にインストールされていることを確認してください。シンドライバーを使用している場合は、ojdbcX.jarファイルがビルドパスにあることを確認してください。 TNSエイリアス名を使用してOracleデータソースに接続する手順は次のとおりです。

  • _Oracle.net.tns_admin_のシステムプロパティを設定します。これは、_tnsnames.ORA_ファイルがあるディレクトリを指す必要があります

    System.setProperty("Oracle.net.tns_admin", DIRECTORY_PATH_TO_TNSNAME.ORA_FILE);

  • Oracleドライバーを登録する

    DriverManager.registerDriver(new OracleDriver());

  • 接続オブジェクトを作成する

    Connection conn = DriverManager.getConnection("jdbc:Oracle:thin:username/password@TNS_ALIAS_NAME");

これにより、データベース接続が確立されます。