sql 解析 java_将Java 8流解析为SQL
sql 解析 java
當Java 8發行并且人們開始流式處理各種東西時,不久之后他們就開始想象如果可以以相同的方式使用數據庫將有多大的潛力。 本質上,關系數據庫由以表狀結構組織的巨大數據塊組成。 這些結構非常適合進行過濾和映射操作,如SQL語言的SELECT,WHERE和AS語句所示。 人們最初做的事情(包括我在內)是向數據庫詢問大量數據,然后使用新的炫酷Java 8流處理這些數據。
很快出現的問題是,僅將所有行從數據庫移到內存的等待時間就花費了太多時間。 結果是,使用內存中的數據沒有太多收益。 即使您可以使用新的Java 8-tools真正搞怪高級功能,但由于性能開銷,這種優勢并沒有真正應用到數據庫應用程序中。
當我開始致力于Speedment Open Source項目時,我們很快意識到使用Java 8路數據庫的潛力,但是我們確實需要一種智能的方式來處理此性能問題。 在本文中,我將向您展示我們如何使用Stream API的自定義委托人來解決此問題,以在后臺處理流,并優化生成SQL查詢。
假設您在遠程主機上的數據庫中有一個表User,而您想打印出所有70歲以上用戶的名字。 使用Speedment做到這一點的Java 8方法是:
final UserManager users = speedment.managerOf(User.class); users.stream().filter(User.AGE.greaterThan(70)).map(User.NAME.get()).forEach(System.out::println);看到此代碼可能會在一開始讓您不寒而栗。 我的程序會從數據庫下載整個表并在客戶端中對其進行過濾嗎? 如果我有1億用戶怎么辦? 網絡延遲足以殺死應用程序! 嗯,實際上不是,因為正如我之前所說,Speedment在終止之前會分析流。
讓我們看看幕后發生的事情。 UserManager中的.stream()方法返回Stream接口的自定義實現,該接口包含有關該流的所有元數據,直到該流關閉為止。 終止操作可以使用該元數據來優化流。 調用.forEach時,管道將如下所示:
終止操作(在這種情況下,ForEach隨后將開始向后遍歷管道以查看是否可以優化。首先,它遇到了從User到String的映射。由于User.NAME字段,Speedment將其識別為Getter函數。可以將Getter解析為SQL,因此將終止操作切換為NAME列的Read操作,并刪除map操作。
接下來是.filter操作。 過濾器也被識別為自定義操作,在這種情況下為謂詞。 由于這是一個自定義實現,因此它可以包含在SQL查詢中使用它所需的所有必要元數據,因此可以安全地從流中將其刪除并附加到Read操作中。
現在,當終止操作查找管道時,它將找到流的源。 到達源后,將把Read操作解析為SQL并提交給SQL管理器。 然后,將使用原始的.forEach使用者終止生成的Stream <String>。 為上面顯示的確切代碼生成SQL是:
SELECT `name` FROM `User` WHERE `User`.`age` > 70;Java代碼中無需使用任何更改或特殊操作!
這是一個簡單的示例,說明如何通過使用Speedment中的自定義實現在執行之前簡化流。 歡迎您查看源代碼,并找到使用此技術的更好方法。 它確實幫助我們提高了系統性能,并且可能適用于任何分布式Java-8方案。
直到下一次!
翻譯自: https://www.javacodegeeks.com/2016/02/parsing-java-8-streams-sql.html
sql 解析 java
總結
以上是生活随笔為你收集整理的sql 解析 java_将Java 8流解析为SQL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac系统与linux系统(mac系统与
- 下一篇: java不可变类型_Java中的值类型: