Apache Ignite 自动从第三方数据库加载缓存(postgresql with sql schema)
Apache Ignite automatically load cache from 3rd party database (postgresql with sql schema)
我目前正在构建一个具有不同 ignite 配置的应用程序。现在,我正在探索 Ignite 的缓存功能。我的目标是仅将 Ignite 用作缓存。数据应存储在第 3 方数据库 (postgres) 中。我在我的数据库中使用 tpc-h 数据模式。所以,它不是键值存储,而是普通的 sql.
现状:
我有一个带有“国家”table 的 postgres 数据库(数据库名称:“db”)。 table 填充了一些条目 (Postgres Table "Nation")。
我也已经在我的 Google-Kubernetes-Engine 中建立了一个 Ignite-Cluster。我使用自己的 Ignite-Container-Image。它基本上是将 postgresql-驱动程序添加到类路径中的官方版本。我的点火配置如下所示:
<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 数据加载到缓存才能使用它(进行选择等)。我还没有找到一种方法可以在不编写单独的 java 项目的情况下将数据加载到缓存,该项目通过 IgniteCache#loadCache() 加载缓存。这工作正常,但我必须手动启动它......必须有一种方法可以比编写一个单独的 java 项目更容易加载缓存来加载缓存。除了这个项目,我不必使用 java 并且可以单独使用容器。
不幸的是,没有内置机制可以从集群外部触发 #loadCache
方法,因此需要编写一些辅助代码。但是,一旦它被编写好,您可能只是将它包装到 s 计算任务中并使用 REST API.
调用它
为此,您需要提供自己的 CacheStoreAdapter 实现并更新 Ignite 配置以使用这些 类。
Here 是一个可以帮助您入门的基本示例。
您使用过GridGain提供的Web Console吗?该工具允许 Web UI 从通过 JDBC 连接的 postgresql 加载数据到 Ignite。 (但是,当前未提供 Web 控制台,因此您必须寻找它。)
单独使用 Apache Ignite,上述方法似乎是您查询的答案。在GridGain的付费版本中,有一种方法可以加载额外的数据。
我目前正在构建一个具有不同 ignite 配置的应用程序。现在,我正在探索 Ignite 的缓存功能。我的目标是仅将 Ignite 用作缓存。数据应存储在第 3 方数据库 (postgres) 中。我在我的数据库中使用 tpc-h 数据模式。所以,它不是键值存储,而是普通的 sql.
现状: 我有一个带有“国家”table 的 postgres 数据库(数据库名称:“db”)。 table 填充了一些条目 (Postgres Table "Nation")。 我也已经在我的 Google-Kubernetes-Engine 中建立了一个 Ignite-Cluster。我使用自己的 Ignite-Container-Image。它基本上是将 postgresql-驱动程序添加到类路径中的官方版本。我的点火配置如下所示:
<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 数据加载到缓存才能使用它(进行选择等)。我还没有找到一种方法可以在不编写单独的 java 项目的情况下将数据加载到缓存,该项目通过 IgniteCache#loadCache() 加载缓存。这工作正常,但我必须手动启动它......必须有一种方法可以比编写一个单独的 java 项目更容易加载缓存来加载缓存。除了这个项目,我不必使用 java 并且可以单独使用容器。
不幸的是,没有内置机制可以从集群外部触发 #loadCache
方法,因此需要编写一些辅助代码。但是,一旦它被编写好,您可能只是将它包装到 s 计算任务中并使用 REST API.
为此,您需要提供自己的 CacheStoreAdapter 实现并更新 Ignite 配置以使用这些 类。
Here 是一个可以帮助您入门的基本示例。
您使用过GridGain提供的Web Console吗?该工具允许 Web UI 从通过 JDBC 连接的 postgresql 加载数据到 Ignite。 (但是,当前未提供 Web 控制台,因此您必须寻找它。) 单独使用 Apache Ignite,上述方法似乎是您查询的答案。在GridGain的付费版本中,有一种方法可以加载额外的数据。