Apache Ignite 从 oracle Database 21c 加载警告无法以多线程模式从数据库加载条目

问题描述 投票:0回答:1

尝试从 Oracle 数据库 19c 执行 cache.load() 时的应用程序,我们在 ignite 日志中打印警告

错误如下

2024-08-29T20:34:05,391|WARN|mgmt-#111%ImportedCluster%|store.jdbc.CacheJdbcPojoStore||Failed to load entries from db in multithreaded mode, will try in single thread [cache=OurCache, keyType=java.lang.Integer]
java.sql.SQLException: ORA-30485: missing ORDER BY expression in the window specification

    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:629) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:563) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1150) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:770) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:298) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:497) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:151) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:936) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OracleStatement.prepareDefineBufferAndExecute(OracleStatement.java:1171) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1100) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OracleStatement.executeSQLSelect(OracleStatement.java:1425) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1308) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3745) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3854) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1097) ~[ojdbc8-21.7.0.0.jar!/:21.6.0.0.0]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar!/:?]
    at org.apache.ignite.cache.store.jdbc.CacheAbstractJdbcStore.loadCache(CacheAbstractJdbcStore.java:767) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore.loadCache(GridCacheWriteBehindStore.java:418) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.store.GridCacheStoreManagerAdapter.loadCache(GridCacheStoreManagerAdapter.java:516) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter.localLoadCache(GridDhtCacheAdapter.java:515) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.GridCacheProxyImpl.localLoadCache(GridCacheProxyImpl.java:198) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJob.localExecute(GridCacheAdapter.java:5991) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter$LoadCacheJobV2.localExecute(GridCacheAdapter.java:6040) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.cache.GridCacheAdapter$TopologyVersionAwareJob.execute(GridCacheAdapter.java:6775) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.compute.ComputeJobAdapter.call(ComputeJobAdapter.java:131) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.closure.GridClosureProcessor$C2.execute(GridClosureProcessor.java:1694) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.job.GridJobWorker$1.call(GridJobWorker.java:628) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.util.IgniteUtils.wrapThreadLoader(IgniteUtils.java:7498) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.job.GridJobWorker.execute0(GridJobWorker.java:622) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.job.GridJobWorker.body(GridJobWorker.java:547) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.job.GridJobProcessor.processJobExecuteRequest(GridJobProcessor.java:1367) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.processors.job.GridJobProcessor$JobExecutionListener.onMessage(GridJobProcessor.java:2223) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1906) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1527) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager.access$5300(GridIoManager.java:242) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.managers.communication.GridIoManager$9.execute(GridIoManager.java:1420) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at org.apache.ignite.internal.managers.communication.TraceRunnable.run(TraceRunnable.java:55) ~[ignite-core-2.16.0.jar!/:2.16.0]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_332]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_332]
    at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_332]
Caused by: oracle.jdbc.OracleDatabaseException: ORA-30485: missing ORDER BY expression in the window specification

详情

  • 代码中没有使用 SQL 查询,仅调用 .load() 本身就会出现错误
  • 应用程序工作正常,但无法理解导致此警告的原因

定义

<bean
class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="ChnlMstrCache" />
<property name="cacheMode" value="REPLICATED" />
<property name="atomicityMode" value="ATOMIC" />
<property name="backups" value="1" />

<property name="cacheStoreFactory">
<bean
        class="org.apache.ignite.cache.store.jdbc.CacheJdbcPojoStoreFactory">
        <property name="dataSourceBean" value="dataSourceRM" />
        <property name="dialect">
                <bean
                        class="org.apache.ignite.cache.store.jdbc.dialect.BasicJdbcDialect">
                </bean>
        </property>

        <property name="types">
                <list>
                        <bean class="org.apache.ignite.cache.store.jdbc.JdbcType">
                                <property name="cacheName" value="ChnlMstrCache" />
                                <property name="keyType" value="java.lang.Integer" />
                                <property name="valueType"
                                        value="com.org.ChnlMstr" />
                                <property name="databaseSchema"
                                        value="app" />
                                <property name="databaseTable"
                                        value="chnl_mstr" />

                                <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="CHANNEL_ID" />
                                                        <constructor-arg value="java.lang.Integer" />
                                                        <constructor-arg value="channelId" />
                                                </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.VARCHAR" />
                                                        </constructor-arg>
                                                        <constructor-arg value="CHANNEL_NAME" />
                                                        <constructor-arg value="java.lang.String" />
                                                        <constructor-arg value="channelName" />
                                                </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="CREATED_BY" />
                                                        <constructor-arg value="java.lang.String" />
                                                        <constructor-arg value="createdBy" />
                                                </bean>

                                                <bean
                                                        class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                        <constructor-arg>
                                                                <util:constant
                                                                        static-field="java.sql.Types.TIMESTAMP" />
                                                        </constructor-arg>
                                                        <constructor-arg value="CREATED_ON" />
                                                        <constructor-arg value="java.sql.Timestamp" />
                                                        <constructor-arg value="createdOn" />
                                                </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="MODIFIED_BY" />
                                                        <constructor-arg value="java.lang.String" />
                                                        <constructor-arg value="modifiedBy" />
                                                </bean>

                                                <bean
                                                        class="org.apache.ignite.cache.store.jdbc.JdbcTypeField">
                                                        <constructor-arg>
                                                                <util:constant
                                                                        static-field="java.sql.Types.TIMESTAMP" />
                                                        </constructor-arg>
                                                        <constructor-arg value="MODIFIED_ON" />
                                                        <constructor-arg value="java.sql.Timestamp" />
                                                        <constructor-arg value="modifiedOn" />
                                                </bean>
                                        </list>
                                </property>
                        </bean>
                </list>
        </property>
</bean>
</property>

<property name="readThrough" value="true" />
<property name="writeThrough" value="true" />
<property name="writeBehindEnabled" value="true"/>
<property name="writeBehindFlushFrequency" value="10000"/>
<property name="queryEntities">
<list>
        <bean class="org.apache.ignite.cache.QueryEntity">
                <property name="keyType" value="java.lang.Integer" />
                <property name="valueType"
                        value="com.org.ChnlMstr"" />
                <property name="tableName" value="chnl_mstr" />
                <property name="keyFieldName" value="channelId" />

                <property name="keyFields">
                        <list>
                                <value>channelId</value>
                        </list>
                </property>

                <property name="fields">
                        <map>
                                <entry key="channelId" value="java.lang.Integer" />
                                <entry key="channelName" value="java.lang.String" />
                                <entry key="createdBy" value="java.lang.String" />
                                <entry key="createdOn" value="java.sql.Timestamp" />
                                <entry key="modifiedBy" value="java.lang.String" />
                                <entry key="modifiedOn" value="java.sql.Timestamp" />

                        </map>
                </property>

                <property name="aliases">
                        <map>
                                <entry key="channelId" value="CHANNEL_ID" />
                                <entry key="channelName" value="CHANNEL_NAME" />
                                <entry key="createdBy" value="CREATED_BY" />
                                <entry key="createdOn" value="CREATED_ON" />
                                <entry key="modifiedBy" value="MODIFIED_BY" />
                                <entry key="modifiedOn" value="MODIFIED_ON" />
                        </map>
                </property>
        </bean>
</list>
</property>
</bean>

启动时的应用程序

 ignite.cache("ChnlMstrCache").loadCache(null, new Object[0]);
ignite
1个回答
0
投票

建议您使用正确的 Oracle 方言,而不是“基本”方言:

<property name="dialect">
    <bean class="org.apache.ignite.cache.store.jdbc.dialect.OracleDialect"/>
</property>
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.