【发布时间】:2016-04-27 12:52:28
【问题描述】:
由于之前我已经回答了一些关于 MySQL 同步特性的问题,我开始质疑人们使用连接池的原因,以及在我的场景中是否应该移至池。
目前我的应用程序保持单个连接处于活动状态。在我的应用程序中只有一个 connection, statement, and result set 被回收利用。我所有的数据库任务都放在一个队列中,并在一个单独的线程上背靠背执行。 一个数据库查询线程,一个数据库访问连接。如果连接有问题,它将处理连接并创建一个新连接。
据我了解,无论有多少查询被发送到 MySQL 进行处理,它们都将按照收到的顺序同步处理。这些查询是来自单个来源还是多个来源都没有关系,它们将按照收到的顺序执行。
话虽如此,拥有多个连接和线程将查询粉碎到数据库的处理队列中的意义何在,不管它无论如何都要一个一个地处理它们。一个查询在完成处理之前不会执行,同样在我不使用池的场景中,下一个查询在前一个查询完成处理之前不会执行。
现在你可以说:
处理 MySQL 查询提供的结果所花费的时间将增加执行查询之间的时间。
这显然是正确的,这就是为什么我有一个工作线程来处理查询结果。查询完成后,我将结果转换为Map<> 格式并从内存中释放语句/结果集并开始处理下一个查询。 Map<> 被发送到单独的 Worker 线程进行处理,因此它不会阻塞查询执行线程。
谁能告诉我我做事的方式是否合适,以及我是否应该花时间转移到连接池而不是持久连接。最重要的是为什么。我开始这个线程是为了提供信息。
编辑:2016 年 4 月 29 日
我想补充一点,我知道连接池是什么,但是我更好奇在查询处理期间表锁定来自所有连接的请求时,在单个持久连接上使用池的好处.
【问题讨论】:
-
您可以并行执行多个读取操作,您对管道危险 RAW、WAR 和 WAW 感兴趣吗?无论如何,连接池保持连接打开/空闲/等待,打开一个新连接是一项繁重的任务,所以如果您有多个客户端,最好有一个池。
-
@RC - 不相关,也是错误信息。
标签: java mysql database multithreading