[Seasar-user:2249] Re: ConnectionPoolの不使用について

Koichi Kobayashi koichik
2005年 6月 24日 (金) 01:00:31 JST


小林 (koichik) です.

Date:    Thu, 23 Jun 2005 11:17:34 +0900
From:    加藤太朗 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:2237] Re: ConnectionPoolの不使用について

> > ResultSet#getBinaryStream() 等から取得した InputStream をちゃんと
> > close() してもそうなっちゃうのでしょうか?
> S2Dao使っているので試してないですが、S2Daoで得たエンティティの
> byte[] なプロパティを使っているに過ぎないので、S2Daoがcloseしてるか
> どうかかなと。このプロパティのゲッターの処理中に、Httpのクライアントが
> 切断された時に、どう動くかというのが問題なのかもしれません。

おっと,ResultSet#getBytes() に過ぎないのですか.
てっきり一度には読めないような長大なデータを少し読んでは少し書いて,を
繰り返すようなことをやっているのかと思いました.
そうすると,少なくとも ResultSet#getBytes() は完結しているわけで,
なにが問題で「未読」が残るのか不思議ですね.

ちなみに,ブラウザから HTTP コネクションが切断されると HttpResponse への
書き込みのフラッシュが失敗するまで,何も起きなかった気がします.
# それを試したのが遠い昔なので勘違いしているとか環境によって違うとか
# あるかも.

> LogicalConnectionHandleは分かりやすいですが、getXAConnection().getConnection()
> のことであれば、現状のプールとTransactionとXADataSourceの3つ巴のConnectionWrapperImpl
> をLogicalConnectionと呼ぶのには抵抗がありますね。

ちょっと違います.

XAConnection                :Physical Connection
XAXonnection.getConnection():Logical Connection
Connection                  :Logical Connection Handle

最後のやつは Logical Connection への Handle であり Wrapper であり
Proxy であるようなやつで,利用者が使う java.sql.Connection は
こいつになります.

> > ConnectionWrapper 自体は XA をサポートしませんよ?
> あれ?でも、XA... を返すメソッドが追加されてますよね?

その XAResource を JTA トランザクションに関連づけたりはしないという
意味です.XASupportedConnectin という名前からはそういうものを私は
想像してしまいます.単に XAResource を取得できるだけなら XAConnection と
変わらない感じなので,それよりも大きな能力を持っていると感じるわけです.
それよりは Wrapper とか Handle とか Proxy とか,大したことなさそうな
名前の方がこの場合の役割を想像しやすくて適切だと私には感じられます.

> > そもそも ConnectionWrapper というインタフェースは通常の利用者が
> > 目にするものではなく,コネクションプーリングを実装するひとかたまりの
> > コンポーネントの中で使用されるインタフェースです.
> それは「ConnectionWrapperImpl」の説明でしかありません。

そうではないと思います.
ConnectionWrapper は利用者が使うことを想定したインタフェースではなく,
Eclipse でいうところの internal なパッケージに含まれるようなものだと
私は思っています.

> で、通常の利用者の目に触れさせる必要がない閉じた世界で、今後実装が多様化
> しないものなのであれば、DICONのためだけに無理にインターフェースにする
> 必要性は無いですよね?インターフェースありきで実装があるのであって、
> 実装がありきでインターフェースがあるのは、どうかな?というのが論旨なんです。

ConnectionWrapper は dicon に登録して使うものではありません.
# j2ee.dicon にも記述されていません.
そのためだけにインタフェースを用意しているのではなく,インタフェースと
実装の分離を S2 自身の提供するコンポーネントにおいても実践しているのだと
思います.

> > 似たようなプロパティを増やしても分かりにくいだけなので賛成しかねます.
> > 仮にやるなら int ではなく boolean で enablePooling とかでしょうが,
> > そうする必要性もないと思います.
> うーん、ぜんぜん似てません。
中略
> maxPoolSizeのままだけにするのであれば、プールが空くまでwhileで待つ事自体を
> やめて欲しいです。だってプールでしょ?maxPoolSizeを超えるようであれば、
> プールに入れるのをやめれば良いだけだと思います。

おそらく maxPoolSize というプロパティの意味を誤解していると思います.
ソースを読むのも結構ですが,ドキュメントにも目を通して頂けると助かります.
以下は http://www.seasar.org/dbcp.html の maxPoolSize の記述です.

----------------------------------------------------------------------
同時にアクティブになれるコネクションの数を指定します。 
この数を超える要求があると、コネクションがプールに返されるまで
その要求はブロックされます。 
デフォルトは10です。
----------------------------------------------------------------------

通常,プールのサイズというのはこの意味になるようです.
例えば Commons DBCP ではこのプロパティは maxSize です.このプロパティを
持っているのは XxxPool なので,その意味は当然ながらプールの最大値です.
古の (?) Apache Avalon Excalibur は単純に max.
プロパティじゃなくて管理画面での表記ですが,WebSphere もこの意味で
「最大プールサイズ」だったはず.最新版は知らないけど.
なので,maxPoolSize というプロパティ名でこのドキュメントの意味を
表すことは,少なくともこの分野では普通のことと言ってよいと思われます.
この分野に精通していないと分かりにくいということはあるかもしれませんが,
そのためのドキュメントなのでご一読ください.


Date:    Thu, 23 Jun 2005 11:29:18 +0900
From:    加藤太朗 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:2238] Re: ConnectionPoolの不使用について

> 今の実装だと、使い方によってはデッドロックしませんか?
> 
> 1つのスレッドが複数のコネクションを取ろうとしても、できない仕組みに
> なっているんでしょうか。

「複数のコネクション」を取得する場合,通常は異なった DataSource つまり
異なったプールからコネクションを取得することになると思います.
さらに,S2DBCP は JTA トランザクションと組み合わせて使うことを
想定しています.その場合,同じトランザクション内で同じコネクション
プールから複数のコネクションを取得しようとしても,常に同じコネクションが
返されます.その限りではデッドロックは起きないはずです.


Date:    Thu, 23 Jun 2005 14:51:22 +0900
From:    加藤太朗 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:2242] Re: ConnectionPool の不使用について

> maxPoolSizeを10程度用意したとします。
> 「DB接続にかかるコストの緩和」の目的で用意したものです。
> 同時アクセス数10000人の時に、10人ずつしかDBを操作できません。
> 一人一連のレスポンスを返すのに0.1秒掛かるとしたら、最後の人は
> 100秒待機させられることになります。
> それではと、100接続まで許すためには、同時に待機接続が100個も
> 永続化されることになります。

S2DBCP はあらかじめ接続をプールしたりはしないので,実際に必要に
ならなければ 100 接続が確立されることはありません.
また,待機している接続は timeout プロパティに設定された時間
(デフォルトは 10 分) が経過すればクローズされます.
待機接続が永続化されるわけではありません.

> 比嘉さんがおっしゃるように、人それぞれの価値観です。
> 「maxPoolSizeで事足りる。問題は無い。」と言うことを正しい、良いと思う人もいれば、
> 「いやまずい。なんとかしなければ」と言うことを正しい、良いと思う人もいるわけです。

コネクションプールは必ずしも S2DBCP を使う必要はありません.
同じように使うことのできる,より機能豊富な実装も世の中にはあります.
例えば Commons DBCP はアクティブなコネクションの数が上限に達した場合の
振る舞いを,例外をスローする・ブロックする・コネクションを返す,の中から
選ぶことができたと思います.
Commons DBCP は JTA との連携をサポートしているように見えませんでしたが,
# 最近は知らない
ObjectWeb の XAPool はそれもサポートしています.

J2EE 勉強会でのひがさんの話によると,S2DBCP はこれらのコネクション
プールの中でも最もシンプルな実装ということです.
それが S2DBCP の立ち位置なのでしょう.
全ての人の要求を満たすのではなく,多くの人にとって必要十分な機能を
持つシンプルなコネクションプール,それが S2DBCP なのだと思います.
場合によっては S2DBCP では不足という人も出てくるでしょう.
その不足分が多くの人にとって必要と判断されれば S2DBCP で
対応することになるでしょうが,そうではない,レアな要求と
判断されれば S2DBCP としては対応せず,どうしても必要なら
他のコネクションプール実装を使ってください,ということも
あるでしょう.

今回で言うと,maxPoolSize が 0 の場合にプールしないという提案は
シンプルさを損なうこともないので採用してもいいと (私は) 判断し,
既に対応もしましたが,maxPoolSize とは別に maxConnectionSize を
設けるという提案は多くの人にとって紛らわしいだけでメリットがないと
(私は) 判断しました.
# そもそも maxPoolSize の意味を誤解しておられると思うわけですが.

> それでseasarの立場としては、多くの人に良いとして受け入れてもらうためには、
> いろんな価値観を吸収できる仕組みを提供することが命題になるのではないでしょうか。

いろいろな価値観を吸収するとろくなものができないように思います.
# それもまた価値観ですが.
少数のコアとなる価値観に基づいて様々な取捨選択することが大事では?
The Seasar Project だと,利用者にとって「易しくて優しい」みたいな.
これが理念というか戦略みたいなものだとすると,そのための戦術としては
「シンプルであること」みたいになって,様々な要求をどんどん
受け入れるとは限らない場合も多くなるかと思います.




以下余談.自戒も込めて.

Date:    Thu, 23 Jun 2005 16:31:18 +0900
From:    加藤太朗 <[E-MAIL ADDRESS DELETED]>
To:      [E-MAIL ADDRESS DELETED]
Subject: [Seasar-user:2245] Re: じゃ、ずばりいうわよ

> 人格攻撃をしているわけでもないのに、勝手にムカついて「ズバリ言うわよ」って
> 言われても困ります。

おそらく自覚はないのでしょうが...
[Seasar-user:2237] からの最後の引用で省略した以下の部分.

> そういう意図がなく、あのwhile文を設けているのであれば、浅はかだと思います。

この「浅はか」は私に向けて書いたのだろうと思いますが,実際にあの
while を記述したのはひがさんんです.
ですから,この「浅はか」はひがさんに向けられてしまっています.
意図はともかく,「浅はか」という表現は人格攻撃と受け取られても
しょうがないと思いますし,実際にこれがひがさんの気分を害した
可能性は十分にあると思います.
つまり,加藤さんは「ひがさんの人格を攻撃をした」のであり,ひがさんは
「勝手にムカついたのではない」と解釈することもできるわけです.
もう一度,ご自身の書いた文章を読み返してみてはいかがでしょうか?
その文章が加藤さん自身に向けられたものだとしたらどう思いますか?
あるいはひがさんの立場で読んでみたらどう思いますか?

> 私が比嘉さんに不快感を与えないよう細心の注意を払わないとここでは意見する
> なとでも言っているわけではないのでしょう?

「比嘉さん」を「読み手」に置き換えるなら,むしろ注意を払うのが
当然ともいえますね.それはここに限った話ではありません.
っていうか,今まで読み手に不快感を与えないように注意を払って
いなかったのでしょうか? (^^;
注意を払ってはいたけれど,細心の注意を払ってはいなかったということ?
それなら,もう少し注意を払った方が円滑にコミュニケーションできるのでは
ないでしょうか?
加藤さんの文章が一部の読み手をムカつかせてしまったのは「事実」であり,
注意不足の可能性があることを示していると思います.
それを読み手が「勝手にムカついて」と考えていては何も改善しません.
加藤さん一人に問題があるとは言いませんが,加藤さんも「自分にも
問題があった」と受け止めることが改善につながるのではないかと,
自分のことは棚に上げつつ,しかし自戒も込めて書かせて頂きます.


-- 
<signature>
    <name>Koichi Kobayashi</name>
    <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>




Seasar-user メーリングリストの案内