Adaptive Server Anywhere (SQL Anywhere) クライアントからサーバへTCP/IP を用いて接続する方法

テクニカル・サポートでは、データベース接続に関する問題に遭遇することがよくあります。これは本製品の最も誤解されやすい領域の1 つです。このドキュメントでは、バージョン6 以降でデータベース接続を確立するプロセスをステップごとに説明します。

ネットワーク内のネットワーク・サーバ上で実行されているデータベースに接続するには、クライアント・ソフトウェアがデータベース・サーバの場所を特定する必要があります。クライアント・ライブラリは、指定された名前のパーソナル・サーバ(ローカル・マシン上のスタンドアロン・エンジン)を探してから、ネットワーク上で指定された名前のサーバを探します。AdaptiveServer Anywhere (SQL Anywhere)では、このタスクを処理するネットワーク・ライブラリを用意しています。このネットワーク・ライブラリは、ネットワークに対してブロードキャストを行うことによってサーバを検索しますが、これは時間のかかるプロセスです。ネットワーク・ライブラリがサーバの場所を特定すると、クライアント・ライブラリはその名前とネットワーク・アドレスをファイル(asasrv.ini)に保存して、それ以降、指定されたプロトコルを使用してそのサーバへ接続するときには、このエントリを再利用します。

接続パラメータは、接続文字列としてインタフェース・ライブラリに渡されます。この文字列は、セミコロン(:)で区切られた1 組のパラメータで構成されます。
パラメータ1=値1;パラメータ2=値2;…

一般に、アプリケーションによって作成され、インタフェース・ライブラリに渡される接続文字列は、ユーザによる情報の入力形式を直接反映したものではありません。その代わり、ユーザがダイアログ・ボックスに情報を入力したり、アプリケーションが初期化ファイルから接続情報を読み取ります。次に接続パラメータ文字列のサンプルを示します。

“UID=dba;PWD=sql;ENG=myserver;DBN=mydb;CommLinks=tcpip”

以下にプロセスを示します。

ケース1:サーバの検索(UDP)

1. DoBroadcast=NONE の場合は、ケース2 に進みます。

2. UDP ソケットを開きます。ClientPort パラメータが指定されている場合は、指定されたポートにバインドします。

3. アドレス・キャッシュからサーバ名を探します。アドレスがキャッシュに存在する場合は、サーバ名が含まれたそのアドレス宛てにUDP ブロードキャストを直接送信します。応答を5 秒間待機してから、1 秒ごとに1 回ブロードキャストを再送信します。応答が返ってきたら、ステップ13 に進みます。

4. DoBroadcast=DIRECT (またはNO)の場合は、ステップ8 に進みます。

5. Broadcast パラメータが設定されている場合は、ステップ7 に進みます。

6. MyIP パラメータが設定されている場合は、指定されたIP アドレスのリストを作成します。
MyIP パラメータが設定されていない場合は、OS からローカル・マシンのIP アドレスのリストを取得します。IP アドレスのリストにループバック・アドレス(127.0.0.1)が存在しない場合は、そのリストに追加します。リスト内の各アドレスを、IP アドレスのクラスに基づいたブロードキャスト・アドレスに変更します。クラスA アドレスの場合は、最後の3 バイトを255 に変更します。クラスB アドレスの場合は、最後の2 バイトを255 に変更し、クラスC アドレスの場合は、最後のバイトを255 に変更します。

7. 各ブロードキャスト・アドレスに対して、UDP ブロードキャスト・パケットを送信します。
ポートはすべてのパケットに対して2638 を使用します。Port パラメータが指定されている場合は、指定されたポートでもパケットを送信します。

8. Host パラメータが使用されている場合は、指定された各アドレスにUDP ブロードキャスト・
パケットを送信します。同様に、ポートは2638 を使用するとともに、Port パラメータで指定されたポートも使用します。

9. ブロードキャストに対する応答の待機を開始します。(a)応答を受信するまで、または(b)タイムアウト(デフォルトは5 秒)が経過するまで、1 秒ごとにステップ7~8 を1 回繰り返します。
UDP パケットは保証されていないため、ブロードキャストが失われる可能性があるからです。

10. 名前が一致するAdaptive Server Anywhere (SQL Anywhere) サーバがブロードキャスト・パケットを受信した場合、そのAdaptive Server Anywhere (SQL Anywhere) サーバは応答を返し、それ以外の場合はパケットを無視します。

11. 5 秒以内に応答を受信しなかった場合は、エラー・コード-100 が返されます。

12. OS がブロードキャスト応答の送信者のIP アドレスを示します。応答にはサーバのポート番号も含まれます。

13. UDP ソケットを閉じます。

14. TCP ソケットを開きます。ClientPort パラメータが指定されている場合は、指定されたポートにバインドします。

15. 以上でIP アドレス(アドレス・キャッシュまたはOS より取得)およびポート番号(ブロードキャストの応答より取得)が判明します。そのアドレスに対してTCP 接続を行ってみましょう。
接続に失敗した場合は、エラー・コード-100 が返されます。

16. エラー・コード0 が返され、接続が確立します。

ケース2: サーバの検索と接続(UDP なし)

1. TCP ソケットを開きます。ClientPort パラメータが指定されている場合は、指定されたポートにバインドします。

2. アドレス・キャッシュからサーバ名を探します。アドレスがキャッシュに存在する場合は、
そのアドレスに対してTCP 接続を行ってみます。接続に成功した場合は、ステップ6 に進んでサーバ名を確認します。確認に成功した場合は、エラー・コード0 が返されます。以上で接続が確立します。

3. Host パラメータが指定されていない場合は接続できません。エラー・コード-100 が返されます。

4. Host で指定された各アドレスと、Port で指定された各ポート(Port が指定されていない場合は2638)について、そのアドレスに対してTCP 接続を行ってみます。接続に成功した場合は、ステップ6 に進んでサーバ名を確認します。確認に成功した場合は、エラー・コード0 が返されます。以上で接続が確立します。確認に失敗した場合は、Host パラメータで指定された次のアドレスに対してTCP 接続を行ってみます。

5. いずれの接続も成功しなかった場合は、エラー・コード-100 が返されます。

6. Adaptive Server Anywhere (SQL Anywhere)サーバへのTCP 接続が確立した場合は、そのサーバ名が検索対象の名前と一致しているか確認する必要があります。TCP 接続を介して”無接続要求”パケットを送信し、サーバ名を要求します。

7. 無接続応答で返されたサーバ名と、検索対象のサーバ名を比較します。それらが一致しない場合は、接続を閉じて、(どこからであっても)元のステップ2 または4 に戻ります。

注意:

1. タイムアウトの5 秒は、Timeout パラメータで変更できます。例:Links=tcpip(TO=2)

2. ネットワーク上に同じ名前のサーバが複数存在する場合は、複数のブロードキャスト応答を受信する可能性があります。その場合は、最初の応答を使用して、以降の応答は無視します。このため、ネットワーク上に同じ名前のサーバを複数配置しないことをお奨めします。同じ名前のサーバが存在すると、Host パラメータおよびDoBroadcast=DIRECTパラメータを使用しない限り、接続先を保証できません。

3. DoBroadcast=NONE パラメータは7.0.2 以降でのみ有効です。バージョン6.0.3~7.0.1 では、同じ機能としてUseUDP=NO を使用してください。この機能は6.0.3 よりも前のバージョンでは使用できません。

4. DoBroadcast=DIRECT パラメータは、7.0.2 以降でのみ有効です。7.0.2 よりも前のバージョンでは、同じ機能としてDoBroadcast=NO を使用してください。

5. Broadcast パラメータは、バージョン6.0.3.3096+、6.0.4.3702+、7.0.2.1449、および7.0.3以降でのみ機能します。特に7.0.0 や7.0.1 では機能しません。

6. ClientPort パラメータは、6.0.3 以降でのみ使用できます。