2013-04-04 18 views
9

Tôi có máy chủ dựa trên java (Tomcat) kết nối với cơ sở dữ liệu Oracle bằng kết nối JDBC. Có nhiều cách để kết nối với cơ sở dữ liệu: SID, TNS name, Service name.Sự khác biệt giữa việc sử dụng tên TNS và tên dịch vụ trong kết nối JDBC

Tôi muốn hiểu sự khác biệt giữa mỗi kết nối này và kết nối được đề nghị (SID, TNS hoặc dịch vụ) là gì nếu kết nối với cơ sở dữ liệu được nhóm. Đây là tên TNS chúng tôi có cho cơ sở dữ liệu:

MY_NICE_TNS_NAME.MY_COMPANY.COM = 

(DESCRIPTION = 

    (ADDRESS = (PROTOCOL = TCP)(HOST = myhostname)(PORT = 1521)) 

    (LOAD_BALANCE = YES) 

    (CONNECT_DATA = 

    (SERVER = DEDICATED) 

    (SERVICE_NAME = MY_NICE_SERVICE_NAME.MY_COMPANY.COM) 

    (FAILOVER_MODE = 

    (TYPE = SELECT)(METHOD = BASIC)(RETRIES = 180)(DELAY = 5) 

    ) 

) 

) 

Cảm ơn!

+1

miễn là bạn chỉ có một hostname quy định có thực tế là không có Sự khác biệt. Nếu bạn đã kết nối với RAC (OPS) hoặc DataGuard thì có. SID là duy nhất, không thể thay đổi và kết thúc bằng số. Mặc dù SERVICE_NAME có thể có mặt trên một hoặc nhiều nút. Và nó cũng có thể di chuyển giữa các nút – ibre5041

+0

Cảm ơn, tuyệt vời để biết. Xem bình luận của tôi dưới đây. Chúng tôi có RAC. –

+1

nếu bạn sử dụng RAC thì bạn nên chỉ định tên máy chủ cho mỗi nút. xem: http://stackoverflow.com/questions/13424385/oracle-connection-string-for-rac-environment – ibre5041

Trả lời

3

Oracle SID là tên duy nhất xác định duy nhất cá thể/cơ sở dữ liệu của bạn khi tên dịch vụ là bí danh TNS mà bạn cung cấp khi kết nối từ xa với cơ sở dữ liệu của mình và tên Dịch vụ này được ghi trong tệp Tnsnames.ora trên máy khách của bạn nó có thể giống như SID và bạn cũng có thể cung cấp cho nó bất kỳ tên nào khác mà bạn muốn.

SERVICE_NAME là tính năng mới từ oracle 8i trở đi trong đó cơ sở dữ liệu có thể tự đăng ký với trình nghe. Nếu cơ sở dữ liệu được đăng ký với người nghe theo cách này thì bạn có thể sử dụng tham số SERVICE_NAME trong tnsnames.ora nếu không - hãy sử dụng SID trong tnsnames.ora.

Ngoài ra nếu bạn có OPS (RAC), bạn sẽ có SERVICE_NAME khác nhau cho từng trường hợp.

SERVICE_NAMES chỉ định một hoặc nhiều tên cho dịch vụ cơ sở dữ liệu mà cá thể này kết nối. Bạn có thể chỉ định nhiều tên dịch vụ để phân biệt giữa các cách sử dụng khác nhau của cùng một cơ sở dữ liệu. Ví dụ:

SERVICE_NAMES = sales.acme.com, widgetsales.acme.com

Bạn cũng có thể sử dụng tên dịch vụ để xác định một dịch vụ duy nhất đó là có sẵn từ hai cơ sở dữ liệu khác nhau thông qua việc sử dụng các bản sao.

Trong môi trường Oracle Parallel Server, bạn phải đặt tham số này cho mọi trường hợp.

TNS là tệp cấu hình mạng sql * xác định địa chỉ datbases để thiết lập kết nối với chúng.

+0

Chúng tôi thực sự có RAC và đó là lý do tôi yêu cầu vì nếu chúng tôi mất một cơ sở dữ liệu và điều đó xảy ra là người tôi đang chỉ đến, sau đó chúng tôi mất dịch vụ. Vì vậy, về cơ bản, những gì bạn đang nói là tôi cần phải được trỏ đến TNS để cho nó để mặc định một trong đó là làm việc. Đúng không? –

+1

Đúng vậy. Trong TNS của bạn, bạn có thể chỉ định các nút khác nhau cho RAC của bạn. Trong trường hợp đó nếu một trong các nút của bạn bị hỏng, dịch vụ vẫn có sẵn. – TheEwook

4

SERVICE_NAMEbí danh đối với trường hợp cơ sở dữ liệu (hoặc nhiều trường hợp). Mục đích chính của việc này là nếu bạn đang chạy một cụm. Sử dụng điều này chúng ta có thể kết nối cơ sở dữ liệu cụ thể trong một cụm. Và theo cách khác, sử dụng SID (S ystem ID trình xác nhận) chúng tôi có thể kết nối với một cá thể cơ sở dữ liệu, tên độc đáo cho một cá thể cơ sở dữ liệu Oracle.

Tóm lại, SID = tên duy nhất của DB, SERVICE_NAME = bí danh được sử dụng khi kết nối.

Có một số cách để cung cấp thông tin cơ sở dữ liệu như được chỉ định trực tiếp, tnsnames.ora (ví dụ: tên TNS), thư mục LDAP, dịch vụ thông tin mạng.

Một TNS (T ransparent N etwork S ubstrate) tên là tên của các mục trong tnsnames.ora tập tin được lưu giữ trong $ORACLE_HOME/network/admin
Tập tin này có chứa thông tin được sử dụng bởi hệ thống để kết nối đến cơ sở dữ liệu oracle. Sử dụng máy khách này có thể tìm nạp thông tin liên quan đến máy chủ một cách minh bạch. Nó chứa các thông tin sau

PROTOCOL 
HOST IP ADDRESS 
PORTNO 
SID or SERVICE_NAME 

Ví dụ

mydb = 
    (DESCRIPTION = 
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.35.15.1)(PORT = 1521)) 
    (CONNECT_DATA = (SID = mydb)) 

trình điều khiển JDBC kết nối với một chuỗi kết nối sử dụng TNS như sau

System.setProperty("oracle.net.tns_admin", PATH_TO_TNSNAMES.ORA); 
Class.forName ("oracle.jdbc.OracleDriver"); 
dbUrl = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST="+IPHOST+")(PORT="+PORT+"))(CONNECT_DATA=(SERVER = DEDICATED)(SERVICE_NAME="+DBNAME+")))" 

conn = DriverManager.getConnection(dbUrl, USERNAME, PASSWORD); 
Các vấn đề liên quan