ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

データベースへの接続にはコストがかかる

この場合の「コスト」とは、サーバーのCPUやメモリのことで、「コストがかかる」とは、サーバーのCPUやメモリをたくさん使っているということになります。

f:id:AJYA:20121226220438j:plain

photo credit: ottonassar via photopin cc

 

ことの発端

PHPのバッチプログラムでデータベースからデータを取り出し、CSVファイルを生成しています。

動作の確認すると、メモリ使用量の上限を3GBにしても、必要なデータが全て取り出せない現象が発生しました。

メモリを確保しようとして確保できないというエラーが発生することに気づいていたので、どんどんメモリ使用量の上限をあげていき、どこまで増やせばいいのか確かめようとして、3GBでもエラーになったので、単純にメモリの上限を増やせばいいものではないと判断しました。

 

どこを修正するか

SQLサーバーへの接続数を確認すると、頻繁に接続数が増減していました。

プログラムを確認すると、データベースへの接続と切断を、メソッド毎に行っていました。

接続と切断を繰り返すと、メモリの使用量が増えるとは思わなかったのですが、接続と切断の時間は無駄になっているだろうと判断して、オブジェクトの生成時のコンストラクタでデータベースへの接続をして、デストラクタで切断するように修正しました。

 

試してみると、バッチプログラムのメモリ使用量が大幅に減って、処理が速くなり、必要なデータが全て取り出せるようになりました。

複数回実行しても、同じ結果なので、効果があったと判定できました。

 

今回学んだこと

データベースへの接続と切断を頻繁に行うと、CPUの負荷が高くなり、メモリも無駄に使用されてしまうことがあります。

一度接続したあとは、できる限り使いまわすようにプログラムを作るべきです。