前提・実現したいこと
ラズベリーパイからHTTP通信でダミーデータを送信しPostgreSQLに値を挿入したいと考えています。
現在の状況は9個目までデータベースに格納しているのですが、9個目以降なんのエラーもなく急にデータがデーベースに格納されなくなります。
わかっていることは
client.release()の部分が原因ということはわかっているのですが、clientをどうすれば再帰的にずっとデータベースに格納できるかわかりません。
そしてなぜ9個目で止まるのでしょうか。
エラーログがないので解決できず困っています。
2時間ほど試行錯誤しましたが、解決に至らず、教えていただければ光栄です。
コマンドの出力
Client Request > {"time": "2021-12-20 23:27:52.581135", "sensor": 1,"smell": 10} 接続完了 Result { command: 'INSERT', rowCount: 1, oid: 0, rows: [], fields: [], _parsers: undefined, _types: TypeOverrides { _types: { getTypeParser: [Function: getTypeParser], setTypeParser: [Function: setTypeParser], arrayParser: [Object], builtins: [Object] }, text: {}, binary: {} }, RowCtor: null, rowAsArray: false } 上記の出力が9個終わった後↓ POST "Python-urllib/3.9" Client Request > {"time": "2021-12-20 23:27:57.612159", "sensor": 1,"smell": 10} 接続完了 POST "Python-urllib/3.9" Client Request > {"time": "2021-12-20 23:28:02.756899", "sensor": 1, "smell": 10} POST "Python-urllib/3.9" Client Request > {"time": "2021-12-20 23:28:07.786376", "sensor": 1,"smell": 10} POST "Python-urllib/3.9" Client Request > {"time": "2021-12-20 23:28:12.810994", "sensor": 1,"smell": 10} ^C
該当のソースコード
Javascript
1require('pg').defaults.ssl = true; 2const { Pool } = require('pg') 3process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 4 5const pool = new Pool({ 6 user: '', 7 host: '', 8 database: '', 9 password: '', 10 port: 5432, 11 12}) 13 14 15 16// 通信に必要なライブラリを読み込み 17var http = require('http'); 18 19// HTTPサーバの実行 20var server = http.createServer(); 21 22//SQL接続 23async function postgresql_connect(senserid,smell){ 24 const sqltime="SET TIME ZONE 'Asia/Tokyo'" 25 const sql = "INSERT INTO sensor (time,place,conges) VALUES (current_timestamp, $1, $2)" 26 const values = [senserid, smell] 27 const client = await pool.connect() 28 try { 29 pool 30 .connect() 31 .then(() => console.log("接続完了")) 32 .then(() => pool.query(sqltime)) 33 .then(() => pool.query(sql, values)) 34 .then(result => console.log(result)) 35 .catch((err => console.log(err))) 36 37 38 } finally { 39 client.release() 40 } 41} 42 43 44// サーバにHTTPリクエストが届いたときのコールバック関数 45server.on('request', function(req,res){ 46 // ラズパイからのアクセスがPOSTであった場合 47 if(req.method == 'POST'){ 48 // ラズパイへ返信するデータのヘッダを作成 49 res.writeHead(200, {'Content-Type' : req.headers['content-type']}); 50 51 // ラズパイからデータを受信したときの処理 (コールバック関数) 52 req.on('data', function(data){ 53 54 55 json_data = JSON.parse(data); 56 var smell = json_data.smell; 57 58 postgresql_connect(senserid,smell); 59 60 61 62 // ラズパイから受信したデータ(文字列)を、文字列に変換(受信ログ用) 63 var text = data.toString('utf8'); 64 // データの入力履歴をラズパイに返信 65 res.write('Successfully Received > ' + text); 66 67 68 69 // 受信ログを表示 70 console.log(req.method + ' "' + req.headers['user-agent'] + '"'); 71 console.log('Client Request > ' + data); 72 73 74 }); 75 76 // ラズパイから全てのデータを受信したときの処理(コールバック関数) 77 req.on('end', function(){ 78 // ラズパイへのデータの返信を終了 79 res.end(); 80 }); 81 82 } 83 // ラズパイからのアクセスがPOST以外の場合 84 else { 85 res.writeHead(200, {'Content-Type': 'text/plain'}); 86 res.write('Hello World\n'); 87 res.end(); 88 } 89}); 90 91// ラズパイからの接続を待ち受けるポート番号の設定 92server.listen(8080); 93 94
------------追記----------------
コネクションプールはデフォルトで最大10回ほどしか接続できず、再接続が必要とのことまでは理解しました。
しかし、
finally { client.release() }
でなぜ再接続できないのでしょうか。
ずっと調べ続けても9個以上挿入できず、非常に困っています。
https://teratail.com/questions/253479
こちらで同じような質問をされていましたが、done();では実装できませんでした。
回答2件
あなたの回答
tips
プレビュー