Symfoware

Symfowareについての考察blog

Python データベースコネクションをプーリング(SQLAlchemy使用)

ネットワーク的に離れた位置にあるデータベースにコネクションを貼る時、
えらく時間がかかるのでプーリングしてコネクションを使いまわせないか調べてみました。


通常処理



単純にコネクションのopen,closeを1,000回実行してどのくらい時間がかかるか調べてみます。


  1. # -*- coding:utf-8 -*-
  2. import time
  3. import psycopg2
  4. def test():
  5.     con = psycopg2.connect(host='192.168.1.103',database='postgres',user='pgadmin',password='P@ssw0rd')
  6.     con.close()
  7. start = time.time()
  8. for i in xrange(1000):
  9.     test()
  10. elapsed_time = time.time() - start
  11. print ("elapsed_time:{0:.4f}".format(elapsed_time)) + "[sec]"




elapsed_time:8.5767[sec]



8.5秒必要でした。




SQLAlchemy



調べてみると、SQLAlchemyにpool機能があるようです。
Constructing a Pool

これを使用することにしました。
SQLAlchemyをインストール。


$ sudo easy_install sqlalchemy




プログラムを変更して速度を測定してみます。


  1. # -*- coding:utf-8 -*-
  2. import time
  3. import psycopg2
  4. import sqlalchemy.pool as pool
  5. def getconn():
  6.     con = psycopg2.connect(host='192.168.1.103',database='postgres',user='pgadmin',password='P@ssw0rd')
  7.     return con
  8. def test(mypool):
  9.     #con = psycopg2.connect(host='192.168.1.103',database='postgres',user='pgadmin',password='P@ssw0rd')
  10.     con = mypool.connect()
  11.     con.close()
  12. start = time.time()
  13. mypool = pool.QueuePool(getconn, max_overflow=10, pool_size=5)
  14. for i in xrange(1000):
  15.     test(mypool)
  16. elapsed_time = time.time() - start
  17. print ("elapsed_time:{0:.4f}".format(elapsed_time)) + "[sec]"




elapsed_time:0.0344[sec]



0.03秒です。
非常に処理が高速になりました。

従来通り、コネクションのcloseでプールにコネクションを戻してくれるようです。
既存コードの変更もほとんど発生せず、便利に使えました。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2015/11/07(土) 15:09:45|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Qiitaのクローン「Lodge」をDebian 8で動作させる | ホーム | Python バイナリデータにしたjpgのexif情報を取得する(PIL使用)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1816-f59214f5
この記事にトラックバックする(FC2ブログユーザー)