質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Q&A

解決済

2回答

2187閲覧

「Pool is closed」のエラーについて

k.t.est

総合スコア49

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

0グッド

1クリップ

投稿2019/07/09 03:46

編集2019/07/09 04:58

nodeのmysql2のエラーに関する質問です。
下記のコードをAWSのLambda関数で実行すると、何度かに1度初回のDB接続(check()関数)にて「Pool is closed」のエラーが発生致します。
(問題なく実行できる場合もあります。)

どういう状況でこのエラーが発生するかもわからず困っております。
(当該lambda関数を短い時間(数分内)に連続して実行するとこのエラーが発生しているようにも見えます。)

どの部分を改善すれば「Pool is closed」エラーが発生しなくなるかご教示頂けましたら、幸甚で御座います。

nodejs

1const AWS = require('aws-sdk'); 2const mysql = require('mysql2'); 3 4const pool = mysql.createPool({ 5 host : 'xxxx', 6 user : 'xxxx', 7 password : 'xxxx', 8 database: 'xxxx', 9 port: 'xxx', 10}); 11 12// 接続 13pool.query = util.promisify(pool.query); 14 15exports.lambdaHandler = async (event, context) => { 16 const check_res = await check(); 17 const check_a_res = await check_a(); 18 const check_b_res = await check_b(); 19 const check_c_res = await check_c(); 20 pool.end(); 21 return check_c_res; 22}; 23 24function check(){ 25 const data = ["a", "b"]; 26 27 try { 28 const results = await pool.query('select id from table where id = ? and name = ?' ,data); 29 return results; 30 }catch(e){ 31 console.log("check error"); 32 pool.end(); 33 throw e; 34 } 35} 36 37//function check_a()/check_b()/check_c()もDB接続し、それぞれinsert/update/deleteを含む関数となっております。 38

#エラー
"errorMessage": "Pool is closed.",
"errorType": "Error",
"stackTrace": [
"process.nextTick (/var/task/node_modules/mysql2/lib/pool.js:38:40)",
"_combinedTickCallback (internal/process/next_tick.js:131:7)",
"process._tickDomainCallback (internal/process/next_tick.js:218:9)"
]

#環境
AWS lambda関数(node.js : 8.10)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

check_a,b,c各々は最初に作ったpoolを使いまわせばいいと思います。
それらの関数の中で毎回poolに接続するのが良くないと思いました。

やり方としては、ラムダ関数の中でpoolに接続して、check_a,b,cはそのpoolを使いまわして、check_cが終わったらpool.end()するでいいと思います。

投稿2019/07/18 08:15

youk-h

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k.t.est

2019/07/18 08:24

ご回答ありがとう御座います。 ということは、私の当初のコードでいいという理解でよろしいでしょうか??
youk-h

2019/07/18 10:44 編集

いえ、ソースコードを見た感じだと、poolに接続しているのがグローバルな位置にあります。 これだと、pool接続は一回しか行われません。 一つの案ですが exports.lambdaHandler = async (event, context) => { const pool = mysql.createPool({ host : 'xxxx', user : 'xxxx', password : 'xxxx', database: 'xxxx', port: 'xxx', }); const check_res = await check(pool); const check_a_res = await check_a(pool); const check_b_res = await check_b(pool); const check_c_res = await check_c(pool); pool.end(); return check_c_res; }; のように書けばいいと思います。 そのためにはcheck関数は引数にpoolを受け取る必要があります
k.t.est

2019/07/19 02:31

詳細なご回答ありがとう御座います!大変よく分かりました!
youk-h

2019/07/20 00:58

解決しましたか?^_^
guest

0

try句の中をこうしたらどうでしょうか。

Node.js

1const results = await pool.query('select id from table where id = ? and name = ?' ,data); 2return results; 3 45 6const results = await pool.query('select id from table where id = ? and name = ?' ,data); 7pool.end(); 8return results;

投稿2019/07/09 04:29

michi_h

総合スコア158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

k.t.est

2019/07/09 05:01

ご回答誠に有難う御座います。 当方の質問に不備があり、大変申し訳御座いません。(質問内容を編集致しました。) 実際にはcheck()関数の後にもDBに接続する関数がいくつか続いておりまして、はじめにDBとのコネクトし、全ての関数の実行が終わった後にpool.end()している形になっております。 従いまして、初回のDBアクセス時にはpool.end()しない形に致したく存じます。
michi_h

2019/07/09 05:19

Lambdaを連続して実行するときにエラーがでるんですよね? 関数実行時のバックエンドは同一ですので、適宜pool.end()するしかないと思いますが... または、関数が実行し終わるまで再度関数を実行するのを控える、とか...
k.t.est

2019/07/09 06:09

ご返信、誠に有難う御座います。 連続ではあるのですが、重複した連続ではなく、当該lambda関数が終わった後すぐに実行した際に当該エラーになることがあったという感じです(これも毎回エラーになるわけではないのです)。 一回一回DBとの接続を切ってというのは、実行時間が掛かるのではないかと思い、避けていたのですが、基本的には一回一回DBとは、接続-切断を繰り返すプログラムの方が良いプログラムなのでしょうか?? ご教示頂けましたら大変有り難く存じます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問