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

JDBC批处理更新问题

翟展
2023-03-14
问题内容

对于Java-JDBC
API和Oracle数据库,我有一个稍微独特的要求。我将autoCommit设置为默认值,这对于Oracle是正确的,并且我使用的示例与此链接相似。

但是,当我添加说1000批次时,可以说每个批次都是插入的。并且让我们假设大约20条记录违反了某些约束,我希望其余980条变为COMMITTED(并且以后对使用任何其他连接的任何其他查询都可见)到数据库,并忽略20条记录。在上面的示例中,当一行违反任何事务时,
即使我在catch块中提交,事务也只会提交直到第一次失败

我知道只有在完全确定所有行都会经过且异常处理不是一个的情况下,才进行批处理更新,但是正计划修补现有数据库,因此某种“不良做法”是可以的:)任何代码示例都可以高度赞赏。

* 更多细节 *

使用简单插入/更新是不可行的,因为我正在处理接近3M的行,因此每1000条记录都会进行批处理。简单地在循环中添加1000个插入(忽略异常)会花费更多的时间(每1000条记录大约5秒),而不是批量更新<300ms。

问题:对于Oracle数据库,驱动程序似乎在第一次失败时停止,即,当批处理1000行而第100行失败时,我希望它继续到第1000行。我认为这无法在JDBC(使用Oracle)中完成,就像该链接表明只有很少的数据库支持该功能,而Oracle可能不是一个


问题答案:

我正在寻找以下解决方案:“对于Oracle数据库,驱动程序似乎在第一次失败时就停止了,即,当批处理1000行而第100行失败时,我希望它继续到第1000行。”
基本上,我想知道是否可以使用Oracle JDBC驱动程序来完成。

但是,已经提出了各种各样的答案(我已经考虑过大部分/全部)1)禁用约束/加载数据/删除有问题的行/重复多次2)在加载数据之前进行所有检查3)减少批处理大小为50-100。

不幸的是,我无法在加载并使批次大小为50或100之前进行检查,这意味着要花更多的时间来处理我拥有的5M行(实际上,总时间增加到几个小时,而不是批次大小为1000的40分钟)。我采取的措施是使批次大小保持为1000,
并按原样接受问题 ,并将代码置于“ while”循环下,然后进行操作,直到我们填满所有行。

就像我说的那样,由于在第一次失败后无法 使用ORACLE BATCH JDBC 进行操作,因此此问题的答案将为“ NOT
DOABLE”,并且仅接受约束条件并记录该工具大约需要40分钟才能完成的事实:)



 类似资料:
  • 问题内容: 我有一个dao,它基本上使用hibernate将记录插入到一​​个表中,该dao用标记为注释,并且我有一个服务,该服务会生成其他一些东西,然后调用我的dao。我的服务也标注了使用。 我叫服务循环。我在dao上的插入内容是否可以批量或一个接一个地工作?我如何确定它们可以批量工作?hibernateTransaction Manager是否管理批处理插入? 我正在使用Oracle DB。

  • 主要内容:使用Statement对象进行批处理,使用PrepareStatement对象进行批处理批量处理允许将相关的SQL语句分组到批处理中,并通过对数据库的一次调用来提交它们,一次执行完成与数据库之间的交互。 一次向数据库发送多个SQL语句时,可以减少通信开销,从而提高性能。 不需要JDBC驱动程序来支持此功能。应该使用方法来确定目标数据库是否支持批量更新处理。如果JDBC驱动程序支持此功能,该方法将返回。 ,和的方法用于将单个语句添加到批处理。 用于执行组成批量的所有语句。 返回一个整数

  • 我有一个批处理过程,它正在为一组实体重新计算数据。通过Hibernate从DB获取实体列表: 当流程运行时,某些实体似乎正在分离,导致两种症状: 当尝试获取惰性数据时,我得到一个异常: 在我的第一次尝试中,我试图通过调用inside

  • 我在我的应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。起初我不明白为什么在批处理大小=25的日志中,会生成25个查询,起初我认为它不能正常工作。但是在那之后,我查看了pg驱动程序的源代码,在Pg语句类中发现了以下几行: 在PgPreparedStatement类中 我注意到,如果批处理的大小变为25,则会发送25个查询并附带参数。 数据库日志证实了这一点,例

  • 问题内容: 我在应用程序中使用Hibernate ORM和PostgreSQL,有时我使用批处理操作。最初,我不明白为什么在批处理大小为25的日志中,会生成25个查询,并且最初认为它无法正常工作。但是之后,我查看了pg驱动程序的源代码,并在PgStatement类中找到了以下几行: 并在PgPreparedStatement类中 我注意到,事实证明,如果批处理的大小达到25,则会发送25个带有附加

  • 问题内容: 我遇到这样的情况,我想更新一些输入为复选框的数据,我在下面尝试了此代码。数据已保存在数据库中,但数据已保存在另一行中, 例如:我为BirdA选中了红色,黄色和灰色,同时为BirdD选中了黑色和蓝色。在数据库中,BirdA的颜色正确保存,但是第二只鸟的深色和蓝色保存在BirdB上( 应保存在BirdD上 ) 我想解决上面的问题,因此数据应保存在数据库中的正确位置。请在下面检查我的代码: