Java JDBC-如何使用服务名称而不是SID连接到Oracle


251

我有一个使用JDBC(通过JPA)的Java应用程序,该应用程序使用主机名,端口和Oracle SID连接到开发数据库,​​如下所示:

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是另一个数据库的服务名称。

我究竟做错了什么?

Answers:


427

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)))

您是否可以将@Robert Greathouse的每个答案中有关TNSNAMES格式的内容纳入其中,以达到完美的答案?
Alister Lee

对我而言,它不适用于@,我不得不使用jdbc:oracle:thin:// myhost:1521 / myservicename,但我也没有提供用户凭据
Daniel Daniel

我一直在尝试找出如何使用Google App Script上的JDBC瘦驱动程序连接到Oracle的方法,并尝试了多种语法,但均未成功。jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEjdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME以用户名和密码作为的参数jdbc.getConnection()。仍然令人困惑。
本杰明

92

因此,有两种简单的方法可以完成这项工作。如果您不需要提供任何其他特定于Oracle的特殊连接属性,则由Bert F发布的解决方案可以很好地工作。格式为:

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文件格式,那么您应该看起来很熟悉。如果没有,那么只需谷歌获取详细信息。


24

您还可以在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)))

17

试试这个: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

编辑:以下每条评论实际上都是正确的:(jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD请注意//

这是有用文章的链接


3
这对我不起作用,我不得不使用jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD
WynandB

因此,可以在这里使用IP而不是oracle.hostserver2.mydomain.ca
本杰明

8

讨论帮助我解决了我几天来一直在苦苦挣扎的问题。我环顾整个互联网,直到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);
        }       
    }
}

1

如果您使用eclipse连接没有SID的oracle。有两个驱动程序可供选择,即Oracle瘦驱动程序和另一个是其他驱动程序。选择其他驱动程序,然后在数据库列中输入服务名称。现在,您可以使用服务名称直接连接而无需SID。


更重要的是,与精简驱动程序不同,这使您可以完全指定连接URL。有趣的是,您仍然必须使用瘦驱动程序URL使其正常工作(仅JDBC瘦驱动程序支持的瘦样式服务名称)。这里有很多例子。
Edi Bice

0

当使用dag代替时thin,下面指向服务名称的语法对我有用。jdbc:thin上面的解决方案不起作用。

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME

1
请考虑在您的答案中添加更多信息,以更多地说明什么是行得通/行不通的-您观察到了什么或知道为什么行得通?
AJD

1
值得注意的是-您正在使用特定的驱动程序。尝试使用Oracle的瘦驱动程序将返回:没有找到适用于jdbc:dag:oracle://的合适驱动程序
access_granted

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.