kagamihogeの日記

kagamihogeの日記です。

SQL DeveloperのOracle接続について調べたこと

環境はWindows XPにインストールしたOracle 11g XEです。

基本

接続をしたあとv$session_connect_infoを見てみる。

NETWORK_SERVICE_BANNER CLIENT_DRIVER
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows(後略) jdbcthin

という行があるので、JDBC THINクライアントとして接続しにいっているようだ。起動にJavaを要求するんだから当然といえば当然か。

OCIでの接続

プリファレンス -> データベース -> 拡張 -> OCI/Thickドライバの使用というオプションがあり、コレにチェックを入れるとJDBC OCIドライバでの接続になる。

NETWORK_SERVICE_BANNER CLIENT_OCI_LIBRARY CLIENT_DRIVER
Windows NT TCP/IP NT Protocol Adapter for 32-bit Windows(後略) Home-based jdbcoci

参考:(補足)Oracleへの接続 | TECHSCORE(テックスコア)

TNS

ネットワーク別名のリスト候補はどこから取得しているのか。マニュアルによると下記のようになっている。

TNS connection type

(略)The list for selecting a network alias is initially filled from all tnsnames.* files on your system, unless you have set the Database: Advanced preference Tnsnames Directory to identify the location of the tnsnames.ora file to be used.

ネットワーク別名のリストはSQL Developerを動作させているコンピュータ上のすべてのtnsnames.* ファイルによって初期化されます。ただし、プリファレンス -> データベース -> 拡張のTnsnamesディレクトリの設定項目でtnsnames.oraファイルが指定されていない場合に限ります。

SQL Developer 3.1 マニュアル Create/Edit/Select Database Connection より抜粋 後半部分は俺の適当な訳

all tnsnames.* files on your systemって何がどうallなのかアレですが、フツーに考えればtnsnames.oraファイルを探しに行く場所は従来通りでしょう。

WindowsにOracle 11g XEをインストールした場合、レジストリORACLE_HOMEがありその値はC:\oraclexe\app\oracle\product\11.2.0\serverであり$ORACLE_HOME\network\adminにあるtnsnames.oraを参照していると思われる。

参考:ORACLE_SID、ORACLE_HOME の確認方法 - オラクル・Oracleをマスターするための基本と仕組み

下記の抜粋はOracle Net Servicesでの話だけどコレを踏襲してるのかなぁとか。

ユーザーレベルの設定ファイル(UNIX/Linuxのみ) $HOME(ホームディレクトリ) 

環境変数またはレジストリTNS_ADMINで指定したディレクトリ

システムレベルの設定ファイル(UNIX/Linuxのみ)Linux:/etc

デフォルトの設定ファイル Windows:\network\admin UNIX/Linux:/network/admin
プロとしてのOracleアーキテクチャ入門 Oracle現場主義 CHAPTER 20 基本的な接続形態とNet Servicesの構成 - 設定ファイルを読み込む順序 より抜粋 上のほうが優先順位が高い

任意のTNSファイルを使用したい場合、ツール -> プリファレンス -> データベース -> 拡張 のTnsnamesディレクトリを設定する。

ローカル/Bequeath

Bequeathとは何なのか。SQL Developerのマニュアルによると、

using bequeath protocol: if the client and database exist on the same computer, then a client connection can be passed directly to a dedicated server process without going through the listener

bequeathプロトコルの使用:もしクライアントとデータベースが同一マシン上にあるとき、クライアントのコネクションはリスナーを経由することなく専用サーバのプロセスへ直接渡される。

SQL Developer 3.1 マニュアル Create/Edit/Select Database Connection より抜粋 後半部分は俺の適当な訳

windowsにOracleをインストールすると、デフォルトではインスタンスとリスナーはセットで起動するので、コレを試すにはOracleを起動したあとサービスからリスナーだけ停止するなどする必要がある。

v$session_connect_infoでは下記のように現れる。

NETWORK_SERVICE_BANNER CLIENT_OCI_LIBRARY CLIENT_DRIVER
Oracle Bequeath NT Protocol Adapter for 32-bit Windows(後略) Home-based jdbcoci

どうやって接続してるのかやや謎な感のあるBequeathプロトコルだが、CHAPTER 02 クライアントアプリケーションとサーバープロセス - プロとしてのOracleアーキテクチャ入門OTN Discussion Forums : Why can I connect locally without connect string or listener? を読むところによると、リスナーがしているのと同等のことをローカルでやってくれている、ということらしい。

拡張

なぜ、ホストアドレス・ポート・SIDorサービス名での接続が基本(Basic)に対し、JDBCを直打ちするのが拡張(Advanced)なのかなぁ、と最初は疑問に感じていたんですが。LDAPは試してないけど、基本・TNS・localはJDBCで接続するのでありJDBCのURLの直打ちに入力ボックスのガワを被せてる感じなんですよね。それで基本に対して拡張なのかなぁ、と。