Java JDBC - Cara untuk terhubung ke Oracle menggunakan Layanan Nama bukan dari SID

Saya memiliki sebuah aplikasi Java yang menggunakan JDBC (via JPA) yang menghubungkan ke pengembangan database menggunakan nama host, port, dan Oracle SID, seperti ini:

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

XYZ adalah Oracle SID. Sekarang saya perlu untuk menghubungkan ke database Oracle yang tidak menggunakan SID, tetapi menggunakan Oracle "Nama Layanan" sebagai gantinya.

Saya mencoba hal ini, tapi itu doesn't bekerja:

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

ABCD adalah Nama Layanan dari database lain.

Apa yang saya lakukan salah?

Larutan

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

Tipis-gaya Nama Layanan Sintaks

Tipis-gaya nama layanan yang didukung hanya oleh JDBC Thin driver. Sintaksnya adalah:

@//host_name:port_number/service_name

misalnya:

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

Jadi saya akan coba:

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

Juga, per Robert Greathouse's jawaban, anda juga dapat menentukan TNS nama di JDBC URL 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)))
Komentar (2)

Jadi ada dua cara mudah untuk membuat karya ini. Solusi diposting oleh Bert F bekerja dengan baik jika anda don't perlu pasokan khusus lainnya Oracle-koneksi yang spesifik dan offline. Format untuk itu adalah:

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

Namun, jika anda perlu untuk memasok lain Oracle-koneksi yang spesifik properti maka anda perlu menggunakan yang lama TNSNAMES gaya. Aku harus melakukan ini untuk mengaktifkan Oracle koneksi bersama (di mana server tidak sendiri connection pooling). TNS format:

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

Jika anda're akrab dengan Oracle TNSNAMES format file, maka ini harus tampak akrab bagi anda. Jika tidak maka hanya Google untuk rincian.

Komentar (0)

Anda juga dapat menentukan TNS nama di JDBC URL 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)))
Komentar (0)

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

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

Berikut adalah link untuk membantu artikel

Komentar (1)

Diskusi ini membantu saya menyelesaikan masalah saya berjuang dengan selama berhari-hari. Aku melihat sekeliling di seluruh internet sampai saya menemukan dijawab oleh Jim Tangguh pada Mei 18 '11 pada 15:17. Dengan jawaban itu saya dapat terhubung. Sekarang saya ingin memberikan kembali dan membantu orang lain dengan contoh lengkap. Here goes:

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);
        }       
    }
}
Komentar (0)

Dalam kasus anda menggunakan eclipse untuk menghubungkan oracle tanpa SID. Ada dua driver untuk pilih yaitu, Oracle tipis driver dan lainnya adalah pengemudi lain. Pilih pembalap lain dan masukkan nama layanan di database kolom. Sekarang anda dapat menghubungkan langsung menggunakan layanan tanpa nama SID.

Komentar (1)

Ketika menggunakan dag bukan tipis, sintaks di bawah ini menunjuk ke nama layanan bekerja untuk saya. The jdbc:tipis solusi di atas tidak bekerja.

jdbc:dag:oracle://HOSTNAME:1521;ServiceName=SERVICE_NAME
Komentar (1)

Ini harus bekerja: jdbc:oracle:tipis//host:Port/ServiceName=SERVICE_NAME

Komentar (0)