Ana içeriğe geç

Apinizer Oracle Connection – TNS ve Time Zone Hatalarının Çözümü

Oracle bağlantısı kurarken bazı ortamlarda TNS çözümleme hatası, listener tanıma sorunu veya zaman dilimi (timezone) hatası alınabilir. Bu durum genellikle JDBC URL biçiminin Oracle sunucusunun gerçek bağlantı bilgileriyle uyumlu olmamasından kaynaklanır.

Bu sayfada, Apinizer üzerinde Oracle bağlantısını doğru şekilde tanımlamak için gerekli olan DESCRIPTION formatlı JDBC URL yapısı ve oracle.jdbc.timezoneAsRegion=false parametresi açıklanmıştır.

1. TNS / Oracle Connection Hatası

Oracle bağlantısı eklenirken aşağıdaki gibi bir TNS veya bağlantı hatası alınıyorsa:

  • ORA-12154: TNS:could not resolve the connect identifier specified
  • ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
  • ORA-12541: TNS:no listener
  • Oracle bağlantısında TNS veya connect descriptor ile ilgili hatalar

JDBC URL'nin DESCRIPTION formatında tanımlanması önerilir.

Kullanılması gereken JDBC URL formatı

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB_IP_VEYA_HOST>)(PORT=<PORT>))(CONNECT_DATA=(SERVICE_NAME=<SERVIS_ADI>)))

Parametrelerin açıklaması

ParametreAçıklamaÖrnek
HOSTOracle DB sunucusunun IP adresi veya hostname'i192.168.1.10
PORTOracle Listener portu1521
SERVICE_NAMEOracle servis adıORCL

Örnek

Oracle veritabanının;

  • Host: 192.168.1.10
  • Port: 1521
  • Service Name: ORCL

olması durumunda:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))

Not: SERVICE_NAME ile SID aynı şey değildir. Oracle bağlantı bilgileriniz SID üzerinden veriliyorsa JDBC URL formatı buna göre düzenlenmelidir.


2. Time Zone Hatası

Oracle bağlantısı başarıyla kuruluyor ancak bağlantı sırasında Time Zone / timezone ile ilgili bir hata alınıyorsa JDBC URL'ye:

oracle.jdbc.timezoneAsRegion=false

parametresi eklenmelidir.

Kullanılması gereken JDBC URL formatı

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB_IP_VEYA_HOST>)(PORT=<PORT>))(CONNECT_DATA=(SERVICE_NAME=<SERVIS_ADI>)))?oracle.jdbc.timezoneAsRegion=false

Örnek

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)))?oracle.jdbc.timezoneAsRegion=false

Bu parametre, Oracle JDBC Driver'ın Time Zone bilgisini region formatında değerlendirmesinden kaynaklanan bazı bağlantı problemlerinin giderilmesini sağlar.


3. Hangi Durumda Hangi JDBC URL Kullanılmalı?

DurumKullanılacak JDBC URL
Standart Oracle bağlantısıOracle'ın standart JDBC URL formatı
TNS / connect descriptor hatasıDESCRIPTION formatındaki JDBC URL
Time Zone hatasıDESCRIPTION formatındaki URL + oracle.jdbc.timezoneAsRegion=false
Hem TNS hem Time Zone problemiDESCRIPTION formatındaki URL + oracle.jdbc.timezoneAsRegion=false

TNS hatası için

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB_IP_VEYA_HOST>)(PORT=<PORT>))(CONNECT_DATA=(SERVICE_NAME=<SERVIS_ADI>)))

Time Zone hatası için

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB_IP_VEYA_HOST>)(PORT=<PORT>))(CONNECT_DATA=(SERVICE_NAME=<SERVIS_ADI>)))?oracle.jdbc.timezoneAsRegion=false

4. Dikkat Edilmesi Gerekenler

JDBC URL oluşturulurken aşağıdaki bilgilerin Oracle yöneticisinden veya mevcut Oracle bağlantı yapılandırmasından doğrulanması gerekir:

  1. HOST – Oracle DB sunucusunun IP adresi veya hostname'i
  2. PORT – Oracle Listener portu
  3. SERVICE_NAME – Oracle servis adı
  4. Oracle Listener'ın ilgili port üzerinden erişilebilir olması
  5. Apinizer'ın çalıştığı sunucu/pod üzerinden Oracle DB'ye ağ erişiminin bulunması

Özellikle Kubernetes ortamında bağlantı test edilirken, Oracle DB'ye erişimin Apinizer pod'u içerisinden kontrol edilmesi gerekir.

Örneğin:

kubectl exec -it <apinizer-pod> -n <namespace> -- bash

Ardından Oracle sunucusuna port erişimi kontrol edilebilir:

nc -vz <DB_IP_VEYA_HOST> <PORT>

Örneğin:

nc -vz 192.168.1.10 1521

Bağlantı sağlanamıyorsa sorun JDBC URL'den ziyade network, firewall, security group veya Oracle Listener yapılandırmasından kaynaklanıyor olabilir.

Özet

Oracle bağlantısında TNS/connect descriptor hatası görülüyorsa DESCRIPTION formatındaki JDBC URL kullanılmalıdır.

Time Zone hatası görülüyorsa aynı URL'nin sonuna:

?oracle.jdbc.timezoneAsRegion=false

parametresi eklenmelidir.

Bu nedenle en kapsamlı kullanım aşağıdaki formattadır:

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<DB_IP_VEYA_HOST>)(PORT=<PORT>))(CONNECT_DATA=(SERVICE_NAME=<SERVIS_ADI>)))?oracle.jdbc.timezoneAsRegion=false