q7goodies事例_Java 8 Friday Goodies:本地交易范围

q7goodies事例

在Data Geekery ,我们喜欢Java。 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋。 我们已经写了一些关于Java 8好东西的博客 ,现在我们觉得是时候开始一个新的博客系列了,……

Java 8星期五

每个星期五,我们都会向您展示一些不错的教程风格的Java 8新功能,这些功能利用了lambda表达式,扩展方法和其他出色的功能。 您可以在GitHub上找到源代码 。

Java 8 Goodie:本地事务范围

JavaScript人士经常滥用匿名函数来创建本地范围。 像任何其他语言功能一样,这可能会被滥用 ,但是在某些情况下,本地作用域确实很棒。 Java还允许本地作用域,尽管在Java 8之前,这同样麻烦:

JavaScript

(function() {var local = function() { scoping(); },scoping = function() { alert('If you really must');};local();
})();

Java

new Object() {void local() {scoping();}void scoping() {System.out.println("Ouch, my fingers. Too much typing");}
}.local();

尽管JavaScript人士将其称为设计模式,但两个示例看起来都非常尴尬。 即使这两段代码大致相等,也没人会在Java中创建这样的本地范围。

尴尬可以是JavaScript中的一种设计模式。

Java 8中的本地作用域

但是,对于Java 8,一切都会改变,本地作用域也会改变。 让我们看一下如何为事务创建本地语义范围。 为此,我们将创建两种类型。 事务接口:

@FunctionalInterface
interface Transactional {void run(DSLContext ctx);
}

对于该示例,我们将使用jOOQ来避免检查异常和冗长的语句创建。 您可以用您选择SQL API替换它。 因此,jOOQ为我们提供了一个本地范围内的ctx对象,该对象隐式包含了事务状态。 使用TransactionRunner生成此事务状态:

class TransactionRunner {private final boolean silent;private final Connection connection;TransactionRunner(Connection connection) {this(connection, true);}TransactionRunner(Connection connection,boolean silent) {this.connection = connection;this.silent = silent;}void run(Transactional tx) {// Initialise some jOOQ objectsfinal DefaultConnectionProvider c =new DefaultConnectionProvider(connection);final Configuration configuration =new DefaultConfiguration().set(c).set(SQLDialect.H2);try {// Run the transaction and pass a jOOQ// DSLContext object to ittx.run(DSL.using(configuration));// If we get here, then commit the// transactionc.commit();}catch (RuntimeException e) {// Any exception will cause a rollbackc.rollback();System.err.println(e.getMessage());// Eat exceptions in silent mode.if (!silent)throw e;}}
}

上面是框架代码,我们只编写一次。 从现在开始,我们可以在Java程序中轻松使用上述API。 为此,我们将像这样设置一个TransactionRunner:

public static void main(String[] args) 
throws Exception {Class.forName("org.h2.Driver");try (Connection c = DriverManager.getConnection("jdbc:h2:~/test-scope-goodies", "sa", "")) {c.setAutoCommit(false);TransactionRunner silent = new TransactionRunner(c);// Transactional code here ...}
}

现在,请看Java 8的奇观!

// This is a transaction
silent.run(ctx -> {ctx.execute("drop table if exists person");ctx.execute("create table person(" + "  id integer," +"  first_name varchar(50)," +"  last_name varchar(50)," +"  primary key(id)"+")");
});// And this is also one transaction
silent.run(ctx -> {ctx.execute("insert into person" +"  values(1, 'John', 'Smith');");ctx.execute("insert into person" +"  values(1, 'Steve', 'Adams');");// Ouch, fails -------^// Transaction rolls back
});// And this is also one transaction
silent.run(ctx -> {ctx.execute("insert into person" + "  values(2, 'Jane', 'Miller');");// Works, yay!
});// And this is also one transaction
silent.run(ctx -> {ctx.execute("insert into person" +"  values(2, 'Anne', 'Roberts');");// Ouch, fails -------^// Transaction rolls back
});

从上面我们能得到什么? 让我们检查:

silent.run(ctx -> {System.out.println(ctx.fetch("select * from person"));
});

上面的程序将产生以下输出:

SQL [insert into person values(1, 'Steve', 'Adams');];
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.PERSON(ID)"; SQL statement:
insert into person values(1, 'Steve', 'Adams'); [23505-174]
SQL [insert into person values(2, 'Anne', 'Roberts');];
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.PERSON(ID)"; SQL statement:
insert into person values(2, 'Anne', 'Roberts'); [23505-174]
+----+----------+---------+
|  ID|FIRST_NAME|LAST_NAME|
+----+----------+---------+
|   2|Jane      |Miller   |
+----+----------+---------+

因此,我们的提交和回滚按预期工作!

嵌套交易

我们还可以创建对TransactionRunner的嵌套调用,例如,当我们在调用其他方法的方法内部时。 为此,必须调整我们的TransactionRunner以计算嵌套级别,并删除“静音”功能。 另一方面,以这种方式实现保存点功能将非常容易。 每次嵌套另一个事务时,我们都会创建一个新的保存点。

结论

与本系列一样,我们没有发明任何新东西。 所有这些事情都可以通过香草Java 7完成。但是,这个TransactionRunner的客户端代码肯定不会像我们的lambda那样精简。

在本系列博客的下周,我们将研究Java 8如何使您非常轻松地定义本地缓存范围,请继续关注!

参考: Java 8 Friday Goodies:我们的JCG合作伙伴 Lukas Eder在JAVA,SQL和JOOQ博客上的本地交易范围 。

翻译自: https://www.javacodegeeks.com/2014/02/java-8-friday-goodies-local-transaction-scope.html

q7goodies事例

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

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

相关文章

以太网交换机和路由器的区别,二者有共同点吗?

您知道以太网交换机和路由器有什么不同吗?在osi七层模型上来分析,交换机在第二层工作,路由器在第三层上工作。交换机查找某一台电脑的方式是通过查找mac地址,就是通过您网卡上固有的一个唯一识别编号来进行查找的。路由器查找一台…

【渝粤教育】国家开放大学2018年春季 3780-22T燃气设备操作与维护 参考试题

科目编号:3780 座位号 2017-2018学年度第二学期期末考试 燃气设备操作与维护 试题 2018年 7 月 一、判断题(本大题共10小题,每题2分,共计20分) 1.绝对压力低于大气压力时,用真空表测的的压力称…

【渝粤教育】国家开放大学2018年春季 7067-21T康复护理学 参考试题

编号:7067 座位号 2017~2018学年度第二学期期末考试 康复护理学试题 2018年07月 一、名词解释(4小题,每题5分,共20分) 康复护理学 神经系统的可塑性 代谢当量 小脑性共济失调步态 二、填空 &#xff…

工业以太网交换机有多少个快速以太网接口?

工业以太网交换机应用于复杂的工业环境中实时以太网数据传输,以太网交换机是非常的重要,它把握着一个网络的命脉,有人会提出以太网交换机有多少个快速以太网接口?到底该如何进行选择呢?接下来我们就跟随飞畅科技的小编…

git粘贴命令行_如何使用git检测复制和粘贴代码?

我只是再次阅读 git-blame手册页,注意到这部分:A particularly useful way is to see if an added file has lines created by copy-and-paste from existing files. Sometimes this indicates that the developer was being sloppy and did not refactor the code …

有关Spring缓存性能的更多信息

这是我们最后一篇关于Spring的缓存抽象的文章的后续文章 。 作为工程师,您可以通过了解所使用的某些工具的内部知识来获得宝贵的经验。 了解工具的行为有助于您在做出设计选择时变得更加成熟。 在这篇文章中,我们描述了一个基准测试实验和结果&#xff…

【渝粤教育】国家开放大学2018年春季 7394-22T政府公共关系 参考试题

试卷编号:7394 座位号 2017——2018学年度第二学期期末考试 政府公共关系试题 2018年7月 一、单选题(每空2分,共30分) 政府公共关系以塑造良好形象和获得公众支持为( ) 。 A. 途径 B. 主体 C. 客体 D. 目标政府公共关系客体的复…

【渝粤教育】国家开放大学2018年春季 8126-21T制药工程 参考试题

编号:8126 座位号 2017~2018学年度第二学期期末考试 制药工程试题 2018年5月 一、名词解释(本大题共4小题,每题5分,共20分)。 生物技术药物 干燥 天然药物 制药工程设计 二、单项选择题(本…

PoE交换机如何才能稳定连接和安全使用?

随着PoE技术的不断发展,PoE交换机目前已经处于非常成熟的阶段,但是由于目前监控市场迫于成本的压力,选用的PoE交换机或者线材品质过于低劣,或者方案设计本身不合理,就会导致采用PoE供电的项目维护的工作量特别大&#…

java判断是否第一次出现_利用java判断字符首次出现的位置,java替换最后一个特定字符...

利用java判断字符首次出现的位置利用爪哇判断字符首次出现的位置,目的:(学习视频分享:java视频教程实现代码如下:导入Java。util。收藏品;导入Java。util。LinkedList导入Java。util。列表;导入Java。util。…

javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第3部分

javafx 自定义控件嗨,经过与同事的讨论,我今天决定展示css方法并不是唯一可用于创建自定义控件的方法。 当然,它允许提供一些外观扩展点,但是可以使用代码API使用相同的方法(与向JavaFX的转换)一起使用。 …

【渝粤教育】国家开放大学2018年春季 8625-21T老年心理健康 参考试题

编号:8625 座位号 2017~2018学年度第二学期期末考试 老年心理健康试题 2018年7月 一、名词解释(本大题共6小题,每题5分,共30分) 分神: 选择性思维迟滞: 记忆减退: 注…

【渝粤教育】国家开放大学2018年春季 8659-22T计算机平面设计(1)(2) 参考试题

编号:8659 2017-2018学年度第二学期期末考试 计算机平面设计(1)(2) 试题 2018年5月 一、单项选择题(共 10 小题,每小题4分,共 40 分) 当使用绘图工具时&…

java开发事故如何处理_记一次缓存事故

善于总结,才能更快进步通常,我们队高并发的数据都会进行缓存,而且为了防止缓存过大,通常我们都会把缓存设置一个超时时间,并且会有cache miss机制。本文,我记录一下错误的缓存机制引起的BUG。起因好好的一个…

导轨式网管型工业交换机优势具体在哪里呢?

通过之前的介绍,我们了解到工业交换机可以分为导轨式和机架式、网管型和非网管型结构,那么,导轨式网管型工业交换机具体有哪些优势呢?接下来就由杭州飞畅科技的小编带大家详细了解一下 ,一起来看看吧! 工业…

使用HTTPS和OAuth 2.0保护服务到服务的Spring微服务

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。 如果您使用Spring Boot,Spring Cloud和Spring Cloud Config,则…

【渝粤教育】国家开放大学2018年秋季 0017-22T大学英语 参考试题

科目编号:0033 座位号 2018-2019学年度第一学期期末考试 工程数学 试题 2018年 11 月 单选题(本大题共10小题,每小题4分,共计40分) 1.设都是阶矩阵,则下列命题正确的是( &#xff…

【渝粤教育】国家开放大学2018年秋季 0107-21T现代货币金融学 参考试题

科目编号:0133 座位号 2018-2019学年度第一学期期末考试 大学物理 试题 2018年 11 月 单选题(本大题共5小题,每小题4分,共计20分) 静电场的高斯定理表明,静电场是 。 A. 有源场 B. 无源场 C. 保守力场 D.…

java session 同步_session同步

对于大型分布式网站来说,一个业务后面往往对应着多台服务器。用户的请求将在不同的服务器之间进行跳转,这样的情形下,我们就需要保持session在不同服务器之间的同步。1、基于数据库的session共享。原理:使用数据库专门用来存储ses…

二层网络和三层网络的区别

大家经常可以听到二层网络、三层网络的说法,我们这里提到的二层、三层是按照逻辑拓扑结构进行的分类,并不是ISO七层模型中的数据链路层和网络层,而是指核心层、汇聚层和接入层。这三层都部署的就是三层网络结构,二层网络结构没有汇…