Java JDBC - วิธีเชื่อมต่อกับ Oracle โดยใช้ชื่อบริการแทน SID


251

ฉันมีแอปพลิเคชัน Java ที่ใช้ JDBC (ผ่าน JPA) ที่เชื่อมต่อกับฐานข้อมูลการพัฒนาโดยใช้ชื่อโฮสต์, พอร์ตและ Oracle SID เช่นนี้:

JDBC: oracle: บาง: @ oracle.hostserver1.mydomain.ca: 1521: XYZ

XYZ คือ Oracle SID ตอนนี้ฉันต้องเชื่อมต่อกับฐานข้อมูล Oracle อื่นที่ไม่ได้ใช้ SID แต่ใช้ "ชื่อบริการ" ของ Oracle แทน

ฉันลองสิ่งนี้ แต่มันไม่ทำงาน:

JDBC: oracle: บาง: @ oracle.hostserver2.mydomain.ca: 1522: ABCD

ABCD เป็นชื่อบริการของฐานข้อมูลอื่น

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


427

http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/urls.htm#BEIDHCBA

ไวยากรณ์ชื่อบริการแบบบาง

ชื่อบริการแบบบางรองรับไดร์เวอร์ JDBC Thin เท่านั้น ไวยากรณ์คือ:

@ // host_name: port_number / service_name

ตัวอย่างเช่น:

JDBC: oracle: บาง: เสือ / Scott @ // MyHost: 1521 / myservicename

ดังนั้นฉันจะลอง:

JDBC: oracle: บาง: @ // oracle.hostserver2.mydomain.ca:1522/ABCD

นอกจากนี้ตามคำตอบของ Robert Greathouse คุณสามารถระบุชื่อ TNS ใน JDBC URL ดังต่อไปนี้:

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

คุณสามารถรวมจุดเกี่ยวกับรูปแบบ TNSNAMES ต่อคำตอบจาก @Robert Greathouse เพื่อให้ได้คำตอบที่สมบูรณ์แบบได้หรือไม่?
Alister Lee

สำหรับฉันมันใช้งานไม่ได้กับ @ ฉันต้องใช้ jdbc: oracle: thin: // myhost: 1521 / myservicename แต่ฉันไม่ได้ให้ข้อมูลรับรองผู้ใช้ด้วย
แดเนียล

ฉันพยายามคิดวิธีการเชื่อมต่อกับ Oracle โดยใช้ไดร์เวอร์แบบบางของ JDBC ใน Google App Script และลองใช้ไวยากรณ์จำนวนหนึ่งโดยไม่ประสบความสำเร็จ jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEหรือมีชื่อผู้ใช้และรหัสผ่านเพื่อเป็นข้อโต้แย้งjdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME jdbc.getConnection()ยังคงทำให้งง
เบนจามิน

92

ดังนั้นจึงมีวิธีง่าย ๆ สองวิธีในการทำงานนี้ โซลูชันที่โพสต์โดย Bert F ทำงานได้ดีหากคุณไม่ต้องการจัดหาคุณสมบัติการเชื่อมต่อเฉพาะอื่น ๆ ของออราเคิล รูปแบบสำหรับ:

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

อย่างไรก็ตามหากคุณต้องการจัดหาคุณสมบัติการเชื่อมต่อเฉพาะอื่น ๆ ของออราเคิลคุณต้องใช้รูปแบบ TNSNAMES แบบยาว ฉันต้องทำสิ่งนี้เมื่อเร็ว ๆ นี้เพื่อเปิดใช้งานการเชื่อมต่อที่ใช้ร่วมกันของออราเคิล (ซึ่งเซิร์ฟเวอร์ทำการรวมการเชื่อมต่อของตัวเอง) รูปแบบ TNS คือ:

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

หากคุณคุ้นเคยกับรูปแบบไฟล์ Oracle TNSNAMES คุณควรทำความคุ้นเคยกับรูปแบบนี้ ถ้าไม่เช่นนั้นก็แค่ Google เพื่อดูรายละเอียด


24

คุณสามารถระบุชื่อ TNS ใน JDBC URL ได้ด้านล่าง

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

การสนทนานี้ช่วยฉันแก้ปัญหาที่ฉันต้องดิ้นรนหลายวัน ฉันมองไปรอบ ๆ อินเทอร์เน็ตจนกระทั่งพบคำตอบของ Jim Tough เมื่อวันที่ 18 พฤษภาคม 2554 เวลา 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);
        }       
    }
}

1

ในกรณีที่คุณใช้ eclipse เพื่อเชื่อมต่อ oracle โดยไม่มี SID มีไดรเวอร์ให้เลือกสองรายการเช่นไดรฟ์ thin ของ Oracle และอื่น ๆ เป็นไดรเวอร์อื่น ๆ เลือกไดรเวอร์อื่น ๆ และป้อนชื่อบริการในคอลัมน์ฐานข้อมูล ตอนนี้คุณสามารถเชื่อมต่อโดยตรงโดยใช้ชื่อบริการโดยไม่ต้อง SID


ที่สำคัญกว่านี้จะช่วยให้คุณสามารถระบุ URL การเชื่อมต่อได้อย่างสมบูรณ์ซึ่งแตกต่างจาก Thin Driver สิ่งที่ตลกคือคุณยังต้องใช้ 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

0

สิ่งนี้ควรใช้งานได้: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME


1
ข้อผิดพลาด: "ระบุ URL ของ Oracle ไม่ถูกต้อง", ชุดค่าผสม 11g / ojdbc7
access_granted
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.