【问题标题】:Should I keep database connection open?我应该保持数据库连接打开吗?
【发布时间】:2014-09-06 17:36:12
【问题描述】:

当我使用 Grex 连接到 Rexster 图形服务器时,我应该保持数据库连接打开吗?

var grex = require('grex');
var client = grex.createClient();

client.connect({ graph: 'graph'}, function(err, client) {
    if (err) { console.error(err); }

    ...
});

我想我应该这样做,因为 nodejs 是单线程的,因此不同的请求不可能同时尝试使用一个连接。

【问题讨论】:

  • JavaScript 对于普通代码是单线程的。对于异步代码(回调或事件),JS 是多线程的。
  • 我认为它是一个在不同代码块之间切换的单线程。因此,如果您有一些等待回调的代码,Javascript 会在其他地方关闭,然后在完成等待某事并完成它正在运行的任何其他内容时返回到回调。但它永远不会同时运行超过一点的代码。

标签: node.js titan rexster


【解决方案1】:

是的,你应该这样做。没有理由在每个请求上都有连接的开销。不会有任何“修改”问题,因为您的代码无论如何都会在单线程中运行。

此外,您甚至可以有一个连接池等待处理您的请求,以防您的应用程序使用量很大。一些适配器会自动为您执行此操作,例如,MongoClient 具有 5 个连接的默认池。

【讨论】:

  • @IanWarburton 谢谢 :)
  • 三思而后行,不就是单线程的http请求位吗?诸如数据库访问之类的异步操作被移交给线程,因此您肯定可以同时运行多个查询吗?
  • @IanWarburton 在 Nodejs 上,您编写的代码在单个线程上运行。所有的 IO 操作都被发送到“循环”,这是一个线程池,以特定的方式执行任务。这就是你有回调的原因 - IO 说“准备好!”,回调触发。您可以在 IO 端同时运行大量查询并由“循环”处理,在您的代码上,它们都会一个一个地触发自己的单独回调。
  • ...如果您对所有数据库工作使用单个连接,那么每个线程不会使用相同的事务吗?
  • @IanWarburton 为了更好地理解事件循环在 nodejs 上的工作原理,这是一本很棒的读物:nikhilm.github.io/uvbook/index.html - 你会学到比你想象的更多的东西 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
  • 1970-01-01
  • 2013-11-09
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多