Play Framework建议将阻塞IO中继到适当大小的线程池,如下所示:
https://www.playframework.com/documentation/2.5.x/ThreadPools
这是关系数据库访问的情况,因为没有可用的非阻塞JDBC驱动程序 (除少数例外) 。
我目前正在学习Node.JS,我无法弄清楚如何在节点中处理它。 我没有看到任何代码考虑节点中的线程池的代码。
那么,node.js中使用的关系数据库驱动程序是否能够执行非阻塞IO? 或者这些计算是否在幕后传递给某种工作线程?
从更广泛的意义上讲:编写非常DB(关系)密集型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 worker来创建线程),但libuv是多线程的。 阅读更多: 单线程非阻塞IO模型如何在Node.js中工作
我认为你基本上回答了你自己的问题:在nodejs你不必根据线程池来编写代码。 Play中的DB线程池是Java JDBC API固有的。 Pure nodejs DB驱动程序在设计上是异步的。 nodejs包装器驱动程序的体系结构取决于包装库的体系结构。
更广泛问题的答案是:
在nodejs或java中编写数据库密集型应用程序的方式没有太大区别,因为很可能您的瓶颈将是数据库背后的持久存储,而不管平台如何。 但在异步架构中:
设计一个不会因负载过大而压倒数据库的系统更为自然
在DB减速的情况下,应用程序本身通常不会需要更多的系统资源
一个好的数据库驱动程序将让您通过托管连接池,每个查询超时,每个连接查询队列实现上述要点。 虽然其中一些也可能是本机数据库接口的一个功能。