首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache Ignite自动从第三方数据库加载缓存(使用sql模式的postgresql)

Apache Ignite自动从第三方数据库加载缓存(使用sql模式的postgresql)
EN

Stack Overflow用户
提问于 2021-09-08 08:41:02
回答 3查看 244关注 0票数 1

我目前正在构建一个具有不同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配置如下所示:

代码语言:javascript
复制
<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,可以单独使用容器。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-10 12:55:58

不幸的是,没有从集群外部触发#loadCache方法的内置机制,因此需要编写一些辅助代码。但是,一旦编写完成,您可能只需将其包装到计算任务中,并使用例如REST API调用它。

票数 0
EN

Stack Overflow用户

发布于 2021-09-13 16:08:07

为此,您需要提供自己的CacheStoreAdapter实现,并更新Ignite配置以使用这些类。

Here是一个基本的示例,应该可以帮助您入门。

票数 0
EN

Stack Overflow用户

发布于 2021-09-15 19:06:31

您是否使用过GridGain提供的Web控制台?此工具允许Web UI从通过JDBC连接到Ignite的postgresql加载数据。(但是,当前未提供web控制台,因此您必须寻找它。)仅使用Apache Ignite,上面的方法似乎就是您查询的答案。在付费版本的GridGain中,有一种方法可以加载额外的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69099752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档