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的付费版本中,有一种方法可以加载额外的数据。