【发布时间】:2018-02-26 18:41:06
【问题描述】:
我正在尝试创建一个 Hazelcast 服务项目,其中我将订阅 RDBMS (Oracle DB 12c) 数据存储,使用反射动态创建 POJO/Java Bean,然后解析该 Java Bean 对象将 JDBC ResultSet 作为 Result 行值映射到 Java Bean 对象中,并将这些映射的对象加载到分布式映射中。
我在 Hazelcast IMap 中检查了我试图从中加载的两个表的数据量,它低至 0.0625 和 0.0316 MB。所以这是一个更简单的 Hazelcast 实现,只是在 localhost 上初始化两个并行实例/节点。
我在 Java Main 方法中计算从创建 Java POJO 类的那一刻起的总运行时间,并在 Hazelcast IMAP 中创建和加载每个相应的对象。
据我了解,从系统的角度来看,这花费了太长时间,因为即使在具有系统规格的测试和产品框中,我们也看到了类似的行为 比下面给出的要好 3 到 4 倍。请帮助提供有关有什么问题的建议,或者这是第一次在一个 hazelcast IMDG,集群中有 2 个节点。
系统规格如下:
Macbook Pro 2014 处理器:2.6 GHz 英特尔酷睿 i5 内存:8 GB 1600 MHz DDR3
请找到日志...
2018 年 2 月 26 日上午 10:30:39 com.hazelcast.internal.partition.impl.PartitionStateManager INFO: [xx.xxx.xx.xxx]:5702 [dev] [3.9.1] 正在初始化集群分区表排列... userMaster Map 中的条目数:883
userMaster Map 中的条目数:7499
持续时间约为:92520 毫秒 2018 年 2 月 26 日上午 10:32:10 com.hazelcast.core.LifecycleService 信息:[xx.xxx.xx.xxx]:5701 [dev] [3.9.1] [xx.xxx.xx.xxx]:5701 是 SHUTTING_DOWN
【问题讨论】:
-
您是否反映了结果集中的所有 883 行?是什么让你觉得 Hazelcast 很慢——你能把日志记录在
MapLoader.load、loadAll和loadAllKeys方法中吗? -
我创建了一个基于反射的类,并创建了直接放入地图的对象,而不是使用 Maploader 实现来实现持久性。但无论我为 2 个表运行我的程序,一个有 883 条记录,另一个有 7499 条记录,根据规格,这需要一点时间。您能否指定使用 MapLoader 是否更高效。
-
嗨,我尝试使用在同一台机器上运行的不同服务器和客户端创建 MapLoader,并使用正确的 keySet() 实现
loadAllKeys()。这是在服务器(创建 Hazelcast 实例)通过单独的 jar 时调用还是在调用客户端时调用。<map name="userMaster"> <map-store enabled="true" initial-mode="EAGER"> <class-name>com.beans.JPojo</class-name> </map-store> </map>以上是要运行的服务器的 hazelcast.xml 中的配置。但它不会在服务器启动或通过客户端调用时在 IMap 中加载任何内容。 -
如果没有
MapLoader,您的处理就好像它是串行的。一个进程从 Oracle 加载并保存到网格节点。使用MapLoader这是并行化的,每个网格节点直接读取它所托管的数据份额。在 2 节点网格上,加载时间可能会减半,但还有其他因素会影响这一点,例如数据库如何处理两倍的连接负载。 -
你能创建一个mvce 并以某种方式分享吗?这可能有助于理解出了什么问题。 Github 会很好。
标签: java performance hazelcast hazelcast-imap