首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当选项卡没有使用时如何禁用socket.io,因为它占用了大量内存和过多的连接问题

当选项卡没有使用时如何禁用socket.io,因为它占用了大量内存和过多的连接问题
EN

Stack Overflow用户
提问于 2020-10-26 05:54:58
回答 1查看 743关注 0票数 1

我只想在UI Reactjs上从Mysql获得实时数据。这样用户就不必总是刷新它。在查看了一些帖子之后,最终创建了一个socket.io连接,以便客户端可以与服务器对话。这就是我想要进入的:

server.js

代码语言:javascript
复制
const express = require("express");
const http = require("http");
const socketIo = require("socket.io");
var assert = require('assert');
const port = process.env.PORT || 4001;
const index = require("./routes/index");
const app = express();
app.use(index);
const server = http.createServer(app);
const io = socketIo(server);
const mysql = require('mysql');

var startDate ;
var endDate ;
var loopVariable = 1;

io.on("connection", (socket) => {
   console.log("New client connected");
   const con = mysql.createConnection({
      host: 'localhost',
      user: 'root',
      password: 'root',
      database: 'localstatus',
      debug: false,
    });
   console.log('Connection established       ',(loopVariable++));
   socket.on("FromUI", (data) => {
        startDate = data.startDate;
        endDate = data.endDate;
    });
    
   var initial_result;
   setInterval(() => {
    
   con.query('SELECT * FROM table where start_time BETWEEN ? and ?', [ startDate, endDate ],(err,rows) => 
   {

    if(err) {
         console.log ('error', err.message, err.stack)
    }else {
        
    }
   if(JSON.stringify(rows) === JSON.stringify(initial_result)){
       
   }else{
        if(Changed(initial_result, rows)) { 
        
        var result = [];
        for (var row in rows) {
        var results = [];
            results.push({
                Id: rows[row].id, 
                status: rows[row].t_status,
                });
            result.push({ returnValue:"true",
                        object: {Id: rows[row].id, 
                        status: rows[row].t_status,
                        }});
        }
        socket.emit('FromAPI', result); 
        }
        initial_result = rows;  
   }    
  })
  
  function Changed(pre, now) {
    if (pre != now)
    {
        return true 
    }else{
        return false 
    }}   
   }, 1000);
    
   socket.on('disconnect', function() {
     socket.disconnect();
     loopVariable--;
   });
});
server.listen(port, () => console.log(`Listening on port ${port}`));

client.js

代码语言:javascript
复制
import React, { useState, useEffect, Component } from "react";
import socketIOClient from "socket.io-client";
import TableUsingReactTable from "./TableUsingReactTable.js";
const ENDPOINT = "http://localhost:4001";

export default function App(){
 const [response, setResponse] = useState([]);
  useEffect(() => {
    const socket = socketIOClient(ENDPOINT);
    try{
    socket.on("FromAPI", data => {
        setResponse(data);
    });
  }catch (error) {
      console.log(error);
  }
    return () => {
      socket.on("disconnect")
      socket.disconnect();
    };
  }, []);
  console.log(response)
return (<TableUsingReactTable response={response}></TableUsingReactTable>)
}

我认为当选项卡关闭时套接字会断开连接,但是当选项卡没有使用时会发生什么呢?以及如何在不使用时禁用它?即使当所有选项卡都关闭时,RAM也会增加。当套接字关闭时,如何减少RAM?当很多人同时点击socket.io时,是如何表现的呢?此外,有时我确实要面对这样的问题:

代码语言:javascript
复制
  code: 'ER_CON_COUNT_ERROR',
  errno: 1040,
  sqlMessage: 'Too many connections',
  sqlState: undefined,
  fatal: true

怎么处理这个案子?我对此并不熟悉,也不了解如何进一步发展。有人能帮我吗?非常感谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-26 06:01:03

首先,对于这个用例,您实际上并不需要Socket.IO。服务器发送事件/EventSource API可以做到这一点,因为您只向一个方向发送数据。这给了您不需要加载Socket.IO库的好处。

现在,真正的问题是您要为每个单独的客户端创建一个单独的MySQL连接。与每次新客户端连接时调用mysql.createConnection()不同,您可以连接数据库一次。(在某些情况下,这是不合适的,但是由于您只是在执行一些基本的SELECT查询,所以这很好。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64532129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档