Java JDBC-SIDの代わりにサービス名を使用してOracleに接続する方法
-
27-10-2019 - |
質問
このような、ホスト名、ポート、オラクルSIDを使用して開発データベースに接続していたJDBC(JPA経由)を使用するJavaアプリケーションがあります。
JDBC:Oracle:Thin:@oracle.hostserver1.mydomain.ca:1521:xyz
XYZはOracle Sidでした。これで、SIDを使用しないが、代わりにOracleの「サービス名」を使用する別の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シンドライバーによってのみサポートされています。構文は次のとおりです。
@// host_name:port_number/service_name
例えば:
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固有の接続プロパティを提供する必要がある場合は、Long 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
(注意してください //
)
がここにあります リンク 役立つ記事に
この議論は、私が何日も苦労していた問題を解決するのに役立ちました。 11年5月18日15:17にジムタフの回答を見つけるまで、私はインターネット全体を見回しました。その答えで、私は接続することができました。今、私は恩返しをして、他の人を完全な例で助けたいと思っています。ここにあります:
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);
}
}
}
Eclipseを使用してSidなしでOracleを接続している場合。 IEを選択するドライバーが2つあります。OracleThinDriverと他のドライバーは他のドライバーです。他のドライバーを選択し、データベース列にサービス名を入力します。これで、SIDなしでサービス名を使用して直接接続できます。
使用するとき dag
それ以外の thin
, 、以下のサービス名を指す構文は、私のために働いた。 jdbc:thin
上記のソリューションは機能しませんでした。
jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
これは機能しているはずです: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME