使用Speedment實現並行資料庫流
Speedment是開源Stream ORM Java工具包,能夠將資料庫錶轉為Java 8流,可以使用它根據現有資料庫生成POJO, 支援並行資料庫流,支援不同並行策略最佳化效能。
並行行資料庫流通常比順序流明顯快很多,Java 8為我們帶來了流Stream,Stream的一個優點是容易使得流操作並行化,獲取任何流,應用方法parallel(),我們就能得到一個並行流,而不是預設的順序流,並行流是使用 ForkJoinPool執行。
如果幾個工作任務非常松耦合無關,那麼使用並行流效果很好,將工作任務切分到幾個執行緒中執行的過程就不那麼費勁,同樣,將平行計算結果合在一起的努力也減輕一些。並行流適合CPU密集型任務。
假設資料表:
使用並行流訪問:
Speedment會使用Java預設並行行為(在Spliterators::spliteratorUnknownSize定義)對非計算密集型操作進行了最佳化,如果我們分析java的預設的並行化的行為,我們將發現它將使用第一個執行緒服務第一批1024工作專案,使用第二個執行緒為以後2 * 1024 = 2048的工作項服務,然後以此類推3 * 1024 = 3072項。
這種方式在某些情況下並不好,需要我們自己最佳化並行策略或定製ForkJoin。參考:Work with Parallel Database Streams using Java 8。
並行行資料庫流通常比順序流明顯快很多,Java 8為我們帶來了流Stream,Stream的一個優點是容易使得流操作並行化,獲取任何流,應用方法parallel(),我們就能得到一個並行流,而不是預設的順序流,並行流是使用 ForkJoinPool執行。
如果幾個工作任務非常松耦合無關,那麼使用並行流效果很好,將工作任務切分到幾個執行緒中執行的過程就不那麼費勁,同樣,將平行計算結果合在一起的努力也減輕一些。並行流適合CPU密集型任務。
假設資料表:
CREATE TABLE `prime_candidate` ( `id` int(11) NOT NULL AUTO_INCREMENT, `value` bigint(20) NOT NULL, `prime` bit(1) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB; <p class="indent"> |
使用並行流訪問:
final JavapotApplication app = new JavapotApplicationBuilder() .withPassword("javapot") // Replace with the real password .withLogging(LogType.STREAM) .build(); final Manager<PrimeCandidate> candidates = app.getOrThrow(PrimeCandidateManager.class); candidates.stream() .parallel() .filter(PrimeCandidate.PRIME.isNull()) .map(pc -> pc.setPrime(PrimeUtil.isPrime(pc.getValue()))) .forEach(candidates.updater()); <p class="indent"> |
Speedment會使用Java預設並行行為(在Spliterators::spliteratorUnknownSize定義)對非計算密集型操作進行了最佳化,如果我們分析java的預設的並行化的行為,我們將發現它將使用第一個執行緒服務第一批1024工作專案,使用第二個執行緒為以後2 * 1024 = 2048的工作項服務,然後以此類推3 * 1024 = 3072項。
這種方式在某些情況下並不好,需要我們自己最佳化並行策略或定製ForkJoin。參考:Work with Parallel Database Streams using Java 8。
相關文章
- 使用speedment以Java 8 Stream訪問資料庫Java資料庫
- 如何使用傳統資料庫思維進行實時資料流分析? – thenewstack資料庫
- 連線資料庫並實現增、刪、改、查資料庫
- 併發程式設計-7.任務並行庫(TPL)和資料流程式設計並行
- django使用多個資料庫實現Django資料庫
- CAS配置資料庫,實現資料庫使用者認證資料庫
- Oracle資料庫並行機制Parallel ExecutionOracle資料庫並行Parallel
- 使用並行執行——資料倉儲手冊並行
- 如果通過流資料實現實時分析?
- 教你如何使用flask實現ajax資料入庫Flask
- KIDataGrip連線Mysql並建立資料庫的方法實現ztpMySql資料庫
- 一個用於實現並行執行的 Java actor 庫並行Java
- 如何使用ISqlSugarClient進行資料訪問,並實現了統一的批次依賴注入SqlSugarclient依賴注入
- 亞信安慧AntDB資料並行載入工具的實現(二)並行
- 讀取mysq資料庫l資料,並使用dataview顯示資料庫View
- 資料庫上雲實踐:使用Ora2pg進行資料庫遷移資料庫
- 如何打破資料孤島,實現資料流動與共享?
- golang實現檔案上傳並轉存資料庫功能詳解Golang資料庫
- 使用 LSM Tree 思想實現一個 KV 資料庫資料庫
- 使用Spring Boot實現資料庫整合配置案例Spring Boot資料庫
- 使用當前使用者的資料庫鏈的實現資料庫
- 如何使用 Milvus 向量資料庫實現實時查詢資料庫
- 資料庫工具類實現資料庫
- golang讀取檔案的json資料流,並解析到struct,儲存到資料庫GolangJSONStruct資料庫
- Java 8 Stream並行流Java並行
- Stream並行流詳解並行
- Windows使用Apche並檢視MySQL資料庫(轉)WindowsMySql資料庫
- Flink SQL 如何實現資料流的 Join?SQL
- 用Flask實現視訊資料流傳輸Flask
- 理解 MySQL(4):並行資料庫與分割槽(Partition)MySql並行資料庫
- LLM並行訓練3-資料並行並行
- Pytorch使用資料並行,單機多卡PyTorch並行
- ItermCF的MR並行實現並行
- gin框架,讀取檔案的json資料流,並解析到struct,儲存到資料庫框架JSONStruct資料庫
- PostgreSQLdblink非同步呼叫實現並行hash分片JOIN-含資料交、並、差提速案例SQL非同步並行
- 使用Oracle Net實現限制特定IP訪問資料庫Oracle資料庫
- 使用EF 連線 資料庫 SQLserver、MySql 實現 CodeFirst資料庫ServerMySql
- Java大型資料集合實現並行加速處理幾種方法 - DZoneJava並行