SO中文参考
首页
(current)
程序语言
c
java
python
c++
go
javascript
swift
c#
操作系统
linux
ubuntu
centos
unix
数据库
oracle
mysql
mongodb
postgresql
框架
node.js
angular
react-native
avalon
django
twisted
hadoop
.net
移动开发
android
ios
搜索
多个线程可以共享同一个数据库连接同时执行多个prepareStatement吗?
问题描述
投票:0
回答:1
我想使用多线程来执行SQL查询。为每个线程分配一个数据库连接将导致很大的开销。我可以让多个线程共享同一个数据库连接并并行执行多个 SQL 查询吗?
jdbc
1个回答
7
投票
理论上,JDBC 连接需要线程安全
*
,但在实践中却存在问题,原因有二:
并非所有驱动程序实际上都是线程安全的,即使是声称线程安全的驱动程序也可能没有针对此线程安全性进行可靠的测试,因为不建议并且不常见从多个线程同时使用连接。
同时从多个线程使用单个连接会带来各种额外的协调问题:一个线程提交或回滚,或者从自动提交 false 切换到自动提交 true,将破坏同一连接上所有其他线程的情况:工作丢失,或者活动结果集突然关闭(例如,由于提交,或者自动提交中执行语句的 JDBC 要求将关闭同一连接上的任何先前结果集)。
此外,如果连接中断(或被其中一个线程关闭),这也会影响所有其他线程。
此外,如果驱动程序是线程安全的,那么这种线程安全通常是通过大量同步块或其他形式的互斥来实现的。这可能会严重损害使用单独连接的性能,因为其他线程必须相互等待。
每个线程使用一个连接要简单得多,因为它将一个线程的工作与所有其他线程隔离。此外,由于不存在对连接的竞争访问,它通常会表现得更好。如果您担心多个连接的设置成本,那么您应该做两件事:
使用连接池,它可以让您轻松地重用连接。
使用大小有限的线程池来执行实际工作。
这样做有很多好处:你可以将单独的工作单元提交到线程池;工作单元从池中获取连接,并在完成后将其返回(通过关闭连接)。以这种方式使用连接池还可以让您轻松替换断开的连接,而无需在应用程序代码本身中处理此问题(除了重试断开连接的任务之外),最后同时使用连接池和线程池允许您尝试调整两者的大小,看看什么大小适合为您的应用程序提供最佳吞吐量。
*:最初这是 JDBC 1.20 规范中的硬性要求,但后来被删除。出于技术原因,某种形式的线程安全仍然是可取的。
最新问题
eslint-plugin-simple-import-sort 排序错误
Selenium Google 登录在自动化中被阻止
将部分行与 pandoc 向右对齐(md -> html)
方法prepareInterfaceForExtensionConfiguration呈现空白视图而不是提供的内容
从列数据中对表标题进行分类
如何将命令行参数传递给使用 open 命令运行的程序?
在 Jetpack Compose 中禁用 DropdownMenu 和 DropdownMenuItem 的涟漪效果
VNRecognizeTextRequest 失败,但可以在 Preview.app 中选择文本
Cookie 横幅,需要吗?
仅检索 Laravel 中每个团队内用户的指定角色
如何仅在变换上应用转换:translateX()?
尝试应用程序跳转到 Google TV 上的“预装”“云”应用程序时出错
带有 protoc_builtin PHP 的 Buf 与实际的 protoc 插件有不同的行为?
使用quick_xml和serde序列化数据时如何添加xml声明?
使用 intelliJ 将字符串串联重构为 StringBuilder
读取文本文件中的特定行 - 跳过始终转到最后一行
json 文件中的 powershell 字符问题
如何在主列表中的每个嵌套列表上打印带有新行的嵌套列表
Lwjgl / Opengl 字体渲染
调度程序初始化失败无法加载配置
© www.soinside.com 2019 - 2024. All rights reserved.