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

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

新規登録して質問してみよう
ただいま回答率
87.20%
HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

解決済

PostgreSQLに9個目以降データが挿入されなくなる

AGLAAGLA
AGLAAGLA

総合スコア20

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

2回答

0評価

0クリップ

464閲覧

投稿2021/12/20 14:43

編集2021/12/21 01:49

前提・実現したいこと

ラズベリーパイから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

require('pg').defaults.ssl = true; const { Pool } = require('pg') process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; const pool = new Pool({ user: '', host: '', database: '', password: '', port: 5432, }) // 通信に必要なライブラリを読み込み var http = require('http'); // HTTPサーバの実行 var server = http.createServer(); //SQL接続 async function postgresql_connect(senserid,smell){ const sqltime="SET TIME ZONE 'Asia/Tokyo'" const sql = "INSERT INTO sensor (time,place,conges) VALUES (current_timestamp, $1, $2)" const values = [senserid, smell] const client = await pool.connect() try { pool .connect() .then(() => console.log("接続完了")) .then(() => pool.query(sqltime)) .then(() => pool.query(sql, values)) .then(result => console.log(result)) .catch((err => console.log(err))) } finally { client.release() } } // サーバにHTTPリクエストが届いたときのコールバック関数 server.on('request', function(req,res){ // ラズパイからのアクセスがPOSTであった場合 if(req.method == 'POST'){ // ラズパイへ返信するデータのヘッダを作成 res.writeHead(200, {'Content-Type' : req.headers['content-type']}); // ラズパイからデータを受信したときの処理 (コールバック関数) req.on('data', function(data){ json_data = JSON.parse(data); var smell = json_data.smell; postgresql_connect(senserid,smell); // ラズパイから受信したデータ(文字列)を、文字列に変換(受信ログ用) var text = data.toString('utf8'); // データの入力履歴をラズパイに返信 res.write('Successfully Received > ' + text); // 受信ログを表示 console.log(req.method + ' "' + req.headers['user-agent'] + '"'); console.log('Client Request > ' + data); }); // ラズパイから全てのデータを受信したときの処理(コールバック関数) req.on('end', function(){ // ラズパイへのデータの返信を終了 res.end(); }); } // ラズパイからのアクセスがPOST以外の場合 else { res.writeHead(200, {'Content-Type': 'text/plain'}); res.write('Hello World\n'); res.end(); } }); // ラズパイからの接続を待ち受けるポート番号の設定 server.listen(8080);

------------追記----------------
コネクションプールはデフォルトで最大10回ほどしか接続できず、再接続が必要とのことまでは理解しました。
しかし、

finally { client.release() }

でなぜ再接続できないのでしょうか。
ずっと調べ続けても9個以上挿入できず、非常に困っています。
https://teratail.com/questions/253479
こちらで同じような質問をされていましたが、done();では実装できませんでした。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

FKM

2021/12/21 00:44

テーブルの設定に問題がありそうです。何を主キーにしていますか?
AGLAAGLA

2021/12/21 00:52

コメントありがとうございます。 まったく一向に進まず悩んでおりました。 私のテーブルの場合、IDをプライマリキー として設定しております。
FKM

2021/12/21 00:53

では、そのIDの型と桁数をどう設定していますか?
AGLAAGLA

2021/12/21 01:09 編集

id serial PRIMARY KEYで定義しております。 私の認識では、 const sql = "INSERT INTO sensor (time,place,conges) VALUES (current_timestamp, $1, $2)" const values = [senserid, smell] として挿入しております。 自動でIDを割り振ってくれると思い、INSERT文では表記しなくていいと思っております。 ここがダメな点なのでしょうか。
FKM

2021/12/21 01:15

seialってことはcreate sequence文で型と桁設定しているはずですが、そのsql文を提示してもらっていいですか?
AGLAAGLA

2021/12/21 01:20 編集

CREATE TABLEの CREATE TABLE sensor (id serial PRIMARY KEY, time timestamp, place INTEGER not null, conges Real not null); 以降、型と桁設定をした覚えはないのですが、、 それが問題点なのでしょうか。
FKM

2021/12/21 01:27

主キーの設定に制約がかかってないかの検証です。明示的にidを99としてデータを入力できるか確かめてみてください。
AGLAAGLA

2021/12/21 01:35

IDは105ほどまでデータを挿入できていたので、恐らく大丈夫だと思います。 毎回、ラズパイから送るたびにテーブルの中身をリセットして行っているのですが、 リセットするたびに値が加わっていくのが少し心配な点です。 (例: 1回目9個目までしか挿入できてない→テーブルの行削除 →二回目 の9個の値を挿入するとIDが9から18になる。次行削除して挿入するとIDが18~27になる→これを繰り返して行って105ほどまで行きました)
FKM

2021/12/21 01:42

なるほど、だとするとネットワークの方の問題っぽいですね。 postgreSQLは一度アボートするとコミットしないと再度クエリ発行できないですが、それは 関係しているでしょうか。 自分が思い当たるのはこれぐらいになりそうです。力になれなくて済みません。
AGLAAGLA

2021/12/21 01:47

client.release()の部分を変更すると、挿入回数が4回になったり変動するのでここが問題なのかと思います。 お手数おかけしました。 こちらこそご丁寧にありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

HTTP

HTTP(Hypertext Transfer Protocol)とはweb上でHTML等のコンテンツを交換するために使われるアプリケーション層の通信プロトコルです。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Node.js

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。