Java JDBC - SID yerine Hizmet Adı kullanılarak Oracle'a bağlanma


251

Ana bilgisayar adı, bağlantı noktası ve Oracle SID kullanarak aşağıdaki gibi bir geliştirme veritabanına bağlanan JDBC (JPA aracılığıyla) kullanan bir Java uygulaması var:

JDBC: oracle: İnce: @ oracle.hostserver1.mydomain.ca: 1521: XYZ

XYZ, Oracle SID idi. Şimdi SID kullanmayan, ancak bunun yerine Oracle "Hizmet Adı" kullanan farklı bir Oracle veritabanına bağlanmam gerekiyor.

Bunu denedim ama işe yaramıyor:

JDBC: oracle: İnce: @ oracle.hostserver2.mydomain.ca 1522: ABCD

ABCD diğer veritabanının Hizmet Adıdır.

Neyi yanlış yapıyorum?

Yanıtlar:


427

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

İnce Stil Hizmet Adı Sözdizimi

İnce stil hizmet adları yalnızca JDBC İnce sürücüsü tarafından desteklenir. Sözdizimi:

@ // host_name: baglanti_noktasi_numarasi / Hizmet_adı

Örneğin:

jdbc: oracle: İnce: Scott / kaplan @ // myhost: 1521 / myservicename

Bu yüzden denerdim:

jdbc: oracle: İnce: @ // oracle.hostserver2.mydomain.ca:1522/ABCD

Ayrıca, Robert Greathouse'un cevabına göre, JDBC URL'sinde TNS adını aşağıdaki gibi de belirleyebilirsiniz:

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

Cevap mükemmellik elde etmek için @Robert Greathouse'dan cevap başına TNSNAMES formatı ile ilgili noktayı dahil edebilir misiniz?
Alister Lee

Benim için @ ile çalışmadı, jdbc: oracle: thin: // myhost: 1521 / myservicename kullanmak zorunda kaldım, ama aynı zamanda kullanıcı kimlik bilgileri vermedim
Daniel

Google App Script'te JDBC ince sürücüsünü kullanarak Oracle'a nasıl bağlanacağımı anlamaya çalışıyordum ve başarılı olmadan bir dizi sözdizimi denedim. jdbc:oracle:thin:USER/PWD@//my.ip.address:1521/SERVICENAMEveya jdbc:oracle:thin:@//my.ip.address.1521/SERVICENAMEargüman olarak kullanıcı adı ve şifre ile jdbc.getConnection(). Hala kafa karıştırıcı.
Benjamin

92

Yani bu işi yapmanın iki kolay yolu var. Bert F tarafından gönderilen çözüm, Oracle'a özgü başka özel bağlantı özellikleri sağlamanız gerekmiyorsa iyi çalışır. Bunun biçimi:

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

Ancak, Oracle'a özgü diğer bağlantı özelliklerini sağlamanız gerekiyorsa, uzun TNSNAMES stilini kullanmanız gerekir. Son zamanlarda Oracle paylaşılan bağlantıları (sunucunun kendi bağlantı havuzu yaptığı) etkinleştirmek için bunu yapmak zorunda kaldı. TNS biçimi:

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

Oracle TNSNAMES dosya biçimini biliyorsanız, bu size tanıdık gelmelidir. Değilse, ayrıntılar için sadece Google.


24

JDBC URL'sinde TNS adını aşağıdaki gibi de belirleyebilirsiniz

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

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

Düzenleme: aşağıdaki yorum başına bu aslında doğrudur: jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD(not //)

İşte yararlı bir makalenin bağlantısı


3
Bu benim için işe yaramadı, kullanmak zorundaydım jdbc:oracle:thin:@//oracle.hostserver2.mydomain.ca:1522/ABCD.
WynandB

IP yerine burada kullanılabilir oracle.hostserver2.mydomain.cami?
Benjamin

8

Bu tartışma günlerce uğraştığım sorunu çözmeme yardımcı oldu. Jim Tough tarafından 18 Mayıs'ta saat 15: 17'de cevap bulana kadar internetin her yerine baktım. Bu cevapla bağlanabildim. Şimdi geri vermek ve başkalarına tam bir örnek vermek için yardım etmek istiyorum. İşte gidiyor:

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

SID olmadan Oracle'ı bağlamak için tutulma kullanıyorsanız. Seçilecek iki sürücü var, yani Oracle ince sürücü ve diğer sürücü. Diğer sürücüleri seçin ve veritabanı sütununa hizmet adını girin. Artık SID olmadan servis adını kullanarak doğrudan bağlanabilirsiniz.


Daha da önemlisi bu, İnce Sürücünün aksine bağlantı URL'sini tam olarak belirtmenize olanak tanır. Komik olan şey, yine de çalışmak için ince sürücü URL'sini kullanmanız gerekir (ince stil hizmet adları sadece JDBC ince sürücü tarafından desteklenir). Burada birçok örnek yayınlanmıştır.
Edi Bice

0

dagBunun yerine kullanırken thin, hizmet adını gösteren aşağıdaki sözdizimi benim için çalıştı. Yukarıdaki jdbc:thinçözümler işe yaramadı.

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

1
Lütfen yanıtınıza neyin işe yarayıp neyin işe yaramadığına dair biraz daha fazla bilgi veren biraz daha bilgi eklemeyi düşünün; bunun neden işe yaradığını gözlemlediniz veya ne biliyorsunuz?
AJD

1
Dikkate değer - belirli bir sürücü kullanıyorsunuz. Oracle'ın ince sürücü dönüşlerini kullanmaya çalışmak: jdbc: dag: oracle: //
access_granted

0

Bu çalışıyor olmalı: jdbc:oracle:thin//hostname:Port/ServiceName=SERVICE_NAME


1
Hata: "Geçersiz Oracle URL belirtildi", 11g / ojdbc7 kombinasyonu.
access_granted
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.