Java JDBC - Cách kết nối với Oracle bằng Tên dịch vụ thay vì SID


251

Tôi có một ứng dụng Java sử dụng JDBC (thông qua JPA) đang kết nối với cơ sở dữ liệu phát triển bằng tên máy chủ, cổng và Oracle SID, như thế này:

jdbc: oracle: thin: @ oracle.hostserver1.mydomain.ca: 1521: XYZ

XYZ là SID của Oracle. Bây giờ tôi cần kết nối với cơ sở dữ liệu Oracle khác không sử dụng SID mà thay vào đó sử dụng "Tên dịch vụ" của Oracle.

Tôi đã thử điều này nhưng nó không hoạt động:

jdbc: oracle: thin: @ oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD là Tên dịch vụ của cơ sở dữ liệu khác.

Tôi đang làm gì sai?

Câu trả lời:


427

http://doad.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htmlm#BEIDHCBA

Tên dịch vụ kiểu mỏng Cú pháp

Tên dịch vụ kiểu mỏng chỉ được hỗ trợ bởi trình điều khiển JDBC Thin. Cú pháp là:

@ // host_name: port_number / service_name

Ví dụ:

jdbc: oracle: thin: scott / tiger @ // myhost: 1521 / myservicename

Vì vậy, tôi sẽ cố gắng:

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

Ngoài ra, theo câu trả lời của Robert Greathouse, bạn cũng có thể chỉ định tên TNS trong URL JDBC như sau:

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

Bạn có thể kết hợp quan điểm về định dạng TNSNAMES cho mỗi câu trả lời từ @Robert Greathouse để đạt được sự hoàn hảo cho câu trả lời không?
Alister Lee

Đối với tôi nó không hoạt động với @, tôi đã phải sử dụng jdbc: oracle: thin: // myhost: 1521 / myservicename, nhưng tôi cũng không cung cấp thông tin đăng nhập của người dùng
Daniel

Tôi đã cố gắng tìm ra cách kết nối với Oracle bằng trình điều khiển mỏng JDBC trên Google App Script và thử một số cú pháp mà không thành công. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEhoặc jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME, với tên người dùng và mật khẩu làm đối số jdbc.getConnection(). Vẫn khó hiểu.
Benjamin

92

Vì vậy, có hai cách dễ dàng để làm cho công việc này. Giải pháp được đăng bởi Bert F hoạt động tốt nếu bạn không cần cung cấp bất kỳ thuộc tính kết nối đặc biệt nào khác của Oracle. Định dạng cho:

jdbc:oracle:thin:@//HOSTNAME:PORT/SERVICENAME

Tuy nhiên, nếu bạn cần cung cấp các thuộc tính kết nối dành riêng cho Oracle khác thì bạn cần sử dụng kiểu TNSNAMES dài. Tôi đã phải làm điều này gần đây để kích hoạt các kết nối được chia sẻ của Oracle (nơi máy chủ thực hiện việc kết nối riêng của nó). Định dạng TNS là:

jdbc:oracle:thin:@(description=(address=(host=HOSTNAME)(protocol=tcp)(port=PORT))(connect_data=(service_name=SERVICENAME)(server=SHARED)))

Nếu bạn quen thuộc với định dạng tệp Oracle TNSNAMES, thì nó sẽ trông quen thuộc với bạn. Nếu không thì chỉ cần Google nó để biết chi tiết.


24

Bạn cũng có thể chỉ định tên TNS trong URL JDBC như bên dưới

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

Thử cái này: jdbc:oracle:thin:@oracle.hostserver2.mydomain.ca:1522/ABCD

Chỉnh sửa: mỗi bình luận bên dưới đây là thực tế chính xác: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(lưu ý //)

Đây là một liên kết đến một bài viết hữu ích


3
Điều này không làm việc cho tôi, tôi phải sử dụng jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB

Vì vậy, IP có thể được sử dụng ở đây thay vì oracle.hostserver2.mydomain.ca?
Benjamin

8

Cuộc thảo luận này đã giúp tôi giải quyết vấn đề mà tôi đang vật lộn trong nhiều ngày. Tôi đã tìm khắp nơi trên internet cho đến khi tôi tìm thấy câu trả lời của Jim Tough vào ngày 18 tháng 5 năm 11 lúc 15:17. Với câu trả lời đó tôi đã có thể kết nối. Bây giờ tôi muốn trả lại và giúp đỡ người khác với một ví dụ hoàn chỉnh. Đây là:

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

Trong trường hợp bạn đang sử dụng nhật thực để kết nối orory mà không có SID. Có hai trình điều khiển để chọn, đó là trình điều khiển mỏng của Oracle và trình điều khiển khác là trình điều khiển khác. Chọn trình điều khiển khác và nhập tên dịch vụ trong cột cơ sở dữ liệu. Bây giờ bạn có thể kết nối trực tiếp bằng tên dịch vụ mà không cần SID.


Quan trọng hơn, điều này cho phép bạn chỉ định đầy đủ URL kết nối không giống như Trình điều khiển mỏng. Điều thú vị là, bạn vẫn phải sử dụng URL trình điều khiển mỏng để làm cho nó hoạt động (tên dịch vụ kiểu mỏng chỉ được hỗ trợ bởi trình điều khiển mỏng JDBC). Rất nhiều ví dụ được đăng ở đây.
Bắp cải

0

Khi sử dụng dagthay vìthin , cú pháp bên dưới trỏ đến tên dịch vụ làm việc cho tôi. Các jdbc:thingiải pháp trên không hoạt động.

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

1
Vui lòng xem xét thêm một số thông tin vào câu trả lời của bạn mô tả thêm một chút về những gì đã làm / không hoạt động - bạn đã quan sát hoặc biết gì về lý do tại sao điều này hoạt động?
AJD

1
Đáng chú ý là - bạn đang sử dụng một trình điều khiển cụ thể. Cố gắng sử dụng trả về trình điều khiển mỏng của Oracle: Không tìm thấy trình điều khiển phù hợp cho jdbc: dag: oracle: //
access_granted

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.