Java JDBC - Cara menyambungkan ke Oracle menggunakan Nama Layanan alih-alih SID

251

Saya memiliki aplikasi Java yang menggunakan JDBC (via JPA) yang terhubung ke database pengembangan menggunakan hostname, port dan Oracle SID, seperti ini:

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

XYZ adalah Oracle SID. Sekarang saya perlu terhubung ke database Oracle berbeda yang tidak menggunakan SID, tetapi menggunakan Oracle "Service Name" sebagai gantinya.

Saya mencoba ini tetapi tidak berhasil:

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

ABCD adalah Nama Layanan dari database lain.

Apa yang saya lakukan salah?

Jim Tough
sumber

Jawaban:

427

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

Sintaks Nama Layanan gaya tipis

Nama layanan gaya-tipis hanya didukung oleh driver JDBC Thin. Sintaksnya adalah:

@ // host_name: port_number / service_name

Sebagai contoh:

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

Jadi saya akan mencoba:

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

Selain itu, sesuai jawaban Robert Greathouse, Anda juga dapat menentukan nama TNS di URL JDBC seperti di bawah ini:

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)))
Bert F
sumber
Bisakah Anda memasukkan poin tentang format TNSNAMES per jawaban dari @Robert Greathouse untuk mencapai kesempurnaan jawaban?
Alister Lee
Bagi saya itu tidak bekerja dengan @, saya harus menggunakan jdbc: oracle: thin: // myhost: 1521 / myservicename, tetapi juga saya tidak memberikan kredensial pengguna
Daniel
Saya telah mencoba mencari cara untuk terhubung ke Oracle menggunakan driver JDBC pada Google App Script dan mencoba sejumlah sintaks tanpa hasil. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEatau jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAME, dengan nama pengguna dan kata sandi sebagai argumen untuk jdbc.getConnection(). Masih membingungkan.
Benjamin
92

Jadi ada dua cara mudah untuk membuat ini berfungsi. Solusi yang diposting oleh Bert F berfungsi dengan baik jika Anda tidak perlu menyediakan properti koneksi khusus Oracle lainnya. Format untuk itu adalah:

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

Namun, jika Anda perlu menyediakan properti koneksi khusus Oracle lainnya, maka Anda perlu menggunakan gaya panjang TNSNAMES. Saya harus melakukan ini baru-baru ini untuk mengaktifkan koneksi bersama Oracle (di mana server melakukan pooling koneksi sendiri). Format TNS adalah:

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

Jika Anda terbiasa dengan format file Oracle TNSNAMES, maka ini akan terlihat familier bagi Anda. Jika tidak maka hanya Google untuk detailnya.

Jim Tough
sumber
24

Anda juga dapat menentukan nama TNS di URL JDBC seperti di bawah ini

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
sumber
17

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

Sunting: per komentar di bawah ini sebenarnya benar: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(perhatikan //)

Berikut ini tautan ke artikel yang bermanfaat

DwB
sumber
3
Ini tidak bekerja untuk saya, saya harus menggunakannya jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB
Jadi IP bisa digunakan di sini bukan oracle.hostserver2.mydomain.ca?
Benjamin
8

Diskusi ini membantu saya menyelesaikan masalah yang saya perjuangkan selama berhari-hari. Saya melihat-lihat seluruh internet sampai saya menemukan jawaban oleh Jim Tough pada 18 Mei '11 jam 15:17. Dengan jawaban itu saya dapat terhubung. Sekarang saya ingin memberi kembali dan membantu orang lain dengan contoh lengkap. Ini dia:

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);
        }       
    }
}
Ed Chipeta
sumber
1

Jika Anda menggunakan eclipse untuk menghubungkan oracle tanpa SID. Ada dua driver untuk dipilih yaitu, driver Oracle tipis dan lainnya adalah driver. Pilih driver lain dan masukkan nama layanan di kolom basis data. Sekarang Anda dapat terhubung langsung menggunakan nama layanan tanpa SID.

Bhagavathy Vinoth
sumber
Lebih penting lagi ini memungkinkan Anda untuk menentukan URL koneksi sepenuhnya tidak seperti Driver Tipis. Lucunya, Anda masih harus menggunakan URL driver tipis untuk membuatnya berfungsi (nama layanan gaya tipis hanya didukung oleh driver tipis JDBC). Banyak contoh diposting di sini.
Edi Bice
0

Saat menggunakan dagalih-alih thin, sintaks di bawah ini yang menunjuk ke nama layanan bekerja untuk saya. The jdbc:thinsolusi di atas tidak bekerja.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Syk Nar
sumber
1
Harap pertimbangkan untuk menambahkan lebih banyak informasi ke jawaban Anda yang menjelaskan sedikit lebih banyak tentang apa yang berhasil / tidak berfungsi - apa yang Anda amati atau ketahui tentang mengapa ini berhasil?
AJD
1
Yang perlu diperhatikan adalah - Anda menggunakan driver tertentu. Mencoba menggunakan pengembalian driver tipis Oracle: Tidak ditemukan driver yang cocok untuk jdbc: dag: oracle: //
access_granted
0

Ini harusnya berfungsi: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME

Kamesh Murali
sumber
1
Kesalahan: "Tidak ditentukan URL Oracle", kombinasi 11g / ojdbc7.
access_granted