Java:如何在不到5分钟的时间内通过Hazelcast提高生产力
如果要使用Hazelcast內(nèi)存數(shù)據(jù)網(wǎng)格(IMDG)來加快數(shù)據(jù)庫應用程序的速度,但是要處理數(shù)百個表怎么辦? 手動編碼所有Java POJO和序列化支持將需要數(shù)周的工作,完成后,手動維護該域模型將很快成為一場噩夢。 閱讀本文,了解如何節(jié)省時間并在5分鐘內(nèi)完成。
現(xiàn)在,有一種優(yōu)雅的方法可以管理這些需求。 Hazelcast Auto DB集成工具允許連接到現(xiàn)有數(shù)據(jù)庫,該數(shù)據(jù)庫可以自動生成所有這些樣板類。 我們獲得了真正的POJO,序列化支持,配置,MapStore / MapLoad,攝取等,而無需編寫任何手動代碼。 此外,我們還為Hazelcast分布式地圖提供了Java Stream支持。
使用工具
讓我們嘗試一個例子。 就像我的許多文章一樣,我將使用Sakila開源示例數(shù)據(jù)庫。 它可以作為文件或Docker實例下載 。 Sakila包含16個表,這些表中共有90列。 它還包括帶有其他列的七個視圖。
首先,我們使用Hazelcast Auto DB Integration Initializer和試用許可證密鑰。
填寫上面顯示的值,然后按“下載”,您的項目將保存到計算機中。 然后,按照下一頁的說明,說明如何解壓縮,啟動該工具并獲得試用許可證。
接下來,我們連接到數(shù)據(jù)庫:
該工具現(xiàn)在將分析架構(gòu)元數(shù)據(jù),然后在另一個窗口中可視化數(shù)據(jù)庫架構(gòu):
只需按下“生成”按鈕,完整的Hazelcast域模型將在2或3秒鐘內(nèi)自動生成。
現(xiàn)在,我們幾乎可以編寫我們的Hazelcast IMDG應用程序了。 我們需要創(chuàng)建一個Hazelcast IMDG以首先存儲實際數(shù)據(jù)。
建筑
應用程序與Hazelcast IMDG進行通信時,架構(gòu)就是這樣,該架構(gòu)又從底層數(shù)據(jù)庫獲取數(shù)據(jù):
該工具生成的代碼僅需要出現(xiàn)在應用程序中,而無需出現(xiàn)在Hazelcast IMDG中。
創(chuàng)建Hazelcast IMDG
創(chuàng)建Hazelcast IMDG很容易。 將以下依賴項添加到pom.xml文件:
<dependency><groupId>com.hazelcast</groupId><artifactId>hazelcast</artifactId><version>3.11</version> </dependency>然后,將以下類復制到您的項目中:
public class Server {public static void main(String... args) throws InterruptedException {final HazelcastInstance instance = Hazelcast.newHazelcastInstance();while (true) {Thread.sleep(1000);}}}重復運行此主要方法3次,以在群集中創(chuàng)建三個Hazelcast節(jié)點。 較新版本的IDEA要求在“運行/調(diào)試配置”中啟用“允許并行運行”。 如果只運行一次,也可以。 即使我們的集群中只有一個節(jié)點,下面的示例仍然可以使用。
運行主方法樹時間將產(chǎn)生如下內(nèi)容:
Members {size:3, ver:3} [Member [172.16.9.72]:5701 - d80bfa53-61d3-4581-afd5-8df36aec5bc0Member [172.16.9.72]:5702 - ee312d87-abe6-4ba8-9525-c4c83d6d99b7Member [172.16.9.72]:5703 - 71105c36-1de8-48d8-80eb-7941cc6948b4 this ]真好! 我們的三節(jié)點集群已啟動并正在運行!
數(shù)據(jù)提取
在運行任何業(yè)務邏輯之前,我們需要將數(shù)據(jù)庫中的數(shù)據(jù)提取到新創(chuàng)建的Hazelcast IMDG中。 幸運的是,該工具也為我們做到了這一點。 找到名為SakilaIngest的生成的類,并使用數(shù)據(jù)庫密碼作為第一個命令行參數(shù)運行它,或修改代碼以使其知道密碼。 這就是生成的類的樣子。
public final class SakilaIngest {public static void main(final String... argv) {if (argv.length == 0) { System.out.println("Usage: " + SakilaIngest.class.getSimpleName() + " database_password");} else {try (Speedment app = new SakilaApplicationBuilder().withPassword(argv[0]) // Get the password from the first command line parameter.withBundle(HazelcastBundle.class).build()) {IngestUtil.ingest(app).join();}}} }運行時,將顯示以下輸出(為簡便起見,以下簡稱):
... Completed 599 row(s) ingest of data for Hazelcast Map sakila.sakila.customer_list Completed 2 row(s) ingest of data for Hazelcast Map sakila.sakila.sales_by_store Completed 16,049 row(s) ingest of data for Hazelcast Map sakila.sakila.payment Completed 16,044 row(s) ingest of data for Hazelcast Map sakila.sakila.rental Completed 200 row(s) ingest of data for Hazelcast Map sakila.sakila.actor_info現(xiàn)在,我們從Hazelcast IMDG中獲得了數(shù)據(jù)庫中的所有數(shù)據(jù)。 真好!
你好,世界
現(xiàn)在,我們的網(wǎng)格已經(jīng)生效,并且已經(jīng)提取了數(shù)據(jù),現(xiàn)在可以訪問填充的Hazelcast地圖。 這是一個程序,該程序使用Map界面將所有長度超過一小時的影片打印到控制臺:
public static void main(final String... argv) {try (Speedment app = new SakilaApplicationBuilder().withPassword("your-db-password-goes-here").withBundle(HazelcastBundle.class).build()) {HazelcastInstance hazelcast = app.getOrThrow(HazelcastInstanceComponent.class).get();IMap<Integer, Film> filmMap = hazelcast.getMap("sakila.sakila.film");filmMap.forEach((k, v) -> {if (v.getLength().orElse(0) > 60) {System.out.println(v);}});}}電影的長度是一個可選變量(即,在數(shù)據(jù)庫中可以為空),因此它會自動映射到OptionalLong 。 可以將此行為設置為“ legacy POJO”,如果在手頭的項目中需要返回null,則返回null。
該工具還有一個附加功能:我們獲得Java Stream支持! 因此,我們可以編寫如下相同的功能:
public static void main(final String... argv) {try (Speedment app = new SakilaApplicationBuilder().withPassword("your-db-password-goes-here").withBundle(HazelcastBundle.class).build()) {FilmManager films = app.getOrThrow(FilmManager.class);films.stream().filter(Film.LENGTH.greaterThan(60)).forEach(System.out::println);}引擎蓋下
該工具生成POJO,這些POJO實現(xiàn)了Hazelcast的“便攜式”序列化支持。 這意味著可以使用多種語言(例如Java,Go,C#,JavaScript等)編寫的應用程序訪問網(wǎng)格中的數(shù)據(jù)。
該工具生成以下Hazelcast類:
POJO
每個實現(xiàn)可移植接口的表/視圖一個。
序列化工廠
每個模式一個。 從客戶端中的IMDG反序列化數(shù)據(jù)時,需要有效地創(chuàng)建可移植POJO。
MapStore / MapLoad
每個表/視圖一個。 IMDG可以使用這些類直接從數(shù)據(jù)庫加載數(shù)據(jù)。
類定義
每個表/視圖一個。 這些類用于配置。
指數(shù)效用法
每個項目一個。 這可用于基于數(shù)據(jù)庫索引來改進IMDG的索引。
配置支持
每個項目一個。 創(chuàng)建序列化工廠,類定義和某些性能設置的自動配置。
攝取支持
每個項目一個。 用于將數(shù)據(jù)從數(shù)據(jù)庫吸收到Hazelcast IMDG中的模板。
該工具還包含其他功能,例如對Hazelcast Cloud的支持和Java Stream支持。
一個特別吸引人的屬性是域模型(例如POJO和序列化器)不需要位于服務器的類路徑上。 它們只需要在客戶端的類路徑上即可。 這極大地簡化了網(wǎng)格的設置和管理。 例如,如果您需要更多節(jié)點,請?zhí)砑右粋€新的通用網(wǎng)格節(jié)點,它將加入集群并開始直接參與。
淡褐色云
可以使用應用程序構(gòu)建器輕松配置與Hazelcast Cloud實例的連接,如以下示例所示:
Speedment hazelcastApp = new SakilaApplicationBuilder().withPassword(“<db-password>").withBundle(HazelcastBundle.class).withComponent(HazelcastCloudConfig.class, () -> HazelcastCloudConfig.create("<name of cluster>","<cluster password>","<discovery token>")).build();積蓄
我估計該工具僅為較小的示例Sakila數(shù)據(jù)庫節(jié)省了幾個小時(如果不是幾天)的樣板代碼。 在具有數(shù)百個表的企業(yè)級項目中,該工具將在開發(fā)和維護方面節(jié)省大量時間。
既然您已經(jīng)學習了如何為第一個示例項目創(chuàng)建代碼并設置了所有必要的工具,那么我相信您可以在5分鐘內(nèi)為任何Hazelcast數(shù)據(jù)庫項目生成代碼。
資源資源
Sakila: https ://dev.mysql.com/doc/index-other.html或https://hub.docker.com/r/restsql/mysql-sakila
初始化程序: https : //www.speedment.com/hazelcast-initializer/
手冊: https : //speedment.github.io/speedment-doc/hazelcast.html
翻譯自: https://www.javacodegeeks.com/2019/05/java-become-productive-hazelcast.html
總結(jié)
以上是生活随笔為你收集整理的Java:如何在不到5分钟的时间内通过Hazelcast提高生产力的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 莱芜楼盘备案价(莱芜楼盘备案)
- 下一篇: javafx 自定义控件_JavaFX自