当前位置: 首页 > 面试题库 >

JPA并发问题“在发布批处理时,它仍然包含JDBC语句”

谭鹏云
2023-03-14
问题内容

我有一个并发问题,我尝试通过while循环来解决,该循环尝试多次保存实体,直到达到某个最大重试次数。我想避免谈论是否还有其他方法可以解决此问题。我还有其他关于此的Stackoverflow帖子。:)长话短说:在派生的列上有一个唯一约束,其中包括一个数字部分,该数字部分不断增加以避免冲突。在一个循环中,我:

  1. 选择最大(some_value)
  2. 增加结果
  3. 尝试使用此新结果保存新对象
  4. 显式刷新实体,如果由于唯一索引而失败,则捕获DataAccessException。

除了循环返回到步骤1并尝试选择时,所有这些似乎都有效,我得到:

17:20:46,111 INFO  [org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl] (http-localhost/127.0.0.1:8080-3) HHH000010: On release of batch it still contained JDBC statements
17:20:46,111 INFO  [my.Class] (http-localhost/127.0.0.1:8080-3) MESSAGE="Failed to save to database. Will retry (retry count now at: 9) Exception: could not execute statement; SQL [n/a]; constraint [SCHEMA_NAME.UNIQUE_CONSTRAINT_NAME]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement"

并且捕获了一个新的异常。似乎是第一次刷新会导致唯一约束违例并抛出,DataAccessException不会清除实体管理器的批处理。解决这个问题的合适方法是什么?我在JPA上使用Spring,但是没有直接访问实体管理器的权限。我想我可以在需要时注射它,但这对这个问题是一个痛苦的解决方案。


问题答案:

您无法执行此操作-
刷新某些内容后,如果失败并且抛出异常,则该事务将被标记为回滚。这意味着捕获异常并继续操作并不重要,最终将导致回滚。实际上,抛出什么异常根本没有关系-
默认情况下,Spring的事务管理器将回滚每个 未检查的
异常。您可以通过noRollbackFor@Transactional注释上专门定义a来克服它(假设您正在使用注释驱动程序事务)


编辑-如果违反此约束,它也无济于事,因为该事务可能会在数据库级别标记为回滚。



 类似资料:
  • 问题内容: 对于Java-JDBC API和Oracle数据库,我有一个稍微独特的要求。我将autoCommit设置为默认值,这对于Oracle是正确的,并且我使用的示例与此链接相似。 但是,当我添加说1000批次时,可以说每个批次都是插入的。并且让我们假设大约20条记录违反了某些约束,我希望其余980条变为COMMITTED(并且以后对使用任何其他连接的任何其他查询都可见)到数据库,并忽略20条

  • 本文向大家介绍JavaScript多并发问题如何处理,包括了JavaScript多并发问题如何处理的使用技巧和注意事项,需要的朋友参考一下 经常在写代码的时候碰到这样的场景:页面初始化时显示loading页,同时启动多个ajax并发请求获取数据,当每个ajax请求返回时结束loading。 举个例子,一个下订单的页面,要查询常用地址信息、商品信息、地市信息…而这些请求都是异步的,希望等到所有数据加

  • 发布处理原理 Erlang编程语言的一个很重要的特点是能在运行时变更模块代码,即Erlang参考手册中所描述的代码替换。 基于这个功能,OTP应用SASL提供了一个用于在运行时对整个发布的不同版本之间进行升级和降级的框架。这就是我们称之为发布处理的东西。 该框架由用于生成脚本和构建发布包的离线支持工具( systools )和用于解压和安装发布包的在线支持工具( release_handler )

  • 问题内容: 我正在编写一个程序来处理文本文件中的数百万行,500k耗时5秒来验证文件,我想加快速度。 我想遍历所有项目并异步处理它们中的x,然后等待响应以查看是否应该继续。 我已经写了一些伪代码,我不确定我写的内容是否有意义,这看起来似乎很复杂,是否有更简单,更优雅的方法来做到这一点。 问题答案: 您的代码看起来不错,您实现了Go模式中常用的代码。缺点是- 您为每个项目生成工作程序goroutin

  • 我用的是微软Visual Studio 2015,我用C#联系人表单搭建了一个简单的网站。当我在localhost上编译和运行时,它工作得非常好。然而,当我试图在smarterasp.net上发布它时,我得到了一个错误: [Win32Exception(0x80004005):访问被拒绝] [外部异常 (0x80004005): 无法执行程序。正在执行的命令是“..\bin\roslyn\csc.

  • 我试图通过一个web url(Servlet/Spring MVC)触发一个批处理作业,当从主程序启动时,该url可以很好地工作。当我启动web服务器并点击url时,程序会给我一个异常,即jobLauncher未解析。 这是我完美工作的配置,批处理配置,主程序。我在这里通过servlet调用spring批处理 11:02:37.206[TOMCAT-HTTP-24]DEBUG o.s.web.se