让 Hazelcast Native Client 与 Hibernate 5.2.x 一起工作

我正在尝试让 Hazelcast 与 Hibernate 一起工作,但除非我使用该super_client选项,否则它不会启动。


根据文档,只有当您的应用程序位于同一个 RAC 或数据中心时,才应使用超级客户端。对于本地,情况就是这样,对于生产,它们肯定会分开,因此 Native Client 是唯一适合我们的选择。


超级客户端是集群的成员,它与集群中的每个成员都有套接字连接,并且知道数据在哪里,因此可以更快地获取数据。但是超级客户端有集群开销,它必须在同一个数据中心,即使在同一个 RAC 上。但是,本机客户端不是成员,而是依赖于集群成员之一。本机客户端可以位于 LAN 或 WAN 中的任何位置。它的扩展性更好,开销也更少。因此,如果您的客户端少于 Hazelcast 节点,则可以选择超级客户端;否则一定要尝试 Native Client。经验法则:首先尝试使用 Native 客户端,如果它对您来说性能不够好,则考虑使用超级客户端。


启动 Hazelcast 的最佳选择似乎是使用 Docker:


docker pull hazelcast/hazelcast:3.10.4

docker run --name=hazelcast -d=true -p 5701:5701 hazelcast/hazelcast:3.10.4

这就是它启动并运行后的样子,我仔细检查了 Hazelcast 端口 5701 是否已暴露,这显然是公开的。


CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES

77a5a0bed5eb        hazelcast/hazelcast:3.10.4   "bash -c 'set -euo p…"   3 days ago          Up 6 hours          0.0.0.0:5701->5701/tcp   hazelcast

docker hub 文档还提到了如何传入 JAVA_OPTS,我不确定这是必需的还是可选的以及它的目的是什么,但这并没有帮助我启动和运行:


-e JAVA_OPTS="-Dhazelcast.local.publicAddress=127.0.0.1:5701"


telnet 127.0.0.1 5701成功连接到localhost:5701,所以我知道端口是开放的。docker 文档没有提到这个正在运行的 Hazelcast 实例的默认密码是什么,我的假设是它是空的,或者密码是dev-pass在几个较旧的教程中提到的。


我正在使用休眠 5.2.13.Final


    <dependency>

        <groupId>org.hibernate</groupId>

        <artifactId>hibernate-core</artifactId>

        <version>${hibernate.version}</version>

    </dependency>

    <dependency>

        <groupId>org.hibernate</groupId>

        <artifactId>hibernate-entitymanager</artifactId>

        <version>${hibernate.version}</version>

        <exclusions>

            <exclusion>

                <groupId>cglib</groupId>

                <artifactId>cglib</artifactId>

            </exclusion>

            <exclusion>

                <groupId>dom4j</groupId>

                <artifactId>dom4j</artifactId>

            </exclusion>

        </exclusions>


Smart猫小萌
浏览 170回答 2
2回答

幕布斯6054654

看起来您正在尝试使用来自另一个服务器和 docker 网络之外的环回地址。您可能想尝试桥接以消除 docker 网络地址转换。此外,由于 0.0.0.0 已绑定,因此所有 IP 地址都应安装 Hazelcast 侦听器。我会简化并首先验证 Hazelcast。如果您有企业,则使用控制台应用程序,否则编写一个简单的启动服务器 java main。然后尝试使用真实 IP 地址与客户端连接。一旦这有效,然后就可以进行休眠配置。

30秒到达战场

终于让它工作了,这是需要的:1:确保您拥有所有这三个依赖项,最初我错过了第一个,但由于某种原因,没有按预期获得 ClassNotFound 异常。它似乎不是hazelcast-client或的传递依赖hazelcast-hibernate52&nbsp; &nbsp; <dependency>&nbsp; &nbsp; &nbsp; &nbsp; <groupId>com.hazelcast</groupId>&nbsp; &nbsp; &nbsp; &nbsp; <artifactId>hazelcast</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; <version>${hazelcast.version}</version>&nbsp; &nbsp; </dependency>&nbsp; &nbsp; <dependency>&nbsp; &nbsp; &nbsp; &nbsp; <groupId>com.hazelcast</groupId>&nbsp; &nbsp; &nbsp; &nbsp; <artifactId>hazelcast-hibernate52</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; <version>${hazelcast-hibernate.version}</version>&nbsp; &nbsp; </dependency>&nbsp; &nbsp; <dependency>&nbsp; &nbsp; &nbsp; &nbsp; <groupId>com.hazelcast</groupId>&nbsp; &nbsp; &nbsp; &nbsp; <artifactId>hazelcast-client</artifactId>&nbsp; &nbsp; &nbsp; &nbsp; <version>${hazelcast.version}</version>&nbsp; &nbsp; </dependency>2:如果您的 Hazelcast 开发实例没有密码,请不要指定密码。127.0.0.1 工作正常,开发时无需在外部服务器上运行。paramsDefault.add("hibernate.cache.use_query_cache=true")paramsDefault.add("hibernate.cache.use_second_level_cache=true")paramsDefault.add("hibernate.cache.region.factory_class=com.hazelcast.hibernate.HazelcastCacheRegionFactory")paramsDefault.add("hibernate.cache.hazelcast.use_native_client=true")paramsDefault.add("hibernate.cache.hazelcast.native_client_address=127.0.0.1")//&nbsp; paramsDefault.add("hibernate.cache.hazelcast.native_client_group=$ENV")//&nbsp; paramsDefault.add("hibernate.cache.hazelcast.native_client_password=dev-pass")3:摆脱hazelcast.xml- 删除该hazelcast.xml文件后,即使我的hazelcast.xml文件中只有一行写着使用默认配置,Hibernate 也确实启动了。4:确保所有实体都标有Serializable,否则实体不会缓存并导致Hazelcast服务器本身出现异常。@Table@Entity@BatchSize(size = 50)@PersistenceContext(unitName = "default")@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "Tag")class Tag(&nbsp; &nbsp; name: String,) : Serializable {5:如果您的单位拥有@OneToMany,@ManyToOne或内部其他实体,确保这些实体Serializable为好。6:编写一个小脚本来确保您的实体正在缓存:import com.hazelcast.client.HazelcastClientimport com.hazelcast.client.config.ClientConfigfun main(args: Array<String>) {&nbsp; &nbsp; val config = ClientConfig()&nbsp; &nbsp; config.getNetworkConfig().addAddress("127.0.0.1:5701")&nbsp; &nbsp; val hazelcastInstance = HazelcastClient.newHazelcastClient(config)&nbsp; &nbsp; val map = hazelcastInstance.getMap<Any, Any>("Tag")&nbsp; &nbsp; println("=================")&nbsp; &nbsp; map.forEach { t, u ->&nbsp; &nbsp; &nbsp; &nbsp; println(" $t -> $u ")&nbsp; &nbsp; }&nbsp; &nbsp; println("=================")&nbsp; &nbsp; hazelcastInstance.shutdown()}上面的脚本将println当前缓存中的所有 Tag 实体7:启动Docker实例时,确保你已经暴露了端口,没有这个-p选项,什么都不会工作。docker run --name=hazelcast -d=true -p 5701:5701 -e JAVA_OPTS="-Dhazelcast.local.publicAddress=127.0.0.1:5701" hazelcast/hazelcast:3.10.48:检查 Hazelcast 日志以查看您的 Java/Kotlin 客户端是否正在连接:docker logs -f hazelcast当有连接时,您应该会看到如下内容:Sep 13, 2018 9:05:06 PM com.hazelcast.client.ClientEndpointManagerINFO: [127.0.0.1]:5701 [dev] [3.10.4] Destroying ClientEndpoint{connection=Connection[id=32, /172.17.0.2:5701->/172.17.0.1:56574, endpoint=[172.17.0.1]:56574, alive=false, type=JAVA_CLIENT], principal='ClientPrincipal{uuid='99cbf1b4-d11c-462d-bd87-4c069bc9b2ef', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}, ownerConnection=true, authenticated=true, clientVersion=3.10.4, creationTime=1536872631771, latest statistics=null}Sep 13, 2018 9:05:19 PM com.hazelcast.nio.tcp.TcpIpAcceptorINFO: [127.0.0.1]:5701 [dev] [3.10.4] Accepting socket connection from /172.17.0.1:56576Sep 13, 2018 9:05:19 PM com.hazelcast.nio.tcp.TcpIpConnectionManagerINFO: [127.0.0.1]:5701 [dev] [3.10.4] Established socket connection between /172.17.0.2:5701 and /172.17.0.1:56576Sep 13, 2018 9:05:19 PM com.hazelcast.client.impl.protocol.task.AuthenticationMessageTaskINFO: [127.0.0.1]:5701 [dev] [3.10.4] Received auth from Connection[id=33, /172.17.0.2:5701->/172.17.0.1:56576, endpoint=null, alive=true, type=JAVA_CLIENT], successfully authenticated, principal: ClientPrincipal{uuid='ff51de39-fd9c-4ecf-bdd4-bbdb6ec6c79e', ownerUuid='2fb66fa1-a17f-49fe-ba2b-bf585d43906d'}, owner connection: true, client version: 3.10.4这些似乎是让hazelcast hibernate 工作的关键。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java