Hướng dẫn nodejs mysql pool vs connection - nhóm mysql của nodejs so với kết nối

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:

Máy chủ đã đóng lỗi 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ới connectTimeout, 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ếu true, nhóm sẽ xếp hàng yêu cầu kết nối và gọi nó khi có sẵn. Nếu false, 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:
    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;
    
    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à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, 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)

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ể.

Khi nào bạn không nên sử dụng kết nối gộp?

Sử dụng tài nguyên được kiểm soát. Nếu bạn tạo một kết nối mới mỗi khi một luồng cần thay vì sử dụng gộp kết nối, việc sử dụng tài nguyên của ứng dụng của bạn có thể lãng phí và nó có thể dẫn đến các hành vi không thể đoán trước cho ứng dụng của bạn khi nó bị tải nặng.If you create a new connection every time a thread needs one rather than using connection pooling, your application's resource usage can be wasteful, and it could lead to unpredictable behaviors for your application when it is under a heavy load.

Kết nối gộp những lợi thế của việc sử dụng nhóm kết nối là gì?

Sử dụng các nhóm kết nối giúp vừa giảm bớt chi phí quản lý kết nối và giảm các nhiệm vụ phát triển để truy cập dữ liệu.Mỗi lần một ứng dụng cố gắng truy cập vào một cửa hàng phụ trợ (chẳng hạn như cơ sở dữ liệu), nó yêu cầu các tài nguyên để tạo, duy trì và phát hành kết nối với kho dữ liệu đó.alleviate connection management overhead and decrease development tasks for data access. Each time an application attempts to access a backend store (such as a database), it requires resources to create, maintain, and release a connection to that datastore.

Kết nối hồ bơi trong nodejs là gì?

Nút.Trình điều khiển JS hỗ trợ gộp kết nối.Kết nối gộp cho phép ứng dụng của bạn sử dụng lại các kết nối hiện có bằng cách tự động lưu kết nối vào nhóm để nó có thể được sử dụng lại, thay vì liên tục tạo kết nối mới vào máy chủ cơ sở dữ liệu SAP HANA.

Có phải gộp một kết nối không?

Kết nối gộp có nghĩa là các kết nối được sử dụng lại thay vì được tạo mỗi khi yêu cầu kết nối.Để tạo điều kiện tái sử dụng kết nối, bộ nhớ cache bộ nhớ của các kết nối cơ sở dữ liệu, được gọi là nhóm kết nối, được duy trì bởi một mô -đun gộp kết nối như một lớp trên bất kỳ sản phẩm trình điều khiển JDBC tiêu chuẩn nào.connections are reused rather than created each time a connection is requested. To facilitate connection reuse, a memory cache of database connections, called a connection pool, is maintained by a connection pooling module as a layer on top of any standard JDBC driver product.