Để giải quyết đúng cách lỗi này và kết nối với cơ sở dữ liệu Oracle thích hợp, chúng tôi sẽ cần giải thích một chút về cách Oracle hoạt động và do đó, điều gì đang gây ra sự cố này ngay từ đầu.
SID so với SERVICE_NAMES
Điều quan trọng là phải hiểu sự khác biệt (nhỏ) giữa những gì Oracle định nghĩa là SID
so với SERVICE_NAME
, vì chúng tôi sẽ sử dụng thông tin này để tạo một chuỗi kết nối thích hợp sau này.
Trong Oracle, mã định danh hệ thống (hoặc SID
) là số nhận dạng cục bộ có độ dài tối đa tám ký tự được sử dụng để xác định một cơ sở dữ liệu cụ thể và phân biệt nó với các cơ sở dữ liệu khác trên hệ thống.
Thường là SID
là từ tiền tố hoặc DB_UNIQUE_NAME
đứng trước DB_DOMAIN
. Ví dụ:SID
của bookstore
của chúng tôi cơ sở dữ liệu, như được thấy trong global database name
đầy đủ của bookstore.company.com
.
SERVICE_NAMES
mặt khác, đại diện cho các tên mà các cá thể cơ sở dữ liệu có thể được kết nối với. SERVICE_NAME
thường sẽ tuân theo định dạng của SID
theo sau là miền cơ sở dữ liệu, như sau:DB_UNIQUE_NAME.DB_DOMAIN
Trình nghe TNS
Khi một khách hàng đang cố gắng kết nối với cơ sở dữ liệu Oracle, thay vì kết nối với cơ sở dữ liệu trực tiếp , có một dịch vụ môi giới can thiệp và xử lý yêu cầu kết nối cho khách hàng.
Ứng dụng môi giới này được gọi là listener
và nó thực hiện nhiệm vụ lắng nghe cho các yêu cầu của khách hàng đến. Khi nhận được yêu cầu, listener
xử lý và chuyển tiếp yêu cầu đó đến máy chủ cơ sở dữ liệu Oracle thích hợp bằng cách sử dụng service handler
, chỉ hoạt động như kết nối giữa listener
và máy chủ cơ sở dữ liệu.
Tên và Cấu hình TNS
Khi kết nối với cơ sở dữ liệu Oracle, thông thường máy chủ cơ sở dữ liệu của bạn sẽ có tnsnames.ora
, là tệp cấu hình thông báo cho máy chủ về NET_SERVICE_NAMES
là các kết nối cơ sở dữ liệu hợp lệ. Theo mặc định, tệp này được đặt tại ORACLE_HOME/network/admin
.
Ví dụ:một NET_SERVICE_NAME
bộ mô tả trong tnsnames.ora
có thể được định dạng như thế này:
myDatabaseNetService =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = tcp)(HOST = localhost)(PORT = 1521)(QUEUESIZE = 100))
(CONNECT_DATA =
(SERVICE_NAME = bookstore.company.com)
)
)
Điều này sẽ xác định một NET_SERVICE_NAME
sử dụng SERVICE_NAME
chúng ta đã thảo luận trước đó (bookstore.company.com
) và kết nối với localhost
thông qua cổng 1521
.
Chuỗi kết nối
Với một chút kiến thức hơn về cách Oracle thực sự kết nối với cơ sở dữ liệu, bây giờ chúng ta có thể xem cách connection strings
được định dạng.
Kết nối qua TNS Name / NET_SERVICE_NAME
Khi kết nối qua NET_SERVICE_NAME
như được chỉ định trong tnsnames.ora
của bạn tệp cấu hình, bạn phải sử dụng username
, password
, rồi nối NET_SERVICE_NAME
với @
biểu tượng, như vậy:
username/password@NET_SERVICE_NAME
Do đó, đối với NET_SERVICE_NAME
trước đây của chúng tôi bộ mô tả ở trên, NET_SERVICE_NAME
thực tế chúng tôi đã xác định là myDatabaseNetService
, vì vậy chuỗi kết nối của chúng tôi có thể trông giống như sau:
john/Hunter2@myDatabaseNetService
Kết nối qua SERVICE_NAME
Khi kết nối qua SERVICE_NAME
, bạn cũng sẽ cần thêm host
và port
, cùng với /
ký hiệu đứng trước SERVICE_NAME
chính nó:
username/password@host:port/SERVICE_NAME
Kết nối qua SID
Cuối cùng, nếu kết nối mà không có NET_SERVICE_NAME
được định cấu hình hoặc thậm chí SERVICE_NAME
, bạn có thể làm như vậy trực tiếp thông qua SID
bằng cách sử dụng :
thay vì /
ký hiệu như với SERVICE_NAME
chuỗi kết nối:
username/password@host:port:SID