JDBC:我可以在多线程应用程序中共享连接并享受良好的事务吗?

2023-12-12

看起来使用 JDBC 处理事务的经典方法是将自动提交设置为 false。这会创建一个新事务,每次调用 commit 都标志着下一个事务的开始。 在多线程应用程序中,我知道为每个线程打开一个新连接是常见的做法。

我正在编写一个基于 RMI 的多客户端服务器应用程序,因此基本上我的服务器会为每个新连接无缝地生成一个线程。 为了正确处理事务,我应该为每个线程创建一个新连接吗? 这样的架构成本是不是太高了?


是的,通常您需要为每个线程创建一个新连接。您无法控制操作系统如何对线程的执行进行时间切片(尽管定义了自己的关键部分),因此您可能会无意中让多个线程尝试沿该管道发送数据。

请注意,这同样适用于任何网络通信。例如,如果您有两个线程尝试与 HTTP 连接共享一个套接字。

  • 线程1发出请求
  • 线程2发出请求
  • 线程 1 从套接字读取字节,无意中读取了线程 2 请求的响应

如果您将所有事务包装在关键部分中,并因此在整个开始/提交周期中锁定任何其他线程,那么您也许能够在线程之间共享数据库连接。但即便如此,我也不会这样做,除非您确实对 JDBC 协议有天生的了解。

如果大多数线程很少需要数据库连接(或根本不需要),您可以指定一个线程来完成数据库工作,并让其他线程将其请求排队到该线程。这将减少如此多的连接的开销。但是您必须弄清楚如何管理环境中每个线程的连接(或者在 StackOverflow 上询问有关该问题的另一个具体问题)。

update:为了回答您在评论中的问题,大多数数据库品牌不支持单个连接上的多个并发事务(InterBase/Firebird 是我所知道的唯一例外)。

如果有一个单独的事务对象,并且能够为每个连接启动和提交多个事务,那就太好了。但供应商根本不支持它。

同样,独立于供应商的标准 API(例如 JDBC 和 ODBC)也做出相同的假设,即事务状态仅仅是连接对象的一个​​属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC:我可以在多线程应用程序中共享连接并享受良好的事务吗? 的相关文章

  • 多线程 Web 应用程序

    我知道有很多情况都是在应用程序中使用多线程的好例子 但是什么时候最好在 net Web 应用程序中使用多线程 Web 应用程序几乎肯定已经由托管环境 IIS 等 实现多线程化 如果您的页面受 CPU 限制 并且想要使用多个核心 那么可以说多
  • 使用 Rails 中的 postgres json 字段更新嵌套键

    我一直在尝试更新以下内容 boxes book 2 moving 2 goods to boxes book new 2 moving 2 goods 无需使用正则表达式或在 ruby 中执行此操作 但似乎有点棘手 我想添加新密钥 然后删除
  • 将 CSV 复制到 Amazon RDS 托管的 Postgresql 数据库

    我有一个使用 Amazon 的 RDS 服务托管的数据库 我正在尝试编写一个 Web 服务来更新所述数据库 我遇到的问题是它不允许我使用 COPY 命令 因为我收到此错误 错误 必须是超级用户才能复制到文件或从文件复制 我正在使用我为数据库
  • TransactionScope 的细微差别

    假设我有两个线程 它们在特定于线程的 TransactionScope 中执行一些面向数据库的代码 并具有 ReadCommissed 隔离级别 但是有一些表的数据应该共享 不应创建重复项 using var transactionScop
  • 初始化 ConcurrentHashMap 值的最快方法

    ConcurrentHashMap 通常在并发环境中用于聚合某个键下的某些事件 例如计算某些字符串值的命中数 如果我们事先不知道密钥 我们需要有一个好的方法来根据需要初始化密钥 它应该在并发性方面快速且安全 这个问题的最佳模式 就效率而言
  • 运行单个 Java 线程的双核 CPU 利用率[重复]

    这个问题在这里已经有答案了 可能的重复 多线程 Java 应用程序能否很好地利用多核机器 https stackoverflow com questions 1649402 would a multithreaded java applic
  • 为什么 hibernate 在一张表中保存两个 @OneToMany 列表?

    想象一下使用 Hibernate 和 JPA 的简化代码如下 Entity class C Id GeneratedValue public long id MappedSuperclass abstract class A Id Gene
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • 如何为 MySQL 和 Postgres 编写不区分大小写的查询?

    我在本地运行 MySQL 数据库进行开发 但部署到使用 Postgres 的 Heroku Heroku 处理几乎所有事情 但我不区分大小写的 Like 语句变得区分大小写 我可以使用 iLike 语句 但我的本地 MySQL 数据库无法处
  • Parallel.ForEach - 优雅取消

    关于等待任务完成和线程同步的主题 我目前有一个迭代 我已将其包含在 Parallel ForEach 中 在下面的示例中 我在评论中提出了一些关于如何最好地处理循环的优雅终止的问题 NET 4 0 private void myFuncti
  • 基于列顺序的查询速度

    数据库中列类型的顺序对查询时间有影响吗 例如 具有混合排序 INT TEXT VARCHAR INT TEXT 的表的查询速度是否会比具有连续类型 INT INT VARCHAR TEXT TEXT 的表慢 答案是肯定的 这确实很重要 而且
  • 返回行位置 - Postgres

    我返回一个带有位置的表 select from select row number over as position from organization result where data1 Hello 返回这个 这是正确的 data1 H
  • Rails 多租户架构,限制多个租户的访问范围

    目前我们有一个单租户数据库架构 MySQL 运行着超过 100 个数据库 我们使用 Apartment gem 切换子域上的数据库连接 一切都很顺利 然而 我们现在需要创建所谓的 伞 客户端 它可以访问一组现有客户端的所有数据 我不认为这对
  • 在c99中使用__thread

    我想使用 thread 存储类定义一些特定于线程的变量 但三个问题让我犹豫不决 它真的是c99的标准吗 或者更重要的是 编译器支持有多好 变量会在每个线程中初始化吗 非多线程程序是否将它们视为普通的旧全局变量 回答您的具体问题 不 它不是
  • 从备份恢复 PostgreSQL 数据库,没有外键约束问题

    我有一个包含大约 85 个以上表的 postgresql 数据库 我定期使用pg dump 通过 php pgadmin 在复制模式下 备份文件的大小几乎为 10 12 MB 现在我面临的问题是 每当我尝试恢复数据库时 都会出现外键约束问题
  • 如何检测 Postgres 中持有锁的查询?

    我想不断跟踪 postgres 中的互锁 我碰到锁具监控 https wiki postgresql org wiki Lock Monitoring文章并尝试运行以下查询 SELECT bl pid AS blocked pid a us
  • 多线程环境中的析构函数?

    我想知道在这样的课堂上会发生什么 class MyClass private std vector
  • POSTGRESQL:如何在现有表上添加包含数据的新列

    我是 postgres 和 sql 脚本的新手 所以请耐心等待 我想要做的是在现有表上添加包含数据的现有列 现有表的示例 NAME AGE Adam 25 Tim 30 现在我想添加一个新列 ADDRESS 其中包含 Adam 和 Tim
  • C# 线程和队列

    这不是关于我可以或应该使用的不同方法来以最佳方式利用队列 而是关于我所看到的对我来说毫无意义的事情 void Runner member variable queue Queue Synchronized new Queue while t
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中

随机推荐