Untuk mengatasi kesalahan ini dengan benar dan menghubungkan ke database Oracle yang sesuai, kita perlu menjelaskan sedikit tentang bagaimana Oracle berperilaku dan, oleh karena itu, apa yang menyebabkan masalah ini.
SID vs SERVICE_NAMES
Penting untuk memahami perbedaan (sedikit) antara apa yang didefinisikan Oracle sebagai SID dibandingkan dengan SERVICE_NAME , karena kami akan menggunakan informasi ini untuk membuat string koneksi yang tepat nanti.
Di Oracle, pengenal sistem (atau SID ) adalah pengidentifikasi lokal dengan panjang hingga delapan karakter yang digunakan untuk mengidentifikasi database tertentu dan membedakannya dari database lain pada sistem.
Seringkali SID adalah kata awalan atau DB_UNIQUE_NAME yang mendahului DB_DOMAIN . Misalnya, SID dari bookstore kami database, seperti yang terlihat pada global database name full dari bookstore.company.com .
SERVICE_NAMES , di sisi lain, mewakili nama yang dengannya instance database dapat dihubungkan. Sebuah SERVICE_NAME biasanya akan mengikuti format SID diikuti oleh domain database, seperti:DB_UNIQUE_NAME.DB_DOMAIN
Pendengar TNS
Ketika klien mencoba untuk terhubung ke database Oracle, daripada menghubungkan ke database langsung , ada layanan broker yang mengintervensi dan menangani permintaan koneksi untuk klien.
Aplikasi broker ini dikenal sebagai listener dan melakukan tugas mendengarkan untuk permintaan klien yang masuk. Ketika permintaan diterima, listener memproses dan meneruskan permintaan tersebut ke server database Oracle yang sesuai menggunakan service handler , yang hanya bertindak sebagai koneksi antara listener dan server basis data.
Nama dan Konfigurasi TNS
Saat menghubungkan ke database Oracle, biasanya server database Anda akan memiliki tnsnames.ora , yang merupakan file konfigurasi yang menginformasikan server tentang NET_SERVICE_NAMES yang merupakan koneksi database yang valid. Secara default, file ini terletak di ORACLE_HOME/network/admin .
Misalnya, NET_SERVICE_NAME deskriptor di tnsnames.ora dapat diformat seperti ini:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Ini akan mendefinisikan NET_SERVICE_NAME menggunakan SERVICE_NAME kita bahas sebelumnya (bookstore.company.com ) dan menghubungkan ke localhost melalui port 1521 .
String Koneksi
Dengan sedikit lebih banyak pengetahuan tentang bagaimana Oracle benar-benar terhubung ke database, sekarang kita dapat melihat bagaimana connection strings diformat.
Hubungkan melalui Nama TNS/NET_SERVICE_NAME
Saat menghubungkan melalui NET_SERVICE_NAME seperti yang ditentukan dalam tnsnames.ora . Anda config, Anda harus menggunakan username , password , lalu tambahkan NET_SERVICE_NAME dengan @ simbol, seperti:
username/password@NET_SERVICE_NAME
Jadi, untuk NET_SERVICE_NAME kami sebelumnya deskriptor di atas, NET_SERVICE_NAME yang sebenarnya yang kami definisikan adalah myDatabaseNetService , jadi string koneksi kita mungkin terlihat seperti ini:
john/Hunter2@myDatabaseNetService
Hubungkan melalui SERVICE_NAME
Saat menghubungkan melalui SERVICE_NAME , Anda juga harus menambahkan host dan port , bersama dengan / simbol sebelum SERVICE_NAME sendiri:
username/password@host:port/SERVICE_NAME
Hubungkan melalui SID
Terakhir, jika menghubungkan tanpa NET_SERVICE_NAME yang dikonfigurasi atau bahkan SERVICE_NAME , Anda dapat melakukannya langsung melalui SID dengan menggunakan : simbol alih-alih / simbol seperti pada SERVICE_NAME string koneksi:
username/password@host:port:SID