SpringOne大會上釋出了一個實驗性的反應式關係型資料庫連線驅動R2DBC
在ofollow,noindex" target="_blank">SpringOne平臺華盛頓大會 上宣佈的R2DBC 是一個從頭開始設計的實驗性API,用於針對關係型資料庫進行反應式程式設計。最終目標是試圖影響ADBA 規範。
在活動中,Cloud Foundry Java Experience團隊負責人Ben Hale表示,R2DBC的設計原則是基於以下四個原則:
- 利用反應式流型別和模式;
- 訪問資料庫的整個過程完全非阻塞;
- 把驅動SPI壓縮為專門實現的最小操作集,且不管可用性;
- 基於驅動SPI實現多個“人性化”的API。
這是Hale幻燈片中的一個例子,一個簡單的Select語句:
connectionFactory.create() 返回一個Mono連線。Hale解釋說,這個呼叫的結果是,“最後,當有人訂閱,它會獲取一個連線,執行查詢,然後為每一行返回值,比如說一個整數,最終生成一個整數Flux作為結果,連線的生命週期是在訂閱時開啟、完成後關閉。”
當然,構建在SPI之上的客戶端可以對其進行進一步地簡化,Hale給出了這樣一個隱藏細節的例子:
下面是使用SPI時一個事務中的Prepared Insert的例子:
正如Hale在演講中承認的那樣,這並不是很好,但同樣可以在客戶端簡化:
有一些替代R2DBC的方法。一種方法是將JDBC封裝線上程池中,但這不會提供回壓——無界佇列將導致資源耗盡,而有界佇列將導致阻塞。另一個是ADBA。Hale謹慎地說:
我們很早就與ADBA的工作人員進行了接觸,但是,關於CompletableFuture是否真的是Reactive有很多不同的看法,所以我們放棄了,這促成了R2DBC的工作。但現在,R2DBC已經有了經過實際證明的、可以使用的API,我們再次被邀請參與進來。因此,ADBA可能會變成這樣,在某種程度上,這是像這樣一個專案的最終目標。
至於未來計劃,Hale明確表示,R2DBC是一個實驗場,雖然它足夠穩定可以使用,但絕對不能用於生產環境。需要注意的是,有很多邊緣情況,包括缺少BLOB/CLOB處理,並且目前只支援寫入一個數據庫——PostgreSQL,但是Hale希望看到面向其他資料庫的實現。他最後說:
Spring不會生成規範。我們不是規範引導者,也不管理規範。這個專案的全部目標是為了影響ADBA規範,這是最好的情況。但毫無疑問,我不是那種會容忍ADBA規範不好的人。如果他們不接受我們的建議,如果他們沒有看到Reactive與async的區別,那麼,這就是Spring團隊將要做的事情。
檢視英文原文:Experimental Reactive Relational Database Connectivity Driver, R2DBC, Announced at SpringOne