使用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。
相關文章
- 如何使用傳統資料庫思維進行實時資料流分析? – thenewstack資料庫
- 連線資料庫並實現增、刪、改、查資料庫
- 併發程式設計-7.任務並行庫(TPL)和資料流程式設計並行
- django使用多個資料庫實現Django資料庫
- CAS配置資料庫,實現資料庫使用者認證資料庫
- KIDataGrip連線Mysql並建立資料庫的方法實現ztpMySql資料庫
- 使用Spring Boot實現資料庫整合配置案例Spring Boot資料庫
- 教你如何使用flask實現ajax資料入庫Flask
- 如何使用 Milvus 向量資料庫實現實時查詢資料庫
- 資料庫上雲實踐:使用Ora2pg進行資料庫遷移資料庫
- 如果通過流資料實現實時分析?
- 如何使用ISqlSugarClient進行資料訪問,並實現了統一的批次依賴注入SqlSugarclient依賴注入
- golang讀取檔案的json資料流,並解析到struct,儲存到資料庫GolangJSONStruct資料庫
- 使用EF 連線 資料庫 SQLserver、MySql 實現 CodeFirst資料庫ServerMySql
- 使用 LSM Tree 思想實現一個 KV 資料庫資料庫
- 亞信安慧AntDB資料並行載入工具的實現(二)並行
- golang實現檔案上傳並轉存資料庫功能詳解Golang資料庫
- Pytorch使用資料並行,單機多卡PyTorch並行
- Flink SQL 如何實現資料流的 Join?SQL
- gin框架,讀取檔案的json資料流,並解析到struct,儲存到資料庫框架JSONStruct資料庫
- Sqlserver2016啟用了日誌並行,但是實際上某些資料庫日誌並行並沒有生效的問題SQLServer並行資料庫
- 如何打破資料孤島,實現資料流動與共享?
- Java大型資料集合實現並行加速處理幾種方法 - DZoneJava並行
- 使用cglib實現資料庫框架的級聯查詢CGLib資料庫框架
- 使用 yogaKit 實現一個資訊流佈局
- 使用Redis和Java進行資料庫快取 - DZone資料庫RedisJava資料庫快取
- Redis多機資料庫實現Redis資料庫
- 資料庫連線池實現資料庫
- LLM並行訓練3-資料並行並行
- Java 8 Stream並行流Java並行
- Stream並行流詳解並行
- python能實現並行嗎Python並行
- swing 實現使用者登入註冊介面(不使用資料庫)資料庫
- 實戰 | 使用 Kotlin Flow 構建資料流 "管道"Kotlin
- 使用Apache Flink和Apache Ignit進行資料流分析Apache
- gorm 專案使用多數資料庫 怎麼實現好GoORM資料庫
- 成功使用Eclipse匯入專案,並實驗Mybatis操作了資料庫內容。EclipseMyBatis資料庫
- 關於連線資料庫實現增刪改查並且網頁上表現出來資料庫網頁
- 使用免費的Oracle雲服務-建立並使用ADW資料庫Oracle資料庫