玩关系数据库的框架和Node.js非阻塞行为

Play Frameworkbuild议将阻塞IO中继到合适大小的线程池,如下所示:

https://www.playframework.com/documentation/2.5.x/ThreadPools

这是关系数据库访问的情况,因为没有可用的非阻塞JDBC驱动程序 (除less数例外)

我目前正在学习Node.JS,我无法弄清楚这是如何处理节点。 我没有看到任何需要编码思考节点中的线程池。

那么,node.js中使用的关系数据库驱动程序是否能够执行非阻塞IO? 还是这些计算被传递到幕后的某种工作线程?

从更广泛的意义上说:编写一个非常强大的数据库(关系)的node.js应用程序的正确方法是什么?

节点是单线程的,所以没有用户线程池[1] 。 相反,您需要使用更多节点服务器进行水平扩展。 您可以在Node应用程序中执行此操作: https : //devcenter.heroku.com/articles/node-concurrency

而另一方面,我用async-JDBC-ish postgresql-async驱动程序取得了很好的成功。 我用jdub-async和scalikejdbc 。 这里是我写的关于scalikejdbc使用它的博客: https ://www.jamesward.com/2015/04/07/reactive-postgres-with-play-framework-scalikejdbc


[1]用户代码运行单线程(但您可以使用Web工作人员有线程),但libuv是multithreading。 阅读更多: 单线程非阻塞IO模型如何在Node.js中工作

我想你基本上回答了你自己的问题:在nodejs中,你不必根据线程池来编写代码。 Play中的数据库线程池是Java JDBC API固有的。 纯粹的nodejs数据库驱动程序是通过deviseasynchronous的。 nodejs包装驱动程序的体系结构取决于包装库的体系结构。

更广泛的问题的答案是:

如何在nodejs或java中对数据库密集型应用程序进行编码没有多大区别,因为无论平台如何,很可能您的瓶颈将是数据库后面的持久性存储。 但是在asynchronous架构中:

  1. devise一个不会让你的数据库负担过重的系统是比较自然的

  2. 在数据库减速的情况下,应用程序本身通常不会要求更多的系统资源

一个好的数据库驱动程序可以让您通过托pipe连接池,每个查询超时,每个连接查询队列实现上述要点。 尽pipe其中一些也可能是本地数据库接口的一个function。