MySQLコネクションプーリングサーバを書いてみた

先日のfdpassを使って、単純なMySQLコネクションプーリングサーバを書いてみた。
Ruby/MySQL 2.9.x(MySQL/Rubyではない)

まず、サーバを立ち上げるとコネクションが5本はられる。


~/work$ ./mysql-poold.rb
I, [2011-01-03T17:13:07.346512 #6853] INFO -- : new conn: #
I, [2011-01-03T17:13:07.347770 #6853] INFO -- : new conn: #
I, [2011-01-03T17:13:07.348505 #6853] INFO -- : new conn: #
I, [2011-01-03T17:13:07.349311 #6853] INFO -- : new conn: #
I, [2011-01-03T17:13:07.349991 #6853] INFO -- : new conn: #
I, [2011-01-03T17:13:07.350056 #6853] INFO -- : pool size is 5
I, [2011-01-03T17:13:07.385383 #6853] INFO -- : start

クライアントを二つほど立ち上げると、それぞれプールからコネクションを引っ張ってくる。


~/work$ ./test.rb # 一個目

6873: ["foo"]
6873: ["foo"]
6873: ["foo"]


~/work$ ./test.rb # 二個目
6880: ["foo"]
6880: ["foo"]
6880: ["foo"]

I, [2011-01-03T17:13:13.910651 #6853] INFO -- : chekout to 6873
I, [2011-01-03T17:13:13.910847 #6853] INFO -- : pool size is 4
I, [2011-01-03T17:13:17.139081 #6853] INFO -- : chekout to 6880
I, [2011-01-03T17:13:17.139393 #6853] INFO -- : pool size is 3

クライアントを止めると、コネクションがプールに返される。


6873: ["foo"]
6873: ["foo"]
6873: ["foo"]
^C./test.rb:17:in `sleep': Interrupt
from ./test.rb:17
from ./test.rb:10:in `loop'
from ./test.rb:10

~/work$
~


I, [2011-01-03T17:13:27.175203 #6853] INFO -- : chekin from 6873
I, [2011-01-03T17:13:27.175316 #6853] INFO -- : pool size is 4

実用的な品質レベルじゃないけど、とりあえずこーゆーことができるのは分かった。

追記

クライアント側で複製したファイルディスクリプタをクローズする必要があるような。。。