尝试从 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
详情
定义
<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]);
建议您使用正确的 Oracle 方言,而不是“基本”方言:
<property name="dialect">
<bean class="org.apache.ignite.cache.store.jdbc.dialect.OracleDialect"/>
</property>