This topic created in 3372 days ago, the information mentioned may be changed or developed.
比如,我写了一个 Web Server 需要使用 MySQL 服务、 RabbitMQ 服务。其中 MySQL 库( mysqljs )自带了 Connection Pool 功能,能够自动处理连接失败等错误,而 RabbitMQ 库就没有带这个功能,只能用 amqp.createConnection 来创建一次性的连接。
那么我有两个问题要请教大家:
* 如何让应用代码来访问这些连接?
我的代码分为很多层,其中 Web Server 是顶层,提供了 REST API ;需要访问数据库、 MQ 的工具库等在最底层。
有两个可能的方式(请大佬们补充):
1. 创建 Web Server 时将连接对象传递进去,然后层层向下传。这样会让函数多出妨碍视觉的参数。
2. 直接创建一个文件 Connection Manager ,在应用程序启动时建立连接,并把连接 add 到这个 manager 里面。底层代码直接 require 这个 manager ,然后用类似于 `const mysqlcOnn= manager.get('mysql')` 这种方式来调用。
* 我是否应该手动实现一个连接池?是否有现成的轮子?
在应用程序运行过程中,如果 RabbitMQ 服务器挂掉或因故重启了,那么之前创建好的连接就无效了。这时应该直接让 Web Server 重启,还是使连接池重新建立连接?
请大家不吝指教,如果有的话能够给一些现成的开源代码参考一下。谢谢。
6 replies 2017-04-07 00:22:05 +08:00  | | 1 kfll Feb 15, 2017 via Android 都可以,依赖注入加管理器 |
 | | 2 t123yh Feb 15, 2017 via Android |
 | | 3 anchoretic Feb 16, 2017 使用 waterline 等 ORM 框架不就好了? |
 | | 5 yunshansimon Mar 6, 2017 推荐自建连接池,全部都用长连接,这样可以节省数据库连接开销。包装常用的数据库访问函数,在调用前检查数据库连接是否正常,不正常就断掉重连(这样,就算数据库服务器端挂掉,你也会自动重连)。优化的话,就加一个数据库访问队列,给每个数据库连接增加计数,所有数据库访问先进入队列,再调用数量最低的数据库连接(数据库返回错误,还能把输入再打入队列,等会再试一次)。输入数据连接计数高于 5000 (假定值),就重连,并且清空计数,这样保证数据库服务器的内存优化。对外 export 数据库操作函数 get , put , post , delete 就好了,不需要指定连接。 |
 | | 6 libook Apr 7, 2017 我用的是 mongoose ,自带连接池功能,自动完成所有过程。。。 |