🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
MySQL

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

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

1回答

7309閲覧

node.js MySQLによるConnectionの切断の必要性について

HYDESA

総合スコア8

MySQL

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

Node.js

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

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2020/12/21 08:11

初めて投稿します。
現在、node.jsのexpressを使って習得を行っており、
MySQLにあるデータのグラフ表示をしようとしています。

ところが、通常であればDBサーバーのConnectionは
接続した後処理で切断、解放するのが今までの
流れだったように思いますが、
このnode.jsだとejsのhtmlが表示されるまで
接続し続けているように思われます。

そこで質問なのですが、
1.このnode.jsではこれで正常なのか(接続、切断は不要でよいのか)
2.もし切断が必要であるならば、どの段階でdestroy(Poolのrelease等)をすればよいか。
3.切断後の再起の記述方法はあるのか。

ちなみにresponse.renderの直後にcon.destroy()を追加して実行すると
1回目はブラウザに表示されますが、再度表示しようとすると
コネクションエラーになります。

nodejs

1--<app.js>-- 2 const port = 3000 3 const ejs = require('ejs'); 4 const express = require('express'); 5 const app = express(); 6 7 app.set('ejs', ejs.renderFile); 8 const con = mysql.createConnection({ 9  host: 'localhost', 10  user: 'root', 11  password: '', 12  database: 'test' 13 }); 14 15 con.connect(function(err) { 16   if (err) throw err; 17  console.log('Connected'); 18 }); 19 20 app.get('/',(request, response) => { 21  const sql = "select name from t_test" 22  con.query(sql, function(err, result, fields){ 23  if (err) throw err; 24  response.render('index.ejs',{ content: result }); 25    // ここでcon.destroy()とやった 26  }); 27 }); 28 29 app.listen(port,() => { 30  console.log('server start'); 31 });

 ~実行すると、ejsの接続を待っている~

html

1--<index.ejs>-- 2 ~前略~ 3 <table> 4   <% for(let i in content) { %> 5 <tr> 6   <% let obj = content[i]; %> 7   <td> 8 <%= obj.name %> 9   </td> 10 </tr> 11 <% } %> 12 </table> 13 ~後略~

いろいろとネットで調べてみましたが、
回答となるような記述が見つかりませんでした。
どうそよろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

1.このnode.jsではこれで正常なのか(接続、切断は不要でよいのか)

はい、サーバが起動している間、データベースにも接続したままにするということで、意味合い的に何も矛盾しません。サーバ終了時には自動で切断されます。


もし、「接続、切断」をしっかりやりたいのであれば、app.getの中で接続~切断までを行う形となります。

投稿2020/12/21 08:44

maisumakun

総合スコア145977

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

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

HYDESA

2020/12/21 08:51

回答ありがとうございます。 サーバー終了時には、ということは、起動の間中はいつまでも接続されっぱなしということでしょうか。 すると、仮に1000人の接続があれば、1000接続されっぱなしという認識でよろしいでしょうか。 また`app.get`で接続切断との事ですが、上記に記載しましたが、切断をすると表示されなくなってしまいます。その際の表記場所が違うとの認識でよろしいでしょうか。 またその際はどのように記述すると良いのでしょうか。 すいませんが、よろしくお願い致します。
maisumakun

2020/12/21 08:59

このコードでは、MySQLへの接続が行われるのは「サーバ起動時」であって、「リクエスト時」ではありません。 > サーバー終了時には、ということは、起動の間中はいつまでも接続されっぱなしということでしょうか。 はい。 > すると、仮に1000人の接続があれば、1000接続されっぱなしという認識でよろしいでしょうか。 違います。最初に作った1接続だけです。 > また`app.get`で接続切断との事ですが 「接続から」切断まで行ってください。切断だけだと、最初に作った接続を閉じてしまうという意味になります。
maisumakun

2020/12/21 09:01

> 接続した後処理で切断、解放するのが今までの流れだったように思いますが 接続を構築する処理は重いので、他のサーバでも実際にはライブラリ内で接続をプールしていることがあります。このコードでは、それを明示的に書いているだけです。
HYDESA

2020/12/22 01:50

maisumakunさん、回答ありがとうございました。 なるほど、よく理解出来ました。 サーバーサイドで稼働する意味が、ここに出てくるのですね。 ありがとうございました。 大変助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問