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