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

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

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

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

1020閲覧

JawsDBの”connections”は、MySQLのどの変数のことなのか

mi_ho

総合スコア34

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2023/08/22 11:00

編集2023/08/22 11:17

実現したいこと

herokuでWebアプリをつくっている者です。
herokuのMySQLアドオンのJawsDBのフリープランを使ってデータベースを構成しています。
JawsDBのプラン名はkitefin sharedです。

JawsDBの各プランの制限のページに、”connections”という欄があり、フリーのkitefin sharedプランではこれが”10”となっています。
この”connections”が何にあたるかわかりません。
イメージ説明

JawsDB公式Twitterによると、これは”concurrent-connections limit”=同時接続数の制限であるということです。
これにあたりそうなのは変数を、自分が動かしているデータベースでいくつか確認したところ、以下の結果でした。

Threads_connected=43
Connections=1565001
max_user_connections=0
max_connections=300
Max_used_connections=77

同時接続数の制限なら、Threads_connectedがこれにあたるかと思ったのですが、値がすでに43で、フリープラン制限の10をゆうに越しているのに、エラーは出ていません。

JawsDBの”connections”とは、どの変数にあたる概念なのでしょうか?
ご教授よろしくお願いいたします。
不足の情報がありましたらお申し付けください。

追加で調べてわかったことを追記していきます

こちらの記事によると、

  • max_connections= 合計接続制限
  • max_user_connections= ユーザーごとの制限

らしい

こちらの記事にて、10,000人のユーザがいるアプリにおける、MySQLの最大同時接続数はどうなるかという質問での回答↓(Deepl)

合計1万人のユーザーがいるかもしれないが、それは同時実行ユーザーとは違う。この文脈では、スクリプトの同時実行を指す。(中略)
1万人のユーザーベースで、常時500人以上のアクティブユーザーがいることはないでしょう。 その500人の同時ユーザーのうち、一度にリクエストされるのはせいぜい10~20人でしょう。
つまり、同時リクエストは10~20件程度にとどまる
他の人も言っているように、その点では心配することはない。

この人が言ってるように、同時リクエストというのは、一度のリクエストが完全に同じ瞬間に実行されるのが、多く見積もっても10〜20だろう、ということ?(これはThreads_connectedとは違うのか?)
JawsDBの"connections"もこれを指しているのか?

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

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

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

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

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

hoshi-takanori

2023/08/22 15:06

DB にとってのユーザーとは、Web アプリのユーザーではなく、Web アプリそのもののことですね。 で、Web アプリから DB への接続は、ブラウザからのリクエストのたびに接続するのではなく、あらかじめいくつか接続しておいて、それを使い回す手法がよく使われますが、その接続の上限ってことでしょう。 https://workteria.forward-soft.co.jp/blog/detail/10210
mi_ho

2023/08/23 00:54

ありがとうございます! コネクションプールという概念をそもそも知らず、Webアプリで毎回DB接続→切断を繰り返していたのですが、調べてみるとこれは設計上あまりよろしくないんですね。 https://www.wakuwakubank.com/posts/665-node-mysql/#index_id11 https://note.com/watanabe_kf1983/n/n59a54a8c74d1 https://qiita.com/sa9ra4ma/items/6d61ae046daeadde68e2 https://god48.com/node-connectionpool DBのコネクションをコネクションプールに貯めこんで使いまわす?ことで、JawsDBの”connections”制限回避がより確実になるといった感じでしょうか。 今の設計では、DB接続が必要な時に、毎回サーバサイド(Node.js)で、 mysql.createConnection→connection.connect→connection.query→connection.end としていました。 コネクションプールを利用せず、このように毎回DB接続→切断を繰り返す場合、この一連のDB接続→切断=1”connections”カウントになるということですかね?(数え方が違うでしょうか…) そうなると、今の設計では簡単に上限の10に達してしまいそうです。
mi_ho

2023/08/23 00:57

こちら、別の質問になってきてしまったので、別に質問を立てようと思います🙇
hoshi-takanori

2023/08/24 02:48 編集

まず、前提として、Web アプリのサーバーサイドは同時に複数のリクエストを並行して処理する (Node.js の場合は非同期処理になる) のが普通です。そして、A さんと B さんと C さんが同時にアクセスした場合、それぞれのアクセスが非同期で並行して実行されます。その際、アクセスのたびに DB に接続すると、DB 接続は 3 つになります。同様に、100 人が同時にアクセスすれば DB 接続は 100 になる可能性があります。heroku 側の制限で DB の最大同時接続数が 10 なら、11 番目以降は接続に失敗しますから、Web アプリ側で DB 接続の数を管理して、最大に達したらそれ以降の DB 接続は待つような仕組みが必要になります。 コネクションプールの本来の目的は、DB に接続するにはそれなりに時間がかかるため、毎回接続と切断を繰り返す代わりに接続を使い回すことですが、その副産物として接続数の管理も行えると思って先日のコメントをしました。(が、よく考えたら Web アプリのインスタンスを増やしたらどうなるんだろう…。) なお、自分はサーバーサイドは詳しくないので、上に書いたことは間違ってる(とは言わないまでも、考慮が足りてない点が多々ある)かもしれませんので、あしからず。
mi_ho

2023/08/24 03:11

ありがとうございます! 少しずつ分かってきたような気がします。 新しく作った質問( https://teratail.com/questions/2kh5a7o4enskvr )に書いた通り、「コネクションプールを利用してもしなくても、接続数自体は変わらないのでは?」と疑問に思っていたのですが、コネクションプールは主目的(接続不可の軽減)の副産物として接続数の管理ができる点が、接続数制限のあるこの場面では大きくメリットと言えるんですね。 Node.jsでコネクションプールを作るcreatePoolには、同時接続できる上限を表すオプションconnectionLimit(デフォルト10)を設定でき、これを超えた場合は接続が1つ解放されるまで待機するようによしなに管理してくれるようです。 その際エラーは出ず、ユーザは少し遅延を感じる程度とのことです。 https://stackoverflow.com/questions/45522907/how-does-connectionlimit-work-in-node-mysql これが恐らく、副産物としての「接続数の管理」にあたるものかなと思われます。 connectionlimitを2とかにして、実際に最大接続数を超えた時にどんな挙動をするのか実験してみます!
mi_ho

2023/08/25 03:49

connectionLimit: 1にして、releaseせずに何回もpool.getConnectionすると、ちゃんと1回実行後にずっと待機してくれたので、設定した connectionLimitの数に合わせてマネジメントしてくれるようです! 私の場合は、connectionLimit: 10にしておけば、JawsDBの上限には引っかからないようにマネジメントしてくれるということみたいです。
guest

回答1

0

自己解決

コメントでやりとりさせていただいた結果を踏まえた自分の理解をまとめておきます。
JawsDBの”connections”は、データベース接続の最大同時接続数のこと、ということだと思います。

コネクションプーリングとは、データベース接続のコネクションをコネクションプールに貯めこんで使いまわすという手法のようです。
参考:
https://en.wikipedia.org/wiki/Connection_pool
https://mita2db.hateblo.jp/entry/2020/08/02/162024

コネクションプールの主目的は、接続を使い回すことによる接続負荷の軽減ですが、その副産物として、接続数の管理ができるという点が、接続数制限のある場面では大きくメリットと言えるようです。
Node.jsでは、mysqlのモジュールを利用してコネクションプールを利用できます。
公式ドキュメント:https://github.com/mysqljs/mysql#pooling-connections
コネクションプールを作るcreatePoolには、同時接続できる上限を表すオプションconnectionLimit(デフォルト10)を設定でき、これを超えた場合は接続が1つ解放されるまで待機するようによしなに管理してくれるようです。
その際エラーは出ず、ユーザは少し遅延を感じる程度とのことです。
参考:
https://stackoverflow.com/questions/45522907/how-does-connectionlimit-work-in-node-mysql
試しに、connectionLimit: 1にして、releaseせずに何回もpool.getConnectionしてみましたが、ちゃんと1回実行後にずっと待機してくれたので、設定した connectionLimitの数に合わせてマネジメントしてくれるようです。
私の場合は、connectionLimit: 10にしておけば、JawsDBの上限には引っかからないようにマネジメントしてくれるということみたいです。

Node.jsでのコネクションプール利用例:

投稿2023/08/25 04:07

mi_ho

総合スコア34

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問