日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

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

發布時間:2023/12/3 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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事例

總結

以上是生活随笔為你收集整理的q7goodies事例_Java 8 Friday Goodies:本地交易范围的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。