zoukankan      html  css  js  c++  java
  • mysql 连接池的正确写法

    const mytools = require("./mytools");
    const mynet = require('net');
    const mysql = require('mysql')
    // 使用 createPool 建立连接池
    var mysqlpool = mysql.createPool({
        host: '',
        user: '',
        password: '',
        database: '',
        port: ''
    });
    
    
    // 保存客户端
    var g_clients = [];
    
    //移除下线的客户端
    function delete_client(temp_client_name) {
        g_clients = g_clients.filter(cn => {
            return cn != temp_client_name;
        })
    }
    
    // 创建服务器
    const server = new mynet.createServer();
    server.on('connection', (client) => {
    
        //局部客户端变量
        let client_name = client.remoteAddress + ":" + client.remotePort;
        g_clients.push(client_name);
    
        //设置超时时间为60秒(单位毫秒)因为设备间隔3s发送一次数据
        client.setTimeout(60 * 1000);
        client.on('timeout', () => {
            delete_client(client_name);
            mytools.logger().info(`客户端${client_name}超时,从客户端列表中删除!`);
            client.end();
        });
        client.on('data', function (msg) { //接收client发来的信息
    
            mytools.logger().info(`收到${client_name}:`, msg);
    
            if (!mytools.checkBuffer(msg)) {
                mytools.logger().info(`校验错误,系统自动返回! ${client_name}:`, msg);
    
            } else {
                let t_request = new mytools.myRequest();
                t_request.setBuffer(msg)
                let t_msg = mytools.getResponse(msg);
    
    
                mysqlpool.getConnection(function (err, connection) {
                    //if (err) mytools.logger().info('MySQL数据库建立连接失败。');
                    if (err) mytools.logger().info(err);
                    else {
                        mytools.logger().info('数据库建立连接成功。');
                        connection.query('INSERT INTO basetb (链路地址,请求帧,响应帧,状态,电流,电场,电压,信号强度)  VALUES (?,?,?,?,?,?,?,?)', [t_request.getLianLuDiZhi(), t_request.to16String(), t_msg.toString("hex"), t_request.getStatus(), t_request.getDianLiu(), t_request.getDianChang(), t_request.getDianYa(), t_request.getXinHao()], function (err, data) {
                            if (err) mytools.logger().info('插入数据操作失败。');
                            else {
                                mytools.logger().info(data);
                                //连接释放很重要。但是不是有人写 mysqlpool.end(); 绝对错误
                                connection.release(); 
                            }
                        });
                    }
                });
    
                client.write(t_msg, () => {
                    logger().info(
                        `写入客户端${client_name}结束,响应值为:` + t_msg.toString('hex'));
                });
            }
    
        });
    
        client.on('error', function (e) { //监听客户端异常
            mytools.logger().info('>>>>>>client error: ' + e);
            delete_client(client_name);
            client.end();
            mytools.logger().info(`客户端${client_name}出错了!`);
            mytools.logger().info('<<<<<<client error!');
        });
    
        client.on('close', function () {
            mytools.logger().info('>>>>>>client close!');
            delete_client(client_name);
            mytools.logger().info(`客户端${client_name}下线了!`);
            mytools.logger().info('<<<<<<client close!');
        });
    });
    //这里的0.0.0.0非常重要,指定未ip4格式监听。
    //127.0.0.1 localhost 上传到服务器,就无法连接(虽然本地是正常的) server.listen(7500, '0.0.0.0', function () { console.log(`服务器运行在:7500`); }); //每隔10s刷新数据库 setInterval(() => { //mytools.logger('oth').warn("当前客户端数量:", g_clients.length, "当前活动客户端列表:", g_clients); }, 90000); //链接终止指令,不要调用
  • 相关阅读:
    memcache的最佳实践方案。
    ehcache memcache redis 三大缓存男高音
    微服务-----(网站架构演变)
    分布式job-任务调度(一)
    rocketmq(三 java操作rocket API, rocketmq 幂等性)
    rocketMQ(二 )Centos7 集群
    go基础三 数组,切片,map,list
    go语言基础二 函数 ,递归函数 ,指针
    go语言基础一:数据类型,变量和常量,类型转化
    Spring AOP 学习(一) 代理模式
  • 原文地址:https://www.cnblogs.com/qqhfeng/p/12568795.html
Copyright © 2011-2022 走看看