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如何使您非常輕松地定義本地緩存范圍,請繼續關注! 
翻譯自: https://www.javacodegeeks.com/2014/02/java-8-friday-goodies-local-transaction-scope.html
q7goodies事例
總結
以上是生活随笔為你收集整理的q7goodies事例_Java 8 Friday Goodies:本地交易范围的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 为什么电脑打不开新浪微博(电脑新浪微博打
 - 下一篇: 电脑主题windows7(电脑主题壁纸)