JDBC –模拟序列

也许我们每个人在程序员的生命中至少遇到过一次这个问题- 如何模拟数据库序列? 在下面,您可以找到我对这个问题的解决方案的变形。

假设我们有一个接口定义了所需的API,用于返回整数序列:

 public interface Sequences { int nextValue(String sequenceName) throws SQLException;  } 

并以以下形式实现此API:

 class SequencesService implements Sequences { private static final String SQL_QUERY = "SELECT SEQ_NAME, SEQ_VALUE FROM SEQUENCE WHERE SEQ_NAME = ? FOR UPDATE" ; private final DataSource dataSource; SequencesService( final DataSource dataSource) { this .dataSource = dataSource; } @Override public int nextValue( final String sequenceName) throws SQLException { final long threadId = Thread.currentThread().getId(); try ( final Connection connection = dataSource.getConnection()) { connection.setAutoCommit( false ); try ( final PreparedStatement statement = connection.prepareStatement( SQL_QUERY, TYPE_SCROLL_SENSITIVE, CONCUR_UPDATABLE)) { statement.setString( 1 , sequenceName); try ( final ResultSet resultSet = statement.executeQuery()) { System.out.println( String.format( "[%d] - select for update" , threadId)); int nextValue = 1 ; if (resultSet.next()) { nextValue = 1 + resultSet.getInt( 2 ); resultSet.updateInt( 2 , nextValue); resultSet.updateRow(); } else { resultSet.moveToInsertRow(); resultSet.updateString( 1 , sequenceName); resultSet.updateInt( 2 , nextValue); resultSet.insertRow(); } System.out.println( String.format( "[%d] - next val: %d" , threadId, nextValue)); return nextValue; } } finally { System.out.println(String.format( "[%d] - commit" , threadId)); "[%d] - commit" , threadId)); connection.commit(); } } }  } 

您必须原谅我两件事:) –我添加println的用法是为了生成一些视觉反馈;)并且缺少详细的解释说明此解决方案的工作原理;)我只想提一下线索是准备好的语句的处理方式创建并处理结果集:updateRow / moveToInsertRow / insertRow用法;)(有关详细信息,请参见本文底部的链接)。

我编写了简单的测试用例来观察和验证此代码,例如:

 @Autowired  private Sequences sequences;  private Callable<Integer> callable() { return () -> { System.out.println(String.format( "[%d] - starting" , Thread.currentThread().getId())); "[%d] - starting" , Thread.currentThread().getId())); return sequences.nextValue( "My Sequence" ); };  }  @Test  public void test() throws Exception { final ExecutorService executor = Executors.newFixedThreadPool( 3 ); final CompletionService<Integer> completion = new ExecutorCompletionService<>(executor); for ( int i = 0 ; i < 3 ; i++) { completion.submit(callable()); }     for ( int completed = 1 ; completed <= 3 ; completed++) { final Future<Integer> result = completion.take(); System.out.println(String.format( "Result %d - %d" , completed, result.get())); assertEquals(Integer.valueOf(completed), result.get()); }  } 

运行上述代码时,输​​出将如下所示(括号中为线程的ID):

[16] –开始 [18] –开始 [17] –开始 [17] –选择要更新 [17] –下一个值:1 [17] –提交 [18] –选择要更新 结果1-1 [18] –下一个值:2 [18] –提交 [16] –选择要更新 [16] –下一个值:3 [16] –提交 结果2 – 2 结果3 – 3

这段代码仅用于演示目的:) –如果您想在项目中执行类似的操作,则可能更希望将其用于ex。 Spring Framework的@Transactional批注,而不是手动的事务处理,甚至JPA都将这项工作委托给JDBC。 例如,在Hibernate中,您可以这样进行操作:

 import org.hibernate.Session;  ...  entityManager.unwrap(Session. class ) .doReturningWork(connection -> { ... code derived from my example ... }); 

甜点的几个链接:

  • 更新ResultSet对象(JDBC)中的行
  • 在ResultSet对象(JDBC)中插入行
  • 声明式事务管理和使用@Transactional (Spring Framework)
  • ReturningWork(JPA,休眠)

…,我差点忘了;)– GitHub存储库保存了我所有的这篇文章的代码经验

翻译自: https://www.javacodegeeks.com/2019/08/jdbc-emulating-sequence.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么安装协议转换器?协议转换器安装方法解析

协议转换器是有很多种的&#xff0c;多数基本上是个2层设备&#xff0c;经常碰见的一种RAD的协议转换器是将2M的E1线路转换成V.35的数据线路连接路由器的设备&#xff0c;当然也有&#xff0c;2M转双绞线以太的&#xff0c;借助2M通信线路可以实现局域网范围的远程接入和扩大。…

关于协议转换器的分类以及工作原理的详细介绍

现如今&#xff0c;随着互联网的广泛应用&#xff0c;我们国内的网民也是突破了8.29亿&#xff0c;相信&#xff0c;大家对于网络这块是非常的熟悉了&#xff0c;它是一种虚拟的东西&#xff0c;但是它几乎存在于我们生活的各个角落&#xff0c;在很大程度的让我们的日常生活变…

ElasticSearch-Hadoop:从Hadoop到ElasticSearch索引产品视图计数和客户顶部搜索查询

这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引。 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查询编制索引。 可以在网站上进一步使用分析后的数据来显示最近浏览过的客户&#xff0c;产品浏览次数和热…

协议转换器是怎么分类的?主要有哪些类别?

工业通信采用的通信接口各不相同&#xff0c;需要多个设备之间的信息共享和数据交换&#xff0c;而常用的工控设备通信口有RS-232、RS-485、CAN和网络&#xff0c;由于各种通信结构的协议不兼容&#xff0c;使得异构网络之间的操作和信息交换难以进行&#xff0c;通过多协议转换…

Java中的8种原始类型

几年前&#xff0c;当我开始编辑Java Basics系列时&#xff0c;我认为将一些非常详细的信息拉到自己的帖子中是很有意义的。 这样&#xff0c;初学者的内容就更容易消化。 首先&#xff0c;我要介绍有关Java的8种原始类型的所有信息。 Java基本类型 正如本文标题所暗示的&…

协议转换器的特点有哪些?

现如今&#xff0c;随着计算机网络技术的迅猛发展&#xff0c;我们建立了大量的多种多样的网络系统&#xff0c;导致各种网络之间如何互连的问题。一个办法是推行国际标准&#xff0c;051网络体系结构及通信协议的国际标准已越来越成熟。但是&#xff0c;要把大量已存在的非051…

协议转换器的作用有哪些?

协议转换器一般用一个ASIC芯片就可以完成&#xff0c;成本低&#xff0c;体积小。它可以将IEEE802.3协议的以太网或V.35数据接口同标准G.703协议的2M接口之间进行相互转换。也可以在232/485/422串口和E1、CAN接口及2M接口进行转换&#xff0c;那么协议转换器的作用有哪些呢&…

协议转换器主要是应用在哪些地方?

协议转换器也叫接口转换器&#xff0c;它能使处于通信网上采用不同高层协议的主机仍然互相合作&#xff0c;完成各种分布式应用&#xff0c;它工作在传输层或更高。那么&#xff0c;协议转换器的作用有哪些呢&#xff1f;主要是应用在什么地方的呢&#xff1f;接下来就跟随飞畅…

java中布尔值做比较_Java中的三态布尔值

java中布尔值做比较我不时地错过Java中SQL的三值BOOLEAN语义。 在SQL中&#xff0c;我们有&#xff1a; TRUE FALSE UNKNOWN &#xff08;也称为NULL &#xff09; 时不时地&#xff0c;我希望自己也可以用Java表达这种UNKNOWN或UNINITIALISED语义&#xff0c;而普通的true…

Spring Bean范围

介绍&#xff1a; Spring核心容器实例化bean并管理其生命周期。 在定义bean时&#xff0c;我们可以提供其范围。 除非明确提供&#xff0c;否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中&#xff0c;我们将探讨它们中的每一个。 1.…

协议转换器指示灯的含义

很多对协议转换器了解不是很深的朋友&#xff0c;对协议转换器上面的各个指示灯可能会区分不清&#xff0c;很多情况下会搞不清各个指示灯的含义&#xff0c;接下来杭州飞畅科技的小编就来带大家详细了解下协议转换器上各个指示灯的含义&#xff0c;一起来看看吧&#xff01; …

V.35协议转换器指示灯告警常见故障以及排除方法解析

我们在使用协议转换器的时候&#xff0c;可能常常会遇到一些故障问题&#xff0c;这个可能会困扰到很多朋友&#xff0c;在这里&#xff0c;杭州飞畅的小编专门整理了V.35系列协议转换器在使用过程中的一些常见的故障问题及解决方法&#xff0c;感兴趣的朋友可以一起来看看吧&a…

飞畅科技V.35协议转换器指示灯告警说明详细介绍

飞畅V.35系列协议转换器实现了E1接口与V.35接口之间的相互转换&#xff0c;是杭州飞畅科技推出的又一款广泛使用、备受好评的设备。此转换器的E1接口支持成帧和透明两种模式&#xff0c;广泛应用于计算机网络互连、DDN数据网接入、移动电话网的传输优化和基于E1的PCM网络的各种…

计算机图形学论文_论图计算

计算机图形学论文自从机械计算开始以来&#xff0c;图形概念就已经存在&#xff0c;并且在纯数学领域已经存在了数十年。 由于数据库的黄金时代&#xff0c;图形在软件工程中变得越来越流行。 图形数据库提供了一种持久化和处理图形数据的方法。 但是&#xff0c;图形数据库并不…

2M线路保护实现与应用

由于传输电路是出于最底层的物理传送平面&#xff0c;目前这些传输电路调度工作仍然停留在手工调度&#xff0c;即耗费大量的人力物力&#xff0c;又花费大量的宝贵时间&#xff0c;尤其在紧急故障发生的时候&#xff0c;严重影响故障的抢修速度&#xff0c;从而影响通信网络恢…

只能在测试中注射吗?

本文是关于测试设计和可测试性的一些想法。 我们与我的儿子讨论了一些问题&#xff0c;他的儿子是Java的初级开发人员&#xff0c;目前在匈牙利的EPAM&#xff08;我工作的同一家公司&#xff0c;但在另一家子公司&#xff09;工作和学习。 本文中的所有内容都是不错的旧知识&a…

E1倒换保护设备知识详解

E1倒换是一款针对于国内重要部门而开发的保护设备&#xff0c;针对某些重要用户要求&#xff0c;E1倒换设备除了可以满足主、备两个传输路由间无损伤自动切换外&#xff0c;还可以满足主、备用户设备间自动切换。那么&#xff0c;什么是E1倒换&#xff0c;E1倒换保护怎么分类&a…

E1 PCM复用设备常见故障及处理方法

目前国内PCM设备技术发展非常迅速&#xff0c;PCM设备在通信系统中也是使用最多最常用到的。但是不少用户在使用PCM设备时会遇到各种故障&#xff0c;那么&#xff0c;我们该如何解决呢&#xff1f;接下来就由飞畅科技的小编来为大家介绍下E1 PCM复用设备常见故障及处理方法。 …

jooq中record_在Spring中使用jOOQ:CRUD

jooq中recordjOOQ是一个库&#xff0c;可帮助我们重新控制SQL。 它可以从我们的数据库生成代码&#xff0c;并允许我们使用其流畅的API来构建类型安全的数据库查询。 本教程前面的部分向我们介绍了如何配置示例应用程序的应用程序上下文以及如何从数据库中生成代码。 现在&am…

E1 PCM复用设备作用

Pulse Code Modulation&#xff08;PCM&#xff09;&#xff0c;中文称脉码调制或PCM复用设备&#xff0c;PCM复用设备的目的就是使交换机之间一条中继线不是只传送一条电话信号。 PCM复用设备也就是将语音&#xff0c;数据信号复接成2M信号的设备&#xff0c;直白一点就是将如…