为什么数据库和数据库连接池不采用类似java nio的IO多路复用技术使用一个连接来维护和数据库的数据交换?

论坛 期权论坛 期权     
小兴   2018-10-13 12:12   6576   7
类似java的nio相比于传统阻塞io模型来说,有效率高(特别在高并发情况下)和资源耗费相对较少的优点。传统的阻塞IO为了提高效率,需要创建一定数量的连接形成连接池,而nio仅需要一个连接即可(大部分情况下一个连接即可)。那么请问,数据库和数据库连接池为什么不采用这种方式?
分享到 :
0 人收藏

7 个回复

倒序浏览
2#
张纪周  3级会员 | 2018-10-13 12:12:55 发帖IP地址来自
IO多路复用,复用的是进程或者单线程,而不是网络(socket)连接。数据库或者数据库连接池的连接本质也可以理解为socket连接,只不过还包含用户权限和缓存等信息。因此,你的问题的前提是错的。你的想法实际是用一个网络连接来处理所有请求,那存在的问题就显而易见了。
3#
Zhang Tony  1级新秀 | 2018-10-13 12:12:56 发帖IP地址来自
个人理解:
受限于机器本身的处理能力,DB单位时间内处理的事务是有限的,即使类似NIO的模式,请求发过来也是堆积在了队列里,外界仍需等待,所以从效率或处理能力上来看是没有任何提升的(也许可以欺骗下db消费者:我可以并行处理很多事务)。
4#
沙特小王子  2级吧友 | 2018-10-13 12:12:57 发帖IP地址来自
很简单。因为数据库是CPU密集型,而非IO密集型。
考虑一个场景,当一个请求需要数据库做两个大表的“笛卡尔集”的时候,假设需要CPU计算2秒,如果是使用NIO模型,只有一个work线程,那么在该work线程在做CPU计算的时候,是无法服务其他请求的,所以在这段时间内,数据库对于其他请求来说就是“无响应‘状态!
5#
匿名用户   | 2018-10-13 12:12:59 发帖IP地址来自
提示: 作者被禁止或删除 内容自动屏蔽
6#
郑令飞  1级新秀 | 2018-10-13 12:13:01 发帖IP地址来自
我个人理解,如果真的数据库操作很多,确实做NIO非阻塞是有好处的,如果大量的数据库IO线程阻塞,服务端会有大量的无效线程切换,cpu使用率会受影响,如果考虑能通过NIO的方式,确实会有好处。还请大家指教。
7#
寸宣堂  2级吧友 | 2018-10-13 12:13:02 发帖IP地址来自
        首先数据库的最大连接数是有限的,并不是很多,MySQL 8.0 最大连接数的默认值是151,以前是100,太多的连接数会导致返回 too many connections error,当然这个值要根据你自己的平台决定,与平台的线程库质量,平台的RAM有关,具体就是你每个连接的内存,每个连接的开销,以及响应时间等多种因素决定。
       Java NIO 多用于数据量少,高并发的场景,它可以使用一个线程处理很多个连接,读,断开请求,但具体到处理读数据时是阻塞的,举个例子,如果使用单线程开启一个JAVA NIO 对外下载文件服务,这时候只能等一个文件下载完,才能继续处理其它请求,当然,如果客户端暂停了请求,它又可以去处理另一个下载的请求。也就是说所有的请求都可以的是并发的,但处理的过程是单线程的,阻塞的。
       可以看到,如果想并发处理,一个连接仍然是不够的,在传输数据时,只能阻塞等待。
8#
王明  4级常客 | 2018-10-13 12:13:04 发帖IP地址来自
类似的有啊,像http://Ado.Net在设计的时候已经设计了异步api,通过AIO访问数据库啊
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:
帖子:
精华:
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP