2009-10-29 33 views
9

Chúng tôi đang kết nối với Oracle từ mã của chúng tôi với một lớp kết nối JDBC đơn giản (tùy chỉnh). Lớp này đọc thuộc tính kết nối từ một tệp tài nguyên và cố gắng tạo kết nối tới Oracle (kết nối mỏng).URL JDBC chính xác để kết nối với cơ sở dữ liệu RAC

Tuy nhiên, gần đây cơ sở dữ liệu đã chuyển sang RAC và hiện tại ứng dụng không thể kết nối với DB.

Đây là kết quả tnsping:

Used LDAP adapter to resolve the alias 
Attempting to contact (DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db1.myco.com)(PORT=1604)) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db2.myco.com)(PORT=1604)))(CONNECT_DATA=  
SERVICE_NAME=mydb1.myco.com)(SERVER=DEDICATED))) 
OK (80 msec) 

Điều gì sẽ là URL chính xác để xác định trong trường hợp này?

Trả lời

16

URL nên trông giống như sau:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(LOAD_BALANCE=OFF)(FAILOVER=ON) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db1.myco.com)(PORT=1604)) 
(ADDRESS=(PROTOCOL=TCP)(HOST=tst-db2.myco.com)(PORT=1604))) 
(CONNECT_DATA=(SERVICE_NAME=mydb1.myco.com)(SERVER=DEDICATED))) 

Trên thực tế, chỉ cần sao chép tnsentries từ tnsnames.ora của bạn.

+0

Điều đó. Là. Tuyệt vời. Tôi không có ý tưởng bạn có thể trực tiếp sao chép từ 'tnsnames.ora'. Tôi chỉ lội qua một số chuỗi kết nối JDBC địa ngục trước đó. Bài đăng của bạn thực sự hữu ích. – kevinarpe

1

Bạn có thể muốn xem các trình điều khiển OCI. Tôi tin rằng họ được cho là sẽ thực hiện tốt hơn và xử lý RAC tốt hơn.

từ http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96590/adg01dev.htm#429762

OCI cung cấp lợi thế đáng kể so với các phương pháp khác truy cập vào một cơ sở dữ liệu Oracle:

kiểm soát
  • More hạt mịn trên mọi khía cạnh của thiết kế đơn.
  • Mức độ kiểm soát cao đối với việc thực thi chương trình.
  • Sử dụng các kỹ thuật lập trình 3GL quen thuộc và các công cụ phát triển ứng dụng như trình duyệt và trình gỡ rối.
  • Hỗ trợ SQL động, phương pháp 4.
  • Tính khả dụng trên phạm vi rộng nhất của nền tảng của tất cả các giao diện lập trình Oracle.
  • Liên kết động và xác định bằng cách sử dụng gọi lại.
  • Mô tả chức năng hiển thị các lớp siêu dữ liệu máy chủ.
  • Thông báo sự kiện không đồng bộ cho các ứng dụng khách đã đăng ký.
  • Khả năng ngôn ngữ thao tác dữ liệu mảng nâng cao (DML) cho các mảng INSERT, UPDATE và DELETE.
  • Khả năng liên kết yêu cầu cam kết với thực thi để giảm các chuyến đi khứ hồi.
  • Tối ưu hóa cho các truy vấn sử dụng bộ đệm tìm nạp trước trong suốt để giảm các chuyến đi khứ hồi.
  • An toàn chủ đề để bạn không phải sử dụng khóa chung độc quyền (mutex) trên tay cầm OCI.
  • Kết nối máy chủ trong chế độ không chặn có nghĩa là điều khiển trả lại mã OCI khi cuộc gọi vẫn đang thực thi hoặc không thể hoàn thành.
+0

Đồng ý - nhưng chính sách của doanh nghiệp (tiếng thở dài) khuyến nghị sử dụng các khách hàng mỏng trên các đối tác 'dày' của họ. – Vini

+1

Wow ... điều đó thật ngu dốt. –

2

Điểm của một tập tin TNSNAMES, máy chủ Oracle Names cũ và mới hơn, đề nghị LDAP phương pháp máy chủ thư mục giải quyết tên cơ sở dữ liệu là để tránh phải hardcode hostname, địa chỉ, bến cảng, vv vào của bạn chuỗi kết nối. Các DBAs sẽ có thể di chuyển cơ sở dữ liệu đến một máy chủ hoặc cổng mới mà không vi phạm bất cứ điều gì.

Cách tốt nhất để thiết lập URL kết nối mỏng của bạn là với cú pháp sau:

jdbc:oracle:thin:@ldap://<OID server name>:<OID port>/<DB SID or Service Name>,cn=OracleContext,dc=<yourdomain>

Vì vậy, trong trường hợp của bạn, nếu "oid" là tên DNS-phân giải của máy chủ OID tại công ty của bạn , và nó được sử dụng cổng 5000, nó sẽ là:

jdbc:oracle:thin:@ldap://oid:5000/mydb1,cn=OracleContext,dc=myco,dc=com

Nếu DBA của bạn chưa thiết lập OID, họ là woefully phía sau. Đã đến lúc nhận các DBA mới.

-squish

0

bạn cũng có thể sử dụng quét ip trong oracle 11g r2 thay vì nút ip của bạn:

testi=(DESCRIPTION = 
(ADDRESS_LIST= 
(ADDRESS= (PROTOCOL = TCP)(HOST = scan-ip-or-name)(PORT = 1521)) 
(FAILOVER = on) 
(LOAD_BALANCE = on) 
) 
(CONNECT_DATA= 
(SERVICE_NAME = testi) 
)) 
0

Tôi không chắc chắn nếu bạn giải quyết vấn đề của bạn, nhưng tôi phải đối mặt với cùng một vấn đề và giải pháp này làm việc cho tôi:

jdbc:oracle:oci:@(DESCRIPTION=(FAILOVER=on)(ADDRESS=(PROTOCOL=TCP)(HOST=**mi.host**)(PORT=**1521**))(LOAD_BALANCE=yes)(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=**serviceName**))) 
+0

Cảm ơn Francisco. Tôi đã nhận được giải pháp (xem câu trả lời được chấp nhận). Dù sao, đánh giá cao bạn dành thời gian để cho vay một bàn tay. – Vini

0

đây là những gì tôi được sử dụng:

jdbc:oracle:thin:@ldap://xxx:389/yyy,cn=OracleContext,dc=zzz,dc=com 
ldap://xxx:389/yyy,cn=OracleContext,dc=zzz,dc=com 
ldap://xxx:389/yyy,cn=OracleContext,dc=zzz,dc=com 
Các vấn đề liên quan