当前位置: 首页 > 面试题库 >

Node.js MySQL需要持久连接

宓弘壮
2023-03-14
问题内容

我的Node Web应用程序需要一个持久的MySQL连接。问题是每天大约发生几次这种情况:

Error: Connection lost: The server closed the connection.
at Protocol.end (/var/www/n/node_modules/mysql/lib/protocol/Protocol.js:73:13)
at Socket.onend (stream.js:79:10)
at Socket.EventEmitter.emit (events.js:117:20)
at _stream_readable.js:895:16
at process._tickCallback (node.js:415:13)
error: Forever detected script exited with code: 8
error: Forever restarting script for 2 time
info: socket.io started

这是我的连接代码:

// Yes I know multipleStatements can be dangerous in the wrong hands.
var sql = mysql.createConnection({
    host: 'localhost',
    user: 'my_username',
    password: 'my_password',
    database: 'my_database',
    multipleStatements: true
});

sql.connect();

function handleDisconnect(connection) {
    connection.on('error', function(err) {
        if (!err.fatal) {
            return;
        }
        if (err.code !== 'PROTOCOL_CONNECTION_LOST') {
            throw err;
        }
        console.log('Re-connecting lost connection: ' + err.stack);
        sql = mysql.createConnection(connection.config);
        handleDisconnect(sql);
        sql.connect();
    });
}

handleDisconnect(sql);

如您所见,handleDisconnect代码不起作用。


问题答案:

使用mysql连接池。当连接断开时它将重新连接,您将获得额外的好处,即能够同时进行多个sql查询。如果您不使用数据库池,则您的应用将在等待当前运行的数据库请求完成时阻止数据库请求。

我通常定义一个数据库模块,使查询与路由分开。看起来像这样…

var mysql = require('mysql');
var pool  = mysql.createPool({
  host     : 'example.org',
  user     : 'bob',
  password : 'secret'
});

exports.getUsers = function(callback) {
  pool.getConnection(function(err, connection) {
    if(err) { 
      console.log(err); 
      callback(true); 
      return; 
    }
    var sql = "SELECT id,name FROM users";
    connection.query(sql, [], function(err, results) {
      connection.release(); // always put connection back in pool after last query
      if(err) { 
        console.log(err); 
        callback(true); 
        return; 
      }
      callback(false, results);
    });
  });
});


 类似资料:
  • 问题内容: 简而言之,是否有一些适合高使用率和服务器的产品,还是我需要坚持不懈地改进?如果是这样,为什么他们将其删除? 问题答案: PHP 5.3中引入了对此的支持。对于此之前的版本,PDO和–上帝禁止– mysql扩展是唯一的选择。 引用手册: 与mysql扩展不同,mysqli不提供单独的功能来打开持久连接。要打开持久连接,连接时必须在主机名前加p:。

  • “持久连接”特性允许利用一个单独的网络连接来运行本来需要多个连接的多个命令。 6.8.1.Open (打开连接) 原型:function Open () 打开到服务器的持久连接。 6.8.2.Close (关闭连接) 原型:function Close () 关闭先前打开的持久连接。

  • 在我的应用程序中,我创建了一个ArrayList,它使用不同的字段(主要是字符串和int)保存日历事件对象(WeekViewEvents): > 我是否能够加载我的ArrayList并使用它,即使它需要@TypeConverter? 我能像下面这样写我的@Entity类吗:? @Entity公共类事件{ public void setEvents(ArrayList evenciki){This.

  • 问题内容: 我有一个使用JDBC连接到MySQL的应用程序。在某些情况下,JDBC连接空闲数小时(甚至几天),并且失去与MySQL的连接,然后尝试执行查询时除外。最好的解决方案是什么? 问题答案: 保持连接打开时间不足是一个坏习惯。当数据库打开时间过长时,它将强制关闭。您应该编写JDBC代码,以便它总是在您获取它们的同一块块中关闭连接(以及语句和结果集),以防止这样的资源泄漏。 但是,获取每个连接

  • 问题内容: 我在apache和mod_wsgi和PostgreSQL中使用django(都在同一主机上),并且我需要处理很多简单的动态页面请求(每秒数百个)。我面临的问题是,瓶颈是django没有持久的数据库连接,并在每个请求上重新连接(大约需要5毫秒)。在进行基准测试时,我得到了持久连接,我可以处理近500 r / s,而没有连接时,我只能得到50 r / s。 有人有什么建议吗?如何修改Dja

  • 我正在将堆栈转换为K8S。数据库需要持久存储。 我使用了 pv.yaml(根据@Whites11的回答进行了编辑): 我进入GUI上的PVC页面,并手动向索赔添加了一个卷(基于@Whites11的反馈)。我可以看到PVC已经更新了体积,但它仍然悬而未决。 意识到自从进行@Whites11建议的更改后,pod中的原始错误消息已经更改。现在是“persistentvolume”pvvolume“not