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事例

q7goodies事例_Java 8 Friday Goodies:本地交易范围相关推荐

  1. q7goodies事例_Java 8 Friday Goodies:轻松派本地缓存

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  2. q7goodies事例_Java 8 Friday Goodies:Lambda和排序

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  3. q7goodies事例_Java 8 Friday Goodies:SQL ResultSet流

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  4. q7goodies事例_Java 8 Friday Goodies:新的新I / O API

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  5. q7goodies事例_Java 8 Friday Goodies:Lambda和SQL

    q7goodies事例 在 Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢 jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. ...

  6. q7goodies事例_Java 8 Friday Goodies:java.io终于成功了!

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  7. q7goodies事例_Java 8 Friday Goodies:精益并发

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  8. q7goodies事例_Java 8 Friday Goodies:Lambda和XML

    q7goodies事例 在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们 ...

  9. Java 8 Friday Goodies:本地交易范围

    在Data Geekery ,我们喜欢Java. 而且,由于我们真的很喜欢jOOQ的流畅的API和查询DSL ,我们对Java 8将为我们的生态系统带来什么感到非常兴奋. 我们已经写了一些关于Java ...

最新文章

  1. 年收入百万美元AI科学家的烦恼与思考
  2. android 获取权限管理,Android常用权限获取和设置
  3. myeclipse10.1破解方法
  4. dc/os_DC / OS中具有Java和数据库应用程序的服务发现
  5. android 编译faac,faac 移植到android
  6. oracle的表连接-内外连接
  7. 有趣的JavaScript数组
  8. yii操作数据库(AR)
  9. JavaScript黑魔法:不可阻止的“自动下载”
  10. 新国二选office和c语言,备考全国计算机二级MS Office考试这些你知道吗?
  11. CentOS7中Docker安装mysql主从复制、日常排错
  12. DSP2812入门1——开始学习与开发
  13. html页面加载蒙版,HTML / CSS - 在图像上创建alpha蒙版
  14. Unity小地图制作与美化
  15. java连接云服务Hadoop伪分布式错误:Call From LAPTOP-14BPR3NI/192.168.1.2 to node1:9000 failed on connection
  16. RAID磁盘阵列详解与维护
  17. wifi打印服务器方案USB共享打印机模块参考设计
  18. 计算机教学学期小结,学年第一学期信息技术教学工作总结
  19. you-get下载b站选集_Flash选集:酷炫效果和实用的ActionScript-第1章:Flash基本知识
  20. 傅里叶变换与不确定性

热门文章

  1. bzoj 2908. 又是nand(树链剖分+区间NAND+单点修改)
  2. 一次频繁Full GC的排查过程,根源居然是它...
  3. Spring 注入内部 Beans
  4. java各种集合的线程安全
  5. Java IO: FileOutputStream
  6. (十)Spring 与 MVC 框架整合
  7. JSP的四大作用域和九大内置对象
  8. 转:微服务设计、拆分原则
  9. 使用log4j2打印mybatis的sql执行日志
  10. java安全——数字签名+代码签名