次のように、ホスト名、ポートおよびOracle SIDを使用して開発データベースに接続していたJDBC(JPA経由)を使用するJavaアプリケーションがあります。
jdbc:Oracle:thin:@ Oracle.hostserver1.mydomain.ca:1521:XYZ
XYZがOracle SIDでした。 SIDを使用せず、代わりにOracleの "Service Name"を使用する別のOracleデータベースに接続する必要があります。
私はこれを試しましたが、うまくいきません。
jdbc:Oracle:thin:@ Oracle.hostserver2.mydomain.ca:1522:ABCD
ABCDは他のデータベースのサービス名です。
何がおかしいのですか?
http://download.Oracle.com/docs/cd/B28359_01/Java.111/b31224/urls.htm#BEIDHCBA
シンスタイルサービス名の構文
シンスタイルのサービス名は、JDBC Thinドライバでのみサポートされています。構文は次のとおりです。
@ //ホスト名:ポート番号/サービス名
例えば:
jdbc:Oracle:thin:scott/tiger @ // myhost:1521/myservicename
だから私はしようと思います:
jdbc:Oracle:thin:@ // Oracle.hostserver2.mydomain.ca:1522/ABCD
また、Robert Greathouseの回答によれば、JDBC URLにTNS名を以下のように指定することもできます。
jdbc:Oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(Host=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))
したがって、これを機能させるには2つの簡単な方法があります。 Bert Fによって投稿されたソリューションは、他の特別なOracle固有の接続プロパティを提供する必要がない場合はうまく機能します。そのフォーマットは次のとおりです。
jdbc:Oracle:thin:@//HOSTNAME:PORT/SERVICENAME
ただし、他のOracle固有の接続プロパティを指定する必要がある場合は、長いTNSNAMESスタイルを使用する必要があります。私は最近Oracle共有接続を有効にするためにこれをしなければなりませんでした(そこではサーバーはそれ自身の接続プールをします)。 TNS形式は次のとおりです。
jdbc:Oracle:thin:@(description=(address=(Host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))
Oracle TNSNAMESファイル形式に精通している場合は、これもおなじみのはずです。そうでなければ、詳細についてはそれをグーグルだけ。
以下のようにJDBC URLにTNS名を指定することもできます。
jdbc:Oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =(ADDRESS =(PROTOCOL=TCP)(Host=blah.example.com)(PORT=1521)))(CONNECT_DATA=(SID=BLAHSID)(GLOBAL_NAME=BLAHSID.WORLD)(SERVER=DEDICATED)))
これを試してください:jdbc:Oracle:thin:@Oracle.hostserver2.mydomain.ca:1522/ABCD
編集:これより下のコメントごとに実際に正しいです:jdbc:Oracle:thin:@//Oracle.hostserver2.mydomain.ca:1522/ABCD
(//
に注意してください)
ここに link が役に立つ記事へのリンクです
この議論は私が数日間苦労していた問題を解決するのを助けました。 11月5日18日、15:17にJim Toughが答えを見つけるまで、私はインターネット中を見回しました。その答えで私は接続することができました。今、私は完全な例で他の人に恩返しをしたいと思います。これが行きます:
import Java.sql.*;
public class MyDBConnect {
public static void main(String[] args) throws SQLException {
try {
String dbURL = "jdbc:Oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=whatEverYourHostNameIs)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=yourServiceName)))";
String strUserID = "yourUserId";
String strPassword = "yourPassword";
Connection myConnection=DriverManager.getConnection(dbURL,strUserID,strPassword);
Statement sqlStatement = myConnection.createStatement();
String readRecordSQL = "select * from sa_work_order where WORK_ORDER_NO = '1503090' ";
ResultSet myResultSet = sqlStatement.executeQuery(readRecordSQL);
while (myResultSet.next()) {
System.out.println("Record values: " + myResultSet.getString("WORK_ORDER_NO"));
}
myResultSet.close();
myConnection.close();
} catch (Exception e) {
System.out.println(e);
}
}
}
SIDなしでOracleに接続するためにEclipseを使用している場合。選択するドライバは2つあります。つまり、Oracle Thinドライバと他のドライバです。他のドライバを選択し、データベース列にサービス名を入力してください。 SIDなしでサービス名を使って直接接続できるようになりました。
dag
の代わりにthin
を使うとき、サービス名を指す以下の構文は私のために働きました。上記のjdbc:thin
の解決策はうまくいきませんでした。
jdbc:dag:Oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
これはうまくいくはずです:jdbc:Oracle:thin//hostname:Port/ServiceName=SERVICE_NAME