Bất kỳ sự tồn tại nào trên hành tinh này là con cái của một mối quan hệ nguyên nhân và bài viết này cũng vậy. Gần đây, tôi đã làm việc trong một dự án hệ thống quản lý cơ sở dữ liệu đại học trong một nhóm. Chúng tôi đã sử dụng ngăn xếp công nghệ khá tiêu chuẩn là HTML, CSS, Bootstrap, JQuery, NodeJS và MySQL; Vì đại dịch này đã khóa chúng tôi tại nhà của chúng tôi, chúng tôi đã lên kế hoạch lưu trữ ứng dụng này trên Heroku, một nền tảng dưới dạng dịch vụ [PAAS] cho phép các nhà phát triển quản lý các ứng dụng hoàn toàn trong đám mây. Vì tôi đang sử dụng Heroku để triển khai, tôi đã chọn một máy chủ đám mây từ xa để chuyển ứng dụng hoàn toàn sang đám mây. Nhưng nếu mọi thứ diễn ra suôn sẻ, bài viết này sẽ tồn tại. Sau khi kiểm tra hệ thống cục bộ ban đầu, tất cả đều tốt cho đến khi cơ sở dữ liệu đám mây được kết nối: Kết nối sẽ hết thời gian sau chính xác 120 mỗi lần máy chủ được chạy. Khi tìm kiếm toàn diện, tôi đã tìm thấy một giải pháp tại trang GitHub vấn đề; Các giải pháp đề cập đến một cái gì đó như hồ bơi. Hãy để hiểu các kết nối gộp, như đã nêu trên trang Wiki nhóm kết nối Nhóm kết nối là bộ đệm của các kết nối cơ sở dữ liệu được duy trì để các kết nối có thể được sử dụng lại khi yêu cầu trong tương lai đến cơ sở dữ liệu. Nhóm kết nối được sử dụng để tăng cường hiệu suất của các lệnh thực thi trên cơ sở dữ liệuconnection pool is a cache of database
connections maintained so that the connections can be reused when future requests to the database are required. Connection pools are used to enhance the performance of executing commands on a database Tập hợp kết nối cơ sở dữ liệu là một phương pháp để giữ cho cơ sở dữ liệu mở để chúng có thể được sử dụng nhiều lần mà không lãng phí tài nguyên.
Mở và đóng các kết nối cơ sở dữ liệu là một hoạt động đắt tiền, đặc biệt là khi cơ sở dữ liệu từ xa [giống như trường hợp của tôi, đang sử dụng dịch vụ cơ sở dữ liệu đám mây từ xa]. Trong một kết nối từ xa điển hình, chúng tôi mở các phiên mạng, xác thực, đã được kiểm tra ủy quyền như vậy và vv. Trong kết nối gộp, sau khi kết nối được tạo, nó được đặt trong nhóm và nó được sử dụng lại để một kết nối mới không phải được thiết lập. Nếu tất cả các kết nối đang được sử dụng, một kết nối mới được thực hiện và được thêm vào nhóm. Thủ tục dường như dễ dàng này làm giảm rất nhiều sự chờ đợi trong khi thiết lập một kết nối. Để cung cấp cho bạn một ý tưởng rõ ràng hơn, ở đây, một snap;
Biểu diễn hình ảnh nhóm kết nối cơ sở dữ liệu.Như Linus Torvalds nói, nói chuyện với giá rẻ. Cho tôi xem mã. ” , Hãy để Lặn đi vào một số mã.Talk is cheap. Show me the code.” , let’s dive in into some code.
Các đoạn sau đây cho rằng bạn đã cài đặt gói MySQL, phần còn lại chỉ là ứng dụng nút tiêu chuẩn.
Để tạo một nhóm trực tiếp và sử dụng nó:
Thực hiện truy vấn:
Pool có một số tùy chọn tiêu chuẩn:
acquireTimeout
: Millisecond trước khi hết thời gian chờ trong quá trình thu thập kết nối. Điều này hơi khác vớiconnectTimeout
, bởi vì việc có được kết nối nhóm không phải lúc nào cũng liên quan đến việc tạo kết nối. Nếu một yêu cầu kết nối được xếp hàng, thời gian yêu cầu dành cho hàng đợi không được tính vào thời gian chờ này. [Mặc định:10000
]waitForConnections
: Xác định hành động của nhóm khi không có kết nối và đã đạt được giới hạn. Nếutrue
, nhóm sẽ xếp hàng yêu cầu kết nối và gọi nó khi có sẵn. Nếufalse
, nhóm sẽ ngay lập tức gọi lại với lỗi. [Mặc định:true
]connectionLimit
: Số lượng kết nối tối đa để tạo cùng một lúc. [Mặc định:
0]ajaxHandlers = function [env_settings] { return function ajaxHandlers[req, res, next] { var sql, connection; env_settings.connection_pool.getConnection[function[err, connection] { sql = "SELECT some_data FROM some_table"; connection.query[sql, function[err, rows, fields] { if [err] { connection.release[]; // Handle data access error here return; } if [rows] { for [var i = 0; i < rows.length; i++] { // Process rows[i].some_data } } connection.release[]; res.end['Process Complete']; return; }]; }]; } } /* Expose public functions ------ */ exports.ajaxHandlers = ajaxHandlers;
1: Số lượng yêu cầu kết nối tối đa mà nhóm sẽ xếp hàng trước khi trả lại lỗi từajaxHandlers = function [env_settings] { return function ajaxHandlers[req, res, next] { var sql, connection; env_settings.connection_pool.getConnection[function[err, connection] { sql = "SELECT some_data FROM some_table"; connection.query[sql, function[err, rows, fields] { if [err] { connection.release[]; // Handle data access error here return; } if [rows] { for [var i = 0; i < rows.length; i++] { // Process rows[i].some_data } } connection.release[]; res.end['Process Complete']; return; }]; }]; } } /* Expose public functions ------ */ exports.ajaxHandlers = ajaxHandlers;
2. Nếu được đặt thànhajaxHandlers = function [env_settings] { return function ajaxHandlers[req, res, next] { var sql, connection; env_settings.connection_pool.getConnection[function[err, connection] { sql = "SELECT some_data FROM some_table"; connection.query[sql, function[err, rows, fields] { if [err] { connection.release[]; // Handle data access error here return; } if [rows] { for [var i = 0; i < rows.length; i++] { // Process rows[i].some_data } } connection.release[]; res.end['Process Complete']; return; }]; }]; } } /* Expose public functions ------ */ exports.ajaxHandlers = ajaxHandlers;
3, không có giới hạn về số lượng yêu cầu kết nối xếp hàng. [Mặc định:ajaxHandlers = function [env_settings] { return function ajaxHandlers[req, res, next] { var sql, connection; env_settings.connection_pool.getConnection[function[err, connection] { sql = "SELECT some_data FROM some_table"; connection.query[sql, function[err, rows, fields] { if [err] { connection.release[]; // Handle data access error here return; } if [rows] { for [var i = 0; i < rows.length; i++] { // Process rows[i].some_data } } connection.release[]; res.end['Process Complete']; return; }]; }]; } } /* Expose public functions ------ */ exports.ajaxHandlers = ajaxHandlers;
3]ajaxHandlers = function [env_settings] { return function ajaxHandlers[req, res, next] { var sql, connection; env_settings.connection_pool.getConnection[function[err, connection] { sql = "SELECT some_data FROM some_table"; connection.query[sql, function[err, rows, fields] { if [err] { connection.release[]; // Handle data access error here return; } if [rows] { for [var i = 0; i < rows.length; i++] { // Process rows[i].some_data } } connection.release[]; res.end['Process Complete']; return; }]; }]; } } /* Expose public functions ------ */ exports.ajaxHandlers = ajaxHandlers;
Tham khảo điều này để biết thêm
Làm thế nào điều này giải quyết vấn đề của tôi?
Bây giờ tôi cần thiết lập kết nối nhiều lần bất cứ khi nào kết nối bị mất. Một lợi thế bổ sung của việc sử dụng kết nối nhóm là tất cả các truy vấn trong kết nối MySQL được thực hiện lần lượt. Điều đó có nghĩa là nếu bạn muốn thực hiện 10 truy vấn và mỗi truy vấn mất 5, phải mất 50 giây để hoàn thành toàn bộ thực thi. Giải pháp là tạo 10 kết nối và chạy từng truy vấn trong một kết nối khác nhau. Điều này được tự động thực hiện bằng cách sử dụng nhóm kết nối. Kết nối hồ bơi thực sự tuyệt vời cho các ứng dụng chuyên sâu cơ sở dữ liệu, chỉ là điều đúng đắn cho dự án của tôi. Tôi đã giữ connectionLimit
đến 4 vì cơ sở dữ liệu từ xa của tôi chỉ hỗ trợ 5 giới hạn kết nối người dùng tối đa. Dự án đang trong giai đoạn Nascent của nó nhưng có thể được tìm thấy ở đây.
Kết nối • Tìm hiểu • Phát triển
Kết nối gộp cho phép bạn sử dụng lại các kết nối cơ sở dữ liệu hiện có thay vì mở kết nối mới cho mọi yêu cầu cho ứng dụng nút của bạn.
Nhiều người PHP và .NET đã quen với việc gộp kết nối, vì các lớp truy cập dữ liệu tiêu chuẩn trong các kết nối nhóm này [tùy thuộc vào cách bạn truy cập cơ sở dữ liệu.]
Mở một kết nối cơ sở dữ liệu mới cần có thời gian và tài nguyên máy chủ. Sử dụng kết nối đã có nhanh hơn nhiều và về tổng thể, ứng dụng của bạn cần duy trì tổng số kết nối mở ít hơn bất cứ lúc nào nếu bạn sử dụng gộp kết nối.
Chức năng gộp kết nối của Node-MysQL hoạt động rất tốt và dễ sử dụng. Tôi giữ nhóm trong một biến toàn cầu và chỉ chuyển điều đó cho bất kỳ mô -đun nào cần truy cập cơ sở dữ liệu.
Ví dụ: ở đây biến
ajaxHandlers = function [env_settings] {
return function ajaxHandlers[req, res, next] {
var sql, connection;
env_settings.connection_pool.getConnection[function[err, connection] {
sql = "SELECT some_data FROM some_table";
connection.query[sql, function[err, rows, fields] {
if [err] {
connection.release[];
// Handle data access error here
return;
}
if [rows] {
for [var i = 0; i < rows.length; i++] {
// Process rows[i].some_data
}
}
connection.release[];
res.end['Process Complete'];
return;
}];
}];
}
}
/* Expose public functions ------ */
exports.ajaxHandlers = ajaxHandlers;
6 trong máy chủ ứng dụng giữ các cài đặt toàn cầu, bao gồm nhóm kết nối hoạt động:var http = require["http"];
var mysql = require['mysql'];
var env_settings = {
dbConnSettings: {
host: "localhost",
database: "yourDBname",
user: "yourDBuser",
password: "yourDBuserPassword"
},
port: 80
};
// Create connection pool
env_settings.connection_pool = mysql.createPool[env_settings.dbConnSettings];
var app = connect[]
.use[site.ajaxHandlers[env_settings]];
http.createServer[app].listen[env_settings.port];
Và đây là mô -đun
ajaxHandlers = function [env_settings] {
return function ajaxHandlers[req, res, next] {
var sql, connection;
env_settings.connection_pool.getConnection[function[err, connection] {
sql = "SELECT some_data FROM some_table";
connection.query[sql, function[err, rows, fields] {
if [err] {
connection.release[];
// Handle data access error here
return;
}
if [rows] {
for [var i = 0; i < rows.length; i++] {
// Process rows[i].some_data
}
}
connection.release[];
res.end['Process Complete'];
return;
}];
}];
}
}
/* Expose public functions ------ */
exports.ajaxHandlers = ajaxHandlers;
7 sử dụng nhóm kết nối:ajaxHandlers = function [env_settings] {
return function ajaxHandlers[req, res, next] {
var sql, connection;
env_settings.connection_pool.getConnection[function[err, connection] {
sql = "SELECT some_data FROM some_table";
connection.query[sql, function[err, rows, fields] {
if [err] {
connection.release[];
// Handle data access error here
return;
}
if [rows] {
for [var i = 0; i < rows.length; i++] {
// Process rows[i].some_data
}
}
connection.release[];
res.end['Process Complete'];
return;
}];
}];
}
}
/* Expose public functions ------ */
exports.ajaxHandlers = ajaxHandlers;
Phương thức
ajaxHandlers = function [env_settings] {
return function ajaxHandlers[req, res, next] {
var sql, connection;
env_settings.connection_pool.getConnection[function[err, connection] {
sql = "SELECT some_data FROM some_table";
connection.query[sql, function[err, rows, fields] {
if [err] {
connection.release[];
// Handle data access error here
return;
}
if [rows] {
for [var i = 0; i < rows.length; i++] {
// Process rows[i].some_data
}
}
connection.release[];
res.end['Process Complete'];
return;
}];
}];
}
}
/* Expose public functions ------ */
exports.ajaxHandlers = ajaxHandlers;
8 không đồng bộ, vì vậy khi kết nối mở hiện tại được trả về từ nhóm hoặc kết nối mới được mở nếu cần, thì hàm gọi lại được gọi và bạn có thể sử dụng kết nối. Cũng lưu ý việc sử dụng ajaxHandlers = function [env_settings] {
return function ajaxHandlers[req, res, next] {
var sql, connection;
env_settings.connection_pool.getConnection[function[err, connection] {
sql = "SELECT some_data FROM some_table";
connection.query[sql, function[err, rows, fields] {
if [err] {
connection.release[];
// Handle data access error here
return;
}
if [rows] {
for [var i = 0; i < rows.length; i++] {
// Process rows[i].some_data
}
}
connection.release[];
res.end['Process Complete'];
return;
}];
}];
}
}
/* Expose public functions ------ */
exports.ajaxHandlers = ajaxHandlers;
9 thay vì kết thúc kết nối là bình thường. Bản phát hành chỉ cho phép nhóm lấy lại kết nối để nó có thể được sử dụng lại.Đây là một cách tốt để suy nghĩ về sự khác biệt. Lấy ví dụ về một ứng dụng rất đơn giản nhận các yêu cầu và trả về một tập dữ liệu chứa kết quả. Không có kết nối gộp, mỗi khi yêu cầu được thực hiện, một kết nối mới được mở cho cơ sở dữ liệu, kết quả được trả về và sau đó kết nối được đóng. Nếu ứng dụng nhận được nhiều yêu cầu hơn mỗi giây mà nó có thể đáp ứng, thì số lượng giao dịch mở đồng thời tăng lên, vì có nhiều hơn một kết nối hoạt động bất cứ lúc nào. Ngoài ra, mỗi giao dịch sẽ mất nhiều thời gian hơn vì nó phải mở một kết nối mới đến máy chủ dữ liệu, đây là một bước tương đối lớn.
Với kết nối gộp, ứng dụng sẽ chỉ mở các kết nối mới khi không có kết nối nào ở trong nhóm. Vì vậy, nhóm sẽ mở ra một loạt các kết nối mới theo một vài yêu cầu đầu tiên và để chúng mở. Bây giờ khi một yêu cầu mới được thực hiện, quy trình gộp kết nối sẽ lấy một kết nối đã mở và được sử dụng trước đó thay vì mở kết nối mới. Điều này sẽ nhanh hơn và sẽ có ít kết nối hoạt động hơn với cơ sở dữ liệu dưới tải nặng. Tất nhiên, sẽ có nhiều kết nối "chờ" hơn khi không có ai tấn công máy chủ, vì chúng được giữ trong nhóm. Nhưng đó thường không phải là một vấn đề vì máy chủ có nhiều tài nguyên có sẵn trong trường hợp đó.
Vì vậy, gộp kết nối cơ sở dữ liệu có thể được sử dụng để làm cho ứng dụng của bạn nhanh hơn và có thể mở rộng hơn. Nếu bạn có rất ít lưu lượng truy cập, điều đó không quan trọng - trừ khi bạn muốn trả về kết quả càng nhanh càng tốt. Kết nối gộp nếu thường là một phần của chiến lược tổng thể để giảm độ trễ và cải thiện hiệu suất tổng thể.