我目前正在构建一个具有不同ignite配置的应用程序。现在,我正在探索Ignite的缓存特性。我的目标是只使用Ignite作为缓存。数据应存储在第三方数据库(postgres)中。我在数据库中使用tpc-h数据模式。所以,它不是键值存储,而是普通的sql。
现状:我有一个postgres数据库( database -name:"db")和一个"Nation“表。该表由几个条目(Postgres Table "Nation")填充。我也已经在我的Google-Kubernetes-Engine中构建了一个Ignite-Cluster。我使用自己的Ignite-Container-Image。它基本上是官方版本,在类路径中添加了postgresql驱动程序。我的ignite配置如下所示:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd">
<!-- Data source bean -->
<bean id="postgresDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.postgresql.Driver" />
<property name="url" value="jdbc:postgresql://postgres-service:5432/db" />
<property name="username" value="#################" />
<property name="password" value="#################" />
</bean>
<!-- Ignite Configuration -->
<bean class="org.apache.ignite.configuration.IgniteConfiguration">
<property name="cacheConfiguration">
<list>
<!-- Configuration for NationCache -->
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="NationCache"/>
<property name="cacheMode" value="PARTITIONED"/>
<property name="atomicityMode" value="ATOMIC"/>
<property name="cacheStoreFactory">
<bean class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory">
<property name="dataSourceBean" value="postgresDataSource"/>
<property name="dialect">
<bean class="org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect"/>
</property>
<property name="types">
<list>
<bean class="org.apache.ignite.cache.store.jdbc.JdbcType">
<property name="cacheName" value="NationCache"/>
<property name="keyType" value="java.lang.Integer"/>
<property name="valueType" value="PathToClass.Nation"/>
<!--Specify the schema if applicable -->
<property name="databaseSchema" value="public"/>
<property name="databaseTable" value="nation"/>
<property name="keyFields">
<list>
<bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
<constructor-arg>
<util:constant static-field="java.sql.Types.INTEGER"/>
</constructor-arg>
<constructor-arg value="n_nationkey"/>
<constructor-arg value="int"/>
<constructor-arg value="n_nationkey"/>
</bean>
</list>
</property>
<property name="valueFields">
<list>
<bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
<constructor-arg>
<util:constant static-field="java.sql.Types.INTEGER"/>
</constructor-arg>
<constructor-arg value="n_nationkey"/>
<constructor-arg value="int"/>
<constructor-arg value="n_nationkey"/>
</bean>
<bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
<constructor-arg>
<util:constant static-field="java.sql.Types.VARCHAR"/>
</constructor-arg>
<constructor-arg value="n_name"/>
<constructor-arg value="java.lang.String"/>
<constructor-arg value="n_name"/>
</bean>
<bean class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
<constructor-arg>
<util:constant static-field="java.sql.Types.INTEGER"/>
</constructor-arg>
<constructor-arg value="n_regionkey"/>
<constructor-arg value="int"/>
<constructor-arg value="n_regionkey"/>
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
</property>
<property name="readThrough" value="true"/>
<property name="writeThrough" value="true"/>
<!-- Configure query entities if you want to use SQL queries -->
<property name="queryEntities">
<list>
<bean class="org.apache.ignite.cache.QueryEntity">
<property name="keyType" value="java.lang.Integer"/>
<property name="valueType" value="PathToClass.Nation"/>
<property name="keyFieldName" value="n_nationkey"/>
<property name="keyFields">
<list>
<value>n_nationkey</value>
</list>
</property>
<property name="fields">
<map>
<entry key="n_nationkey" value="java.lang.Integer"/>
<entry key="n_name" value="java.lang.String"/>
<entry key="n_regionkey" value="java.lang.Integer"/>
</map>
</property>
</bean>
</list>
</property>
</bean>
<!-- Provide similar configurations for other caches/tables -->
</list>
</property>
</bean>
</beans>问题:如何使用postgresql数据库中的数据自动加载缓存?有没有办法通过容器中的cmd加载缓存?
进一步的解释:就我对Ignite的缓存特性的理解而言,我必须将sql数据加载到缓存中才能使用它(执行selects等操作)。我还没有找到一种方法来加载数据到缓存,而不是编写一个单独的java项目,通过IgniteCache#loadCache()加载缓存。它工作得很好,但我必须手动启动它...一定有一种方法可以更容易地加载缓存,而不是仅仅为了加载缓存而编写单独的java项目。除了这个项目,我不需要使用java,可以单独使用容器。
发布于 2021-09-10 12:55:58
不幸的是,没有从集群外部触发#loadCache方法的内置机制,因此需要编写一些辅助代码。但是,一旦编写完成,您可能只需将其包装到计算任务中,并使用例如REST API调用它。
发布于 2021-09-13 16:08:07
为此,您需要提供自己的CacheStoreAdapter实现,并更新Ignite配置以使用这些类。
Here是一个基本的示例,应该可以帮助您入门。
发布于 2021-09-15 19:06:31
您是否使用过GridGain提供的Web控制台?此工具允许Web UI从通过JDBC连接到Ignite的postgresql加载数据。(但是,当前未提供web控制台,因此您必须寻找它。)仅使用Apache Ignite,上面的方法似乎就是您查询的答案。在付费版本的GridGain中,有一种方法可以加载额外的数据。
https://stackoverflow.com/questions/69099752
复制相似问题