[kansaipm] Socketについて教えてください
Yasushi Nakajima
sey at jkc.co.jp
Wed Dec 26 03:29:18 CST 2001
yuhashimoto> > 基幹業務に使う、あるデータベースへのアクセスが、ODBCでは、
何ユーザでもいい
yuhashimoto> > のですが、何故か、サーバで動くC言語で提供されたアクセス関数は、1ユーザしか
yuhashimoto> > 使えないので、1つの
yuhashimoto> > サーバプログラム(=1ユーザ)で、複数のプログラムからのデータベースへのアク
yuhashimoto> > セスを一手に引きうけちゃおうというプログラムです。
yuhashimoto>
yuhashimoto> あっ、forkしたら、1ユーザでなくなっちゃう。
yuhashimoto> やっぱり、selectで、もう少し、試してみます。
私も同じようなことをやったことがあります。その場合は、一回のデータベー
スアクセスはごく短いものだったので、サーバー側は単純に順次処理し、競合し
た場合はソケットの待ち行列に任せてしまうというやり方をとりました。
ある程度まとまったデータベースアクセスを許し、競合をしかるべく処理しよ
うとすると、次のようなアプローチになるかと思います。
・接続要求受付プロセスとデータベースアクセス代行プロセスの二つを走らせて
おく
・接続要求受付プロセスは、acceptしたらforkしてその後の処理は子プロセスに
任せる
・子プロセスは、クライアントからのデータベースアクセス要求を受信し、可能
な最小操作単位に分解し(トランザクションを考慮すべし)、操作指示キュー
に入れて、結果を待つ
・データベースアクセス代行プロセスは、操作指示キューから順次操作指示を取
り出してはデータベースへのアクセスをおこなって、その結果を指示を出した
子プロセスへ送る
・子プロセスは、操作指示の結果をデータベースアクセス代行プロセスから受け
取り、クライアントへ返す
検討すべき点としては、
・操作指示キューに、何を使うか
・データベースアクセス代行プロセスから、子プロセスへ操作結果を返す手段に
何を使うか
・データベースアクセス代行プロセスがビジーな場合のタイムアウトなど、エラー
処理をどうするか
forkせずに一つのプロセスでselectを駆使して並行処理を行うことは不可能で
はないでしょうが、複雑で微妙なプログラミングになって、バグ取りが大変だろ
うと思います。
中島 靖
More information about the Kansai-pm
mailing list