java获取oracle序列_java – 如何在分布式环境中预取Oracle序列ID-s

我有一个在5个应用服务器上运行的分布式

Java应用程序服务器都使用在第6台机器上运行的相同Oracle 9i数据库.

应用程序需要从序列中预取一批100个ID.在单线程,非分布式环境中相对容易,您可以发出以下查询:

select seq.nextval from dual;

alter sequence seq increment by 100;

select seq.nextval from dual;

第一个选择获取应用程序可以使用的第一个序列ID,第二个选择返回可以使用的最后一个序列ID.

在多线程环境中,事情变得更加有趣.你不能确定在第二次选择之前另一个线程不会再次将序列增加100.这个问题可以通过同步Java端的访问来解决 – 你只让一个线程一次开始获取ID.

当您无法同步时情况变得非常困难,因为应用程序的某些部分不在同一个JVM上运行,即使在同一台物理机器上也不运行.我在论坛上发现了一些其他人在解决这个问题时遇到问题的参考资料,但没有一个答案真正起作用,更不用说合理了.

社区可以为这个问题提供解决方案吗?

更多信息:

>我无法真正使用事务隔离级别.我使用JPA并且更改会影响整个应用程序,而不仅仅是预取查询,这对我来说是不可接受的.

>在Postgresql上我可以做到以下几点:

select setval(‘seq’,nextval(‘seq’)n – 1)

>当你可以使用固定的增量值(在我的情况下完全可以接受)时,马修的解决方案就可以了.但是,如果您不想修改增量的大小,但想要动态调整它,是否有解决方案?

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值