node.js + mysql সংযোগ পুলিং


85

আমি মাইএসকিউএলকে সবচেয়ে কার্যকরী উপায়ে ব্যবহার করার জন্য কীভাবে আমার অ্যাপ্লিকেশনটিকে কাঠামোবদ্ধ করব তা জানার চেষ্টা করছি। আমি নোড-মাইএসকিএল মডিউল ব্যবহার করছি। অন্যান্য থ্রেডগুলি এখানে সংযোগ পুলিং ব্যবহার করার পরামর্শ দিয়েছিল তাই আমি একটি সামান্য মডিউল mysql.js সেট আপ করব

var mysql = require('mysql');

var pool  = mysql.createPool({
    host     : 'localhost',
    user     : 'root',
    password : 'root',
    database : 'guess'
});

exports.pool = pool;

এখন যখনই আমি মাইএসকিএল অনুসন্ধান করতে চাই তখন আমার এই মডিউলটি প্রয়োজন এবং তারপরে ডাটাবেসকে জিজ্ঞাসা করুন

var mysql = require('../db/mysql').pool;

var test = function(req, res) {
     mysql.getConnection(function(err, conn){
         conn.query("select * from users", function(err, rows) {
              res.json(rows);
         })
     })
}

এই ভাল পদ্ধতির হয়? আমি মাইএসকিএল সংযোগগুলি ব্যবহার করার খুব বেশি উদাহরণ খুঁজে পাইনি খুব সাধারণ একটি ছাড়াও যেখানে মূল অ্যাপ্লিকেশন। Js স্ক্রিপ্টে সবকিছু করা হয় তাই কনভেনশন / সেরা অনুশীলনগুলি কী তা আমি সত্যিই জানি না।

আমি কি প্রতিটি জিজ্ঞাসার পরে সর্বদা কানেকশন.এন্ড () ব্যবহার করব? আমি যদি কোথাও এটি ভুলে যাই?

কীভাবে আমার সংযোগের মডিউলটির রফতানি অংশটি পুনরায় লেখার জন্য কেবল কোনও সংযোগ ফিরিয়ে আনতে হবে যাতে প্রতিবার getConnection () লিখতে না হয়?


4
যাঁরা এটি খুঁজে পান এবং মনে করেন তাদের জন্য " connection.queryআমার কোডে আমার সমস্ত জায়গা রয়েছে" - সম্ভবত এটি পুনরুদ্ধার করার সময়। একটি ডাটাবেস বিমূর্ততা বর্গ অফার করে গড়ে তুলুন select, insert, update, ইত্যাদি - এবং শুধুমাত্র ব্যবহার connection(বা pool) যে একক ডিবি বর্গ মধ্যে ...
random_user_name

@random_user_name আপনার কোনও লিঙ্ক বা কোড রয়েছে যা আপনার পরামর্শ কার্যকর করে?
কিংঅ্যান্ড্রু

@random_user_name আপনি কীভাবে এই ক্ষেত্রে লেনদেন পরিচালনা করবেন? আপনি যদি প্রতিটি প্রশ্নের পরে সংযোগটি ছেড়ে দেন?
জেফ রায়ান

@ জেফআরআইয়ান আপনার অন্যান্য ক্লাস থাকতে পারে যা এই ডিবি ক্লাসকে প্রসারিত করে যেখানে আপনি বিশেষ ক্ষেত্রে পরিচালনা করতে পারেন যেখানে অসাধারণ লেনদেনের প্রয়োজন হয়। তবে আমি মনে করি র্যান্ডম_ইউজার_নামার পরামর্শ অগত্যা লেনদেনের বিরুদ্ধে নয় ... আমি সাধারণত একটি অনুরূপ প্যাটার্ন ব্যবহার করি, যার মধ্যে আমি একটি বেস মডেল শ্রেণি তৈরি করি যা বুনিয়াদি পদ্ধতিগুলি সরবরাহ করে এবং উদাহরণস্বরূপ সন্নিবেশ পদ্ধতির ক্ষেত্রে লেনদেনের প্রয়োজন হয়, কারণ এটি প্রথমে একটি রেকর্ড সন্নিবেশ করে এবং তারপরে ফলাফল পুনরুদ্ধার করতে সর্বশেষ sertedোকানো আইডি দ্বারা নির্বাচন করে।
লুকাশ্রেতা

উত্তর:


68

এটি একটি ভাল পদ্ধতির।

আপনি যদি কেবল কোনও সংযোগ পেতে চান তবে পুলটি যেখানে রয়েছে আপনার মডিউলটিতে নিম্নলিখিত কোড যুক্ত করুন:

var getConnection = function(callback) {
    pool.getConnection(function(err, connection) {
        callback(err, connection);
    });
};

module.exports = getConnection;

আপনার এখনও প্রতিবার getConnication লিখতে হবে। তবে আপনি প্রথমবার মডিউলটি পাওয়ার পরে আপনি সংযোগটি সংরক্ষণ করতে পারেন।

আপনার ব্যবহারটি শেষ হয়ে গেলে সংযোগটি শেষ করতে ভুলবেন না:

connection.release();

18
শুধু একটি মাথা আপ. connection.release();এখন এটি পুলের জন্য।
sdanzig

সেটা সত্য. আমি এটি পরিবর্তন করেছিলাম.
ক্লাস্বাক

এছাড়াও, আমি যদি করতে পারি তবে আমি কলব্যাকের পরিবর্তে কোনও প্রতিশ্রুতি ব্যবহারের পরামর্শ দেব, তবে এটি কেবল একটি অগ্রাধিকার ... তবুও দুর্দান্ত সমাধান
স্পোক

@ স্পোক আপনি কি এর উদাহরণের সাথে লিঙ্ক করতে পারেন? এক্সপ্রেস প্রতিশ্রুতি এখনও পর্যন্ত কাজ করতে বিরক্তিকর এক ধরণের, আমি মনে করি আমি কিছু মিস করছি। এখনও অবধি আমি কেবল var deferred = q.defer () ব্যবহার করতে পারি এবং তারপরে সমাধান বা প্রত্যাখ্যান করতে পারি, তবে এটি এত সাধারণ কোনও কিছুর জন্য প্রচুর ওভারহেডের মতো বলে মনে হয়। যদি তা হয় তবে ধন্যবাদ :)
পিক্সম্যাচ

4
আপনি pool.query()সরাসরি ব্যবহার করতে পারেন । এটি pool.getConnection()-> connection.query()-> connection.release()কোড প্রবাহের শর্টকাট ।
গাল শাবুদি

30

পারলে আপনার ব্যবহার এড়ানো উচিত pool.getConnection()। ফোন দিলেpool.getConnection() , আপনি আবশ্যক কল connection.release()যখন আপনি সংযোগ ব্যবহার করা হয়। অন্যথায়, আপনার সংযোগের সীমাটি একবার আঘাত করার পরে আপনার অ্যাপ্লিকেশনটি পুলটিতে সংযোগ ফিরে পাওয়ার জন্য চিরকাল অপেক্ষা করে আটকে যাবে।

সাধারণ প্রশ্নের জন্য, আপনি ব্যবহার করতে পারেন pool.query() । এই শর্টহ্যান্ডটি স্বয়ংক্রিয়ভাবে connection.release()আপনাকে ডাকবে error এমনকি ত্রুটির অবস্থাতেও।

function doSomething(cb) {
  pool.query('SELECT 2*2 "value"', (ex, rows) => {
    if (ex) {
      cb(ex);
    } else {
      cb(null, rows[0].value);
    }
  });
}

তবে কিছু ক্ষেত্রে আপনার অবশ্যই ব্যবহার করা উচিত pool.getConnection()। এই কেসগুলির মধ্যে রয়েছে:

  • লেনদেনের মধ্যে একাধিক প্রশ্ন করা।
  • পরবর্তী প্রশ্নের সাথে অস্থায়ী টেবিলের মতো ডেটা অবজেক্টগুলি ভাগ করা।

যদি আপনার অবশ্যই ব্যবহার করা হয় তবে pool.getConnection()নিশ্চিত করুন যে আপনি connection.release()নীচের মতো প্যাটার্ন ব্যবহার করে কল করেছেন :

function doSomething(cb) {
  pool.getConnection((ex, connection) => {
    if (ex) {
      cb(ex);
    } else {
      // Ensure that any call to cb releases the connection
      // by wrapping it.
      cb = (cb => {
        return function () {
          connection.release();
          cb.apply(this, arguments);
        };
      })(cb);
      connection.beginTransaction(ex => {
        if (ex) {
          cb(ex);
        } else {
          connection.query('INSERT INTO table1 ("value") VALUES (\'my value\');', ex => {
            if (ex) {
              cb(ex);
            } else {
              connection.query('INSERT INTO table2 ("value") VALUES (\'my other value\')', ex => {
                if (ex) {
                  cb(ex);
                } else {
                  connection.commit(ex => {
                    cb(ex);
                  });
                }
              });
            }
          });
        }
      });
    }
  });
}

আমি ব্যক্তিগতভাবে Promiseএস এবং useAsync()প্যাটার্ন ব্যবহার করতে পছন্দ করি । এই প্যাটার্নটি async/ এর সাথে সম্মিলিতভাবে awaitঘটনাক্রমে release()সংযোগটি ভুলে যাওয়া অনেক বেশি শক্ত করে তোলে কারণ এটি আপনার লেজিকাল স্কোপিংটিকে একটি স্বয়ংক্রিয় কলটিতে রূপান্তরিত করে .release():

async function usePooledConnectionAsync(actionAsync) {
  const connection = await new Promise((resolve, reject) => {
    pool.getConnection((ex, connection) => {
      if (ex) {
        reject(ex);
      } else {
        resolve(connection);
      }
    });
  });
  try {
    return await actionAsync(connection);
  } finally {
    connection.release();
  }
}

async function doSomethingElse() {
  // Usage example:
  const result = await usePooledConnectionAsync(async connection => {
    const rows = await new Promise((resolve, reject) => {
      connection.query('SELECT 2*4 "value"', (ex, rows) => {
        if (ex) {
          reject(ex);
        } else {
          resolve(rows);
        }
      });
    });
    return rows[0].value;
  });
  console.log(`result=${result}`);
}

4
+1 - কেবল একটি নোট - প্রতিটি ক্যোয়ারীর জন্য অপেক্ষা করা উদাহরণগুলি অনুধাবন করতে পারে না যেখানে আপনি একাধিক ক্যোয়ারী চালাচ্ছেন যা অনুশীলনে ক্রমানুসারে পরিবর্তে একসাথে চালানো যেতে পারে।
এলোমেলো_উজার_নাম

4
@ ক্যাল_বি আপনি অদ্ভুতভাবে যাদুকর কিছু না করে এই প্রশ্নগুলি সমান্তরালে চালানো অসম্ভব। আপনি যদি ডেটা নির্ভরতা সহ কোনও লেনদেনে একাধিক ক্যোয়ারী চালাচ্ছেন তবে আপনি নিশ্চিত হন যে প্রথমটি সম্পন্ন না হওয়া পর্যন্ত আপনি দ্বিতীয় ক্যোয়ারি চালাতে পারবেন না। যদি আপনার প্রশ্নগুলি কোনও লেনদেন ভাগ করে নিচ্ছে, যেমন প্রদর্শিত হয়েছে, তারা সংযোগও ভাগ করছে। প্রতিটি সংযোগ একবারে কেবল একটি ক্যোয়ারিকে সমর্থন করে ( মাইএসকিউএলে মারসের মতো জিনিস নেই )।
বিনকি 21

4
আপনি যদি বাস্তবে ডাটাবেসে একাধিক স্বতন্ত্র অপারেশন করে থাকেন তবে কোনও কিছুই আপনাকে usePooledConnectionAsync()প্রথমটির কাজ শেষ করার আগে একাধিকবার কল করা থেকে বিরত রাখছে না । নোট করুন যে, পুলিংয়ের মাধ্যমে আপনি নিশ্চিত করতে চাইবেন যে আপনি অন্যভাবে awaitযে ফাংশনটি পাস করেছেন actionAsyncতার মধ্যে কোয়েরি সমাপ্তি ছাড়া অন্য ইভেন্টগুলি এড়ানো হয়েছে , আপনি একটি অচলাবস্থা তৈরি করে শেষ করতে পারেন (উদাহরণস্বরূপ, পুল থেকে শেষ সংযোগ পাবেন, তারপরে কল করুন) আরেকটি ফাংশন যা পুলটি ব্যবহার করে ডেটা লোড করার চেষ্টা করে যা শূন্য থাকা অবস্থায় পুল থেকে নিজের সংযোগ পাওয়ার চেষ্টা করার জন্য চিরকাল অপেক্ষা করবে)।
বিনকি 21

4
আকর্ষণের জন্য ধন্যবাদ। এটি এমন একটি অঞ্চল হতে পারে যা আমার বোঝা দুর্বল - তবে, পূর্বে (পুলগুলিতে স্যুইচ করার আগে, আপনার উত্তরটি প্রাথমিকভাবে বিটিডব্লিউ) ব্যবহার করে আমার একাধিক নির্বাচন "সমান্তরাল" তে চলছিল (এবং তারপরে ফিরে আসার পরে আমি আমার জেএস যুক্তিতে ফলাফলগুলি মার্জ করেছিলাম) )। আমি মনে করি না যে এটি যাদুকর, তবে এটি awaitপরবর্তী কৌশল জিজ্ঞাসা করার আগে কারও কাছে না নেওয়া ভাল কৌশল বলে মনে হয়েছিল। আমি এখনই কোনও বিশ্লেষণ করিনি, তবে আমি যেভাবে জিনিসগুলি রচনা করেছি (নতুন প্রতিশ্রুতি ফিরিয়ে দিচ্ছি), আমি মনে করি এটি এখনও সমান্তরালে চলছে ...
এলোমেলো_ ব্যবহারকারী_নাম

@ ক্যাল_বি ঠিক আছে, আমি বলছি না যে প্যাটার্নটি খারাপ। যদি আপনাকে একাধিক ডেটা লোড করতে হয় এবং এটি ধরে নেওয়া যায় যে তারা হয় স্বতন্ত্র বা পর্যাপ্ত অপরিবর্তনীয়, একগুচ্ছ স্বতন্ত্র লোড চালু করে এবং তারপরে কেবল awaitতখনই যখন সেগুলি ফলাফলের একসাথে রচনার প্রয়োজন হয় তখনই এটি করার একটি উপায় them (যদিও আমি ভীত হয়েছি যে এর ফলে ভবিষ্যতে নোড.জেএস ক্র্যাশ হতে পারে এমন মিথ্যা ইতিবাচক অনাবৃত প্রতিশ্রুতি প্রত্যাখ্যান ইভেন্টগুলির ফলাফল হবে --unhandled-rejections=strict)।
বিনকি

14

আপনি এই মোড়ক ব্যবহারকারীর পুরোটি খুঁজে পাবেন :)

var pool = mysql.createPool(config.db);

exports.connection = {
    query: function () {
        var queryArgs = Array.prototype.slice.call(arguments),
            events = [],
            eventNameIndex = {};

        pool.getConnection(function (err, conn) {
            if (err) {
                if (eventNameIndex.error) {
                    eventNameIndex.error();
                }
            }
            if (conn) { 
                var q = conn.query.apply(conn, queryArgs);
                q.on('end', function () {
                    conn.release();
                });

                events.forEach(function (args) {
                    q.on.apply(q, args);
                });
            }
        });

        return {
            on: function (eventName, callback) {
                events.push(Array.prototype.slice.call(arguments));
                eventNameIndex[eventName] = callback;
                return this;
            }
        };
    }
};

এটি প্রয়োজন, এটি এটি ব্যবহার করুন:

db.connection.query("SELECT * FROM `table` WHERE `id` = ? ", row_id)
          .on('result', function (row) {
            setData(row);
          })
          .on('error', function (err) {
            callback({error: true, err: err});
          });

10

আমি এই বেস ক্লাস সংযোগটি মাইএসকিএল-এর সাথে ব্যবহার করছি:

"বেস.জেএস"

var mysql   = require("mysql");

var pool = mysql.createPool({
    connectionLimit : 10,
    host: Config.appSettings().database.host,
    user: Config.appSettings().database.username,
    password: Config.appSettings().database.password,
    database: Config.appSettings().database.database
});


var DB = (function () {

    function _query(query, params, callback) {
        pool.getConnection(function (err, connection) {
            if (err) {
                connection.release();
                callback(null, err);
                throw err;
            }

            connection.query(query, params, function (err, rows) {
                connection.release();
                if (!err) {
                    callback(rows);
                }
                else {
                    callback(null, err);
                }

            });

            connection.on('error', function (err) {
                connection.release();
                callback(null, err);
                throw err;
            });
        });
    };

    return {
        query: _query
    };
})();

module.exports = DB;

কেবল এটির মতো ব্যবহার করুন:

var DB = require('../dal/base.js');

DB.query("select * from tasks", null, function (data, error) {
   callback(data, error);
});

4
যদি ক্যোয়ারীর errসত্য হয়? কোয়েরিতে কিছু ত্রুটি আছে তা বোঝাতে কি এখনও প্যারামিটার callbackদিয়ে কল করা উচিত নয় null?
জো হুয়াং

হ্যাঁ, আপনি লিখেছেন, ক্যোয়ারী ত্রুটি দিয়ে কলব্যাক বুদবুদ করা দরকার
সাগী সোসফান

সুন্দর. তবে আপনার elseএইরকম শর্ত যুক্ত করা উচিত : if (!err) { callback(rows, err); } else { callback(null, err); }অন্যথায় আপনার অ্যাপ্লিকেশনটি স্তব্ধ হয়ে যেতে পারে। কারণ connection.on('error', callback2)সমস্ত "ত্রুটি" র যত্ন নেবে না। ধন্যবাদ!
তাদেজ

ঠিক, আমি এই
সংশোধনটি

নোডেজ নিউবে এখানে: কেন আপনার ফাংশন (ডেটা, ত্রুটি) এবং কলব্যাক (ডেটা, ত্রুটি) রয়েছে; যখন আমি দেখেছি বেশিরভাগ নোডেজ কোডটি প্রথম প্যারাম হিসাবে ত্রুটি এবং দ্বিতীয় প্যারাম হিসাবে ডেটা / কলব্যাক? উদা: কলব্যাক (ত্রুটি, ফলাফল)
কিংঅ্যান্ড্রু

2

আপনি যখন কোনও সংযোগ দিয়ে শেষ করেছেন, কেবল কল করুন connection.release()এবং সংযোগটি পুলটিতে ফিরে আসবে, অন্য কারও দ্বারা আবার ব্যবহারের জন্য প্রস্তুত।

var mysql = require('mysql');
var pool  = mysql.createPool(...);

pool.getConnection(function(err, connection) {
  // Use the connection
  connection.query('SELECT something FROM sometable', function (error, results, fields) {
    // And done with the connection.
    connection.release();

    // Handle error after the release.
    if (error) throw error;

    // Don't use the connection here, it has been returned to the pool.
  });
});

আপনি যদি সংযোগটি বন্ধ করতে এবং এটি পুল থেকে সরাতে চান তবে connection.destroy()পরিবর্তে ব্যবহার করুন। পরের বার যখন প্রয়োজন হবে তখন পুলটি একটি নতুন সংযোগ তৈরি করবে।

সূত্র : https://github.com/mysqljs/mysql


0

স্ট্যান্ডার্ড mysql.createPool () ব্যবহার করে সংযোগগুলি অলসভাবে পুলের মাধ্যমে তৈরি করা হয়েছে। আপনি যদি 100 টি সংযোগের অনুমতি দেওয়ার জন্য পুলটি কনফিগার করেন তবে কেবল একবারে 5 টি ব্যবহার করেন, কেবল 5 টি সংযোগ তৈরি হবে। তবে আপনি যদি এটি 500 সংযোগের জন্য কনফিগার করেন এবং সমস্ত 500 ব্যবহার করেন তবে এগুলি নিষ্ক্রিয় থাকলেও প্রক্রিয়াটির সময়কালের জন্য তারা উন্মুক্ত থাকবে!

এর অর্থ যদি আপনার মাইএসকিউএল সার্ভার সর্বোচ্চ_সংযোগগুলি 510 হয় আপনার মাইএসকিউএল সার্ভারটি বন্ধ না করা না হওয়া অবধি আপনার সিস্টেমে কেবল 10 টি মাইএসকিউএল সংযোগ উপলব্ধ থাকবে (আপনি কী আপনার ওয়েটটাইমআউট সেট করেছেন তার উপর নির্ভর করে) বা আপনার অ্যাপ্লিকেশন বন্ধ হয়ে যায়! এগুলি মুক্ত করার একমাত্র উপায় হ'ল পুল ইভেন্টের মাধ্যমে ম্যানুয়ালি সংযোগগুলি বন্ধ করা বা পুলটি বন্ধ করা।

mysql- সংযোগ-পুল-ম্যানেজার মডিউলটি এই সমস্যাটি সমাধান করতে এবং স্বয়ংক্রিয়ভাবে লোডের উপর নির্ভরশীল সংযোগগুলির সংখ্যা স্কেল করার জন্য তৈরি করা হয়েছিল। নিষ্ক্রিয় সংযোগগুলি বন্ধ রয়েছে এবং নিষ্ক্রিয় সংযোগ পুলগুলি কোনও ক্রিয়াকলাপ না হলে অবশেষে বন্ধ হয়ে যায়।

    // Load modules
const PoolManager = require('mysql-connection-pool-manager');

// Options
const options = {
  ...example settings
}

// Initialising the instance
const mySQL = PoolManager(options);

// Accessing mySQL directly
var connection = mySQL.raw.createConnection({
  host     : 'localhost',
  user     : 'me',
  password : 'secret',
  database : 'my_db'
});

// Initialising connection
connection.connect();

// Performing query
connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) {
  if (error) throw error;
  console.log('The solution is: ', results[0].solution);
});

// Ending connection
connection.end();

রেফ: https://www.npmjs.com/package/mysql-connection-pool-manager


-6

আমি সবসময় কানেকশন.রেলেস () ব্যবহার করি; মত পুল .getconnetion

pool.getConnection(function (err, connection) {
      connection.release();
        if (!err)
        {
            console.log('*** Mysql Connection established with ', config.database, ' and connected as id ' + connection.threadId);
            //CHECKING USERNAME EXISTENCE
            email = receivedValues.email
            connection.query('SELECT * FROM users WHERE email = ?', [email],
                function (err, rows) {
                    if (!err)
                    {
                        if (rows.length == 1)
                        {
                            if (bcrypt.compareSync(req.body.password, rows[0].password))
                            {
                                var alldata = rows;
                                var userid = rows[0].id;
                                var tokendata = (receivedValues, userid);
                                var token = jwt.sign(receivedValues, config.secret, {
                                    expiresIn: 1440 * 60 * 30 // expires in 1440 minutes
                                });
                                console.log("*** Authorised User");
                                res.json({
                                    "code": 200,
                                    "status": "Success",
                                    "token": token,
                                    "userData": alldata,
                                    "message": "Authorised User!"
                                });
                                logger.info('url=', URL.url, 'Responce=', 'User Signin, username', req.body.email, 'User Id=', rows[0].id);
                                return;
                            }
                            else
                            {
                                console.log("*** Redirecting: Unauthorised User");
                                res.json({"code": 200, "status": "Fail", "message": "Unauthorised User!"});
                                logger.error('*** Redirecting: Unauthorised User');
                                return;
                            }
                        }
                        else
                        {
                            console.error("*** Redirecting: No User found with provided name");
                            res.json({
                                "code": 200,
                                "status": "Error",
                                "message": "No User found with provided name"
                            });
                            logger.error('url=', URL.url, 'No User found with provided name');
                            return;
                        }
                    }
                    else
                    {
                        console.log("*** Redirecting: Error for selecting user");
                        res.json({"code": 200, "status": "Error", "message": "Error for selecting user"});
                        logger.error('url=', URL.url, 'Error for selecting user', req.body.email);
                        return;
                    }
                });
            connection.on('error', function (err) {
                console.log('*** Redirecting: Error Creating User...');
                res.json({"code": 200, "status": "Error", "message": "Error Checking Username Duplicate"});
                return;
            });
        }
        else
        {
            Errors.Connection_Error(res);
        }
    });

8
জিজ্ঞাসা করার আগে আপনি সংযোগটি ব্যবহার করার আগে মনে করবেন না
কেভিটলি

4
হ্যাঁ, এটি একটি খারাপ খবর .... এটি আপনার প্রকাশের সাথে দূরে চলেছে এমন জিনিসগুলির অসম প্রকৃতির এটির একটি পার্শ্ব প্রতিক্রিয়া। আপনি কিছুটা বিলম্বের পরিচয় দিলে আপনি সেই ক্যোয়ারীটি দেখতে পাবেন না। প্যাটার্নটি হ'ল ... পুল.গেট সংযোগ (ফাংশন (ত্রুটি, সংযোগ) {// সংযোগ ব্যবহার করুন। । connection.release (); মুক্তির পর // হাতল ত্রুটি করেন (ত্রুটি) নিক্ষেপ সমস্যা হয়েছে; npmjs.com/package/mysql#pooling-connections
hpavc
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.