为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Smart猫小萌 2021-09-15 15:45:59
我正在尝试让 Hazelcast 与 Hibernate 一起工作,但除非我使用该super_client选项,否则它不会启动。根据文档,只有当您的应用程序位于同一个 RAC 或数据中心时,才应使用超级客户端。对于本地,情况就是这样,对于生产,它们肯定会分开,因此 Native Client 是唯一适合我们的选择。超级客户端是集群的成员,它与集群中的每个成员都有套接字连接,并且知道数据在哪里,因此可以更快地获取数据。但是超级客户端有集群开销,它必须在同一个数据中心,即使在同一个 RAC 上。但是,本机客户端不是成员,而是依赖于集群成员之一。本机客户端可以位于 LAN 或 WAN 中的任何位置。它的扩展性更好,开销也更少。因此,如果您的客户端少于 Hazelcast 节点,则可以选择超级客户端;否则一定要尝试 Native Client。经验法则:首先尝试使用 Native 客户端,如果它对您来说性能不够好,则考虑使用超级客户端。启动 Hazelcast 的最佳选择似乎是使用 Docker:docker pull hazelcast/hazelcast:3.10.4docker run --name=hazelcast -d=true -p 5701:5701 hazelcast/hazelcast:3.10.4这就是它启动并运行后的样子,我仔细检查了 Hazelcast 端口 5701 是否已暴露,这显然是公开的。CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                    NAMES77a5a0bed5eb        hazelcast/hazelcast:3.10.4   "bash -c 'set -euo p…"   3 days ago          Up 6 hours          0.0.0.0:5701->5701/tcp   hazelcastdocker 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>
查看完整描述

2 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

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


查看完整回答
反对 回复 2021-09-15
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

终于让它工作了,这是需要的:


1:确保您拥有所有这三个依赖项,最初我错过了第一个,但由于某种原因,没有按预期获得 ClassNotFound 异常。它似乎不是hazelcast-client或的传递依赖hazelcast-hibernate52


    <dependency>

        <groupId>com.hazelcast</groupId>

        <artifactId>hazelcast</artifactId>

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

    </dependency>

    <dependency>

        <groupId>com.hazelcast</groupId>

        <artifactId>hazelcast-hibernate52</artifactId>

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

    </dependency>

    <dependency>

        <groupId>com.hazelcast</groupId>

        <artifactId>hazelcast-client</artifactId>

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

    </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")

//  paramsDefault.add("hibernate.cache.hazelcast.native_client_group=$ENV")

//  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(

    name: String,

) : Serializable {

5:如果您的单位拥有@OneToMany,@ManyToOne或内部其他实体,确保这些实体Serializable为好。


6:编写一个小脚本来确保您的实体正在缓存:


import com.hazelcast.client.HazelcastClient

import com.hazelcast.client.config.ClientConfig


fun main(args: Array<String>) {


    val config = ClientConfig()

    config.getNetworkConfig().addAddress("127.0.0.1:5701")

    val hazelcastInstance = HazelcastClient.newHazelcastClient(config)


    val map = hazelcastInstance.getMap<Any, Any>("Tag")


    println("=================")

    map.forEach { t, u ->

        println(" $t -> $u ")

    }

    println("=================")


    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.4

8:检查 Hazelcast 日志以查看您的 Java/Kotlin 客户端是否正在连接:


docker logs -f hazelcast

当有连接时,您应该会看到如下内容:


Sep 13, 2018 9:05:06 PM com.hazelcast.client.ClientEndpointManager

INFO: [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.TcpIpAcceptor

INFO: [127.0.0.1]:5701 [dev] [3.10.4] Accepting socket connection from /172.17.0.1:56576

Sep 13, 2018 9:05:19 PM com.hazelcast.nio.tcp.TcpIpConnectionManager

INFO: [127.0.0.1]:5701 [dev] [3.10.4] Established socket connection between /172.17.0.2:5701 and /172.17.0.1:56576

Sep 13, 2018 9:05:19 PM com.hazelcast.client.impl.protocol.task.AuthenticationMessageTask

INFO: [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 工作的关键。


查看完整回答
反对 回复 2021-09-15
  • 2 回答
  • 0 关注
  • 169 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信