如何避免两个不同的线程从数据库读取相同的行(Hibernate 和 Oracle 10g)

2024-03-31

假设我有两个不同的线程 T1 和 T2,它们同时访问同一个数据库并从同一个表中获取数据。

现在,在线程启动时,我需要从表中获取数据并将行存储到集合中,然后我将使用该集合在其他地方执行一些工作。我不希望两个线程能够处理相同的数据,因为这会导致重复(且耗时)的工作。更具体地说,这是一个企业应用程序,需要在启动时加载一些记录并将其存储在集合中以完成一些额外的工作。问题是,在集群环境中,这可能会导致两个不同的实例加载相同的数据,因此工作可能会重复。所以我希望单个实例仅加载行一次。

我怎样才能避免这种情况呢?

我目前正在使用 Hibernate 和 Oracle 10g。这些是我到目前为止的解决方案:

  • 以编程方式锁定行。第一个读取它的线程将某些“锁定”列设置为 true,但如果第一个线程在未将行设置为“已处理”的情况下死亡,则很可能会发生死锁。

  • 使用悲观锁定。我尝试使用 LockMode.UPGRADE 但这似乎没有帮助,因为我仍然能够同时从两个线程读取数据。

public List<MyObject> getAllNtfFromDb() {
      Session session = HibernateUtil.getOraclesessionfactory().openSession();
      Query q = session.createQuery(
              "from MyObject n where n.state = 'NEW'");
    List<MyObject> list = (List<MyObject>) q.list();
      for (int i=0; i<list.size(); i++)
          session.lock(list.get(i), LockMode.UPGRADE);
return list;
}

还有其他提示吗?我究竟做错了什么?

Thanks.


你需要使用PESSIMISTIC_WRITE在查询时:

Query q = session
    .createQuery("from MyObject n where n.state = 'NEW'")
    .setLockOptions(new LockOptions(LockMode.PESSIMISTIC_WRITE));
List<MyObject> list = (List<MyObject>) q.list();

锁定父对象就足够了。死锁不一定会发生。如果持有锁的线程没有在另一个线程超时等待之前释放锁,则可能会导致锁获取失败。

由于您使用的是 Oracle,因此这就是选择更新 https://docs.oracle.com/cd/E17952_01/refman-5.1-en/innodb-locking-reads.html works:

SELECT ... FOR UPDATE 锁定行和任何关联的索引 条目,就像您为这些行发出 UPDATE 语句一样。 其他事务被阻止更新这些行,无法执行 SELECT ... LOCK IN SHARE MODE,或从某些模式读取数据 事务隔离级别。一致的读取会忽略设置的任何锁 读取视图中存在的记录。 (旧版本的记录 无法锁定;它们是通过应用撤消日志来重建的 记录的内存副本。)

因此,如果 T1 获取了某些行的独占锁,则在 T1 提交或回滚之前,T2 将无法读取这些记录。如果 T2 使用READ_UNCOMMITTED http://www.oracle.com/technetwork/issue-archive/2010/10-jan/o65asktom-082389.html隔离级别,那么 T2 永远不会阻塞锁定记录,因为它只是使用撤消日志来重建数据,就像查询开始时一样。与 SQL 标准相反,Oracle READ_UNCOMMITTED 将:

为了提供一致或正确的答案,Oracle 数据库将 创建包含该行的块的副本,因为它在 查询开始...实际上,Oracle 数据库绕过了 修改后的数据——它读取周围的数据,并从撤消中重建它 (也称为回滚)段。一致且正确的答案 无需等待事务提交即可返回。

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

如何避免两个不同的线程从数据库读取相同的行(Hibernate 和 Oracle 10g) 的相关文章

  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • ElasticBeanstalk Java,Spring 活动配置文件

    我正在尝试通过 AWS ElasticBeanstalk 启动 spring boot jar 一切正常 配置文件为 默认 有谁知道如何为 java ElasticBeanstalk 应用程序 不是 tomcat 设置活动配置文件 spri
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • Java中未绑定通配符泛型的用途和要点是什么?

    我不明白未绑定通配符泛型有什么用 具有上限的绑定通配符泛型 stuff for Object item stuff System out println item Since PrintStream println 可以处理所有引用类型 通
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • 如何使用 ADO 连接字符串以 SYS 身份连接到 Oracle 数据库?

    我正在尝试这个 Provider MSDASQL 1 Persist Security Info False User ID sys Password pwd Initial Catalog DATABASE Data Source Odb
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • HTML 多选不将值发送回 PHP

    我有一个 html 表单中的选择框 它不会将值发送回 php
  • 当应用程序在 Docker 容器中运行时,Swagger UI 给出 ​​404

    在我的项目中 我在 Startup cs 中使用 Swashbuckle 设置了 Swagger public void ConfigureServices IServiceCollection services services AddS
  • Node js中response.send和response.write的区别

    我编写了一个使用 Node js restify 框架的小型 API 该 API 接收请求 实际上是 之后的任何内容 然后将该请求发送到另一台服务器 从服务器获取响应并将响应传递回原始请求源 对于这个 API 我同时使用 Restify 服
  • 使用 dplyr 获取方差为零的列名称

    我试图找到数据中方差为零的任何变量 即恒定连续变量 我想出了如何使用 lapply 来做到这一点 但我想使用 dplyr 因为我试图遵循整洁的数据原则 我可以使用 dplyr 创建一个仅包含方差的向量 但在最后一步我发现值不等于零并返回令我
  • 使用 Powershell Windows 窗体将复选框添加到列表框

    我正在根据我之前的帖子创建一个新问题 在 Powershell Winforms 中更改单个列表框项目的颜色 https stackoverflow com questions 27405945 change the color of in
  • TravisCI 中的 NDK、CMake 和 Android

    我正在尝试为使用一些 C 代码的 Android 项目设置 CI 因此 我需要 Travis Android 映像上未预安装的 NDK 我目前正在通过自己拉动 NDK 来实现这一目标 但是我的 CI 盒子抱怨 CMake 许可证不被接受 奇
  • 具有两列的 LISTAGG 函数

    我有一张这样的桌子 报告 user id Department Position Record id 1 Science Professor 1001 1 Maths 1002 1 History Teacher 1003 2 Scienc
  • 几秒钟后更改 ImageView

    我正在尝试实现一个简单的活动 让用户插入密码 我有一个 gridview 其中包含 9 个要使用的图像和 4 个将作为所选图像的图像视图 单击 gridview 上的项目时 相应的图像将填充所选图像 现在的问题是 我希望 4 个图像视图的行
  • 如何在 Laravel 中设置会话超时?

    是否有一种固有的方法可以将会话设置为在特定时间后过期 我当前的设置似乎将在 30 分钟后过期 我想禁用它或至少增加它 但我在 Laravel 中找不到可以设置此设置的任何位置 In app config session php你有 life
  • 从 Rails 3 控制器返回的凌乱的视图

    在我的 Rails 3 应用程序控制器上 我有以下代码 array Location all each x array lt
  • JavaScript 中有类似 C# 区域的东西吗?视觉工作室 2017

    我正在为一些人工作 他们希望将自己的 JavaScript 库组织成不同的类别 CRUD 函数 表单函数等 他们真的很喜欢 C 中区域的实用性 并且在 JavaScript 文件中要求这样做 有什么建议么 我正在使用 Visual Stud
  • 从 php 标头下载的 Mp3 文件不起作用

    你好呀 好的 事情就这样了 我的服务器上有我的 mp3 文件 每个文件都在其自己的文件夹中 该文件夹中有 mp3 和一个包含以下脚本的 php 文件 问题是 当我点击进入该 php 页面时 标头应该会自动下载 mp3 文件 但当它下载时 它
  • 由于意外的编码更改,Visual Studio 2008 项目文件无法加载

    在我们的团队中 我们在 Visual Studio 2008 中有一个数据库项目 该项目由 Team Foundation Server 进行源代码控制 每隔两周左右 一位同事签入后 项目文件将无法加载到其他开发人员的计算机上 错误信息是
  • MVC @import html 关键字

    我正在尝试使用 但 mvc 在 razor 视图中将其视为 net 代码 CS0103 名称 导入 在当前上下文中不存在 我如何解决它 谢谢 双倍 解决这个问题 更多详情请点击这里 http weblogs asp net scottgu
  • Maven groovy 编译失败且未解释原因

    I run mvn clean compile 并得到以下输出 INFO Scanning for projects INFO INFO INFO Building tendiwa core 1 0 SNAPSHOT INFO INFO I
  • Sais.js 对套接字请求的授权

    我正在尝试构建一个基于 sails js 的聊天应用程序 来自特定聊天的消息的 URL 如下所示 api chat id messages 当我使用 XHR 请求此 url 时 它会提供一个会话 cookie 并且 sails js 会构建
  • 使用和不使用“New”关键字定义数组有什么区别? [复制]

    这个问题在这里已经有答案了 看看这两个简单的程序 方案一 public class GenArray extends Applet byte myArray byte M byte o byte d byte e byte 1 方案2 pu
  • 不同的产品风格是否可以有不同的 build.gradle ?

    我正在工作的项目是为基于 Amazon 的设备以及 Android 构建的 几乎 95 的代码库在这两者之间是通用的 因此 我没有将这两个项目作为不同的项目 而是考虑使用产品风味将这两个项目放在一起 请告诉我是否还有其他更好的解决方案 但我
  • 如何在柔性容器中设置间隙(排水沟)?

    我正在尝试创建某种柔性容器的通用组件 该组件由容器及其连续的子组件组成 如果一行中的孩子太多 没有足够空间的孩子会去第二行 它可以使用 Flexbox 轻松实现 但我也希望能够在元素之间设置装订线 一行的第一个和最后一个元素不应分别具有左边
  • 如何避免两个不同的线程从数据库读取相同的行(Hibernate 和 Oracle 10g)

    假设我有两个不同的线程 T1 和 T2 它们同时访问同一个数据库并从同一个表中获取数据 现在 在线程启动时 我需要从表中获取数据并将行存储到集合中 然后我将使用该集合在其他地方执行一些工作 我不希望两个线程能够处理相同的数据 因为这会导致重