在oracle环境下,powerjob-server重启失败的情况。Error accessing index information: POWERJOB-PRODUCT.APP_INFO

文章描述了一名技术专家在启动PowerJob服务器时遇到的错误,主要原因是SpringDataJpa的EntityManagerFactory构建失败,源于Oracle数据库的INDEX_INFO获取问题,解决步骤包括检查数据库对象名称规则、添加自增序列等。
摘要由CSDN通过智能技术生成

错误信息如下:
 

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2023-10-18 16:55:05.465 ERROR 21540 --- [ main] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'remoteEntityManagerFactory' defined in class path resource [tech/powerjob/server/persistence/config/RemoteJpaConfig.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: remotePersistenceUnit] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.GenericJDBCException: Error accessing index information: POWERJOB-PRODUCT.APP_INFO
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:308)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295)
at tech.powerjob.server.PowerJobServerApplication.main(PowerJobServerApplication.java:33)
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: remotePersistenceUnit] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.GenericJDBCException: Error accessing index information: POWERJOB-PRODUCT.APP_INFO
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:421)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
... 16 common frames omitted
Caused by: org.hibernate.exception.GenericJDBCException: Error accessing index information: POWERJOB-PRODUCT.APP_INFO
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)
at org.hibernate.tool.schema.extract.internal.AbstractInformationExtractorImpl.convertSQLException(AbstractInformationExtractorImpl.java:118)
at org.hibernate.tool.schema.extract.internal.AbstractInformationExtractorImpl.getIndexes(AbstractInformationExtractorImpl.java:1165)
at org.hibernate.tool.schema.extract.internal.TableInformationImpl.indexes(TableInformationImpl.java:122)
at org.hibernate.tool.schema.extract.internal.TableInformationImpl.getIndex(TableInformationImpl.java:138)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyUniqueKeys(AbstractSchemaMigrator.java:388)
at org.hibernate.tool.schema.internal.GroupedSchemaMigratorImpl.performTablesMigration(GroupedSchemaMigratorImpl.java:90)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:220)
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:123)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:196)
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:85)
at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:335)
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498)
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
... 20 common frames omitted
Caused by: java.sql.SQLException: 调用中的无效参数
at oracle.jdbc.OracleDatabaseMetaData.getIndexInfo(OracleDatabaseMetaData.java:3777)
at com.zaxxer.hikari.pool.ProxyDatabaseMetaData.getIndexInfo(ProxyDatabaseMetaData.java:208)
at com.zaxxer.hikari.pool.HikariProxyDatabaseMetaData.getIndexInfo(HikariProxyDatabaseMetaData.java)
at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processIndexInfoResultSet(InformationExtractorJdbcDatabaseMetaDataImpl.java:112)
at org.hibernate.tool.schema.extract.internal.AbstractInformationExtractorImpl.getIndexes(AbstractInformationExtractorImpl.java:1125)
... 34 common frames omitted

经过仔细的排查,终于发现了导致这个错误的原因了。

引用官网文档中的介绍:

STEP1: 初始化数据库
调度服务器(powerjob-server)的持久化层基于Spring Data Jpa实现,对于能够直连数据库的应用,开发者仅需完成数据库的创建,即运行SQL:CREATE DATABASE IF NOT EXISTS powerjob-product DEFAULT CHARSET utf8mb4

● PowerJob支持环境隔离,提供日常(daily)、预发(pre)和线上(product)三套环境,请根据使用的环境分别部署对应的数据库 powerjob-daily、powerjob-pre 和 powerjob-product。

我在oracle数据库里面新建了一个名为POWERJOB-PRODUCT的角色,在第一次启动的时候自动建表,重启服务的时候,发现启动不了,报错在上面了。这里介绍一下排查过程,刚开始以为是权限问题,我给这个用户库加上了dba的权限。然后跟着debug走,发现了错误所在:

public synchronized ResultSet getIndexInfo(String var1, String var2, String var3, boolean var4, boolean var5) throws SQLException {
Statement var6 = this.connection.createStatement();
if ((var2 == null || var2.length() == 0 || OracleSql.isValidObjectName(var2)) && (var3 == null || var3.length() == 0 || OracleSql.isValidObjectName(var3))) {
String var8;
if (!var5) {
boolean var7 = false;

            try {
                var7 = this.connection.getTransactionState().contains(TransactionState.TRANSACTION_STARTED);
            } catch (SQLException var16) {
            }

            if (!var7) {
                var8 = "analyze table " + (var2 == null ? "" : var2 + ".") + var3 + " compute statistics";
                var6.executeUpdate(var8);
            }
        }

        String var17 = "select null as table_cat,\n       owner as table_schem,\n       table_name,\n       0 as NON_UNIQUE,\n       null as index_qualifier,\n       null as index_name, 0 as type,\n       0 as ordinal_position, null as column_name,\n       null as asc_or_desc,\n       num_rows as cardinality,\n       blocks as pages,\n       null as filter_condition\nfrom all_tables\nwhere table_name = " + quoteDatabaseObjectName(var3) + "\n";
        var8 = "";
        if (var2 != null && var2.length() > 0) {
            var8 = "  and owner = " + quoteDatabaseObjectName(var2) + "\n";
        }

        String var9 = "select null as table_cat,\n       i.owner as table_schem,\n       i.table_name,\n       decode (i.uniqueness, 'UNIQUE', 0, 1),\n       null as index_qualifier,\n       i.index_name,\n       1 as type,\n       c.column_position as ordinal_position,\n       c.column_name,\n       null as asc_or_desc,\n       i.distinct_keys as cardinality,\n       i.leaf_blocks as pages,\n       null as filter_condition\nfrom all_indexes i, all_ind_columns c\nwhere i.table_name = " + quoteDatabaseObjectName(var3) + "\n";
        String var10 = "";
        if (var2 != null && var2.length() > 0) {
            var10 = "  and i.owner = " + quoteDatabaseObjectName(var2) + "\n";
        }

        String var11 = "";
        if (var4) {
            var11 = "  and i.uniqueness = 'UNIQUE'\n";
        }

        String var12 = "  and i.index_name = c.index_name\n  and i.table_owner = c.table_owner\n  and i.table_name = c.table_name\n  and i.owner = c.index_owner\n";
        String var13 = "order by non_unique, type, index_name, ordinal_position\n";
        String var14 = var17 + var8 + "union\n" + var9 + var10 + var11 + var12 + var13;
        var6.closeOnCompletion();
        OracleResultSet var15 = (OracleResultSet)var6.executeQuery(var14);
        return var15;
    } else {
        throw (SQLException)((SQLException)DatabaseError.createSqlException(68).fillInStackTrace());
    }
}

 断点发现,这里的OracleSql.isValidObjectName(var2)表达式为false,点进去看

 public static boolean isValidObjectName(String var0) {
    assert var0 != null && var0.length() > 0 : "name is null or empty";

    return DATABASE_OBJECT_NAME_RULE.matcher(var0).matches();
}

 继续往下走;
DATABASE_OBJECT_NAME_RULE = Pattern.compile(""[^\"\\u0000]+"|\p{L}[\p{L}\p{N}_$#@]*");

再到这里,发现了一个正则表达式。于是可以看到,官网提到的初始化数据库的名称,在oracle的环境下,不符合jdbc的规则。
导致了程序在启动的时候无法访问数据库里面的数据,然后就启动不了了。于是我将对应的用户名进行了修改。

再进行启动,需要配置主键自增。然后整个server服务就没有问题了。

CREATE SEQUENCE native

START WITH 1

INCREMENT BY 1

MINVALUE 1

MAXVALUE 9999999999999999999

NOORDER

NOCACHE

NOCYCLE;

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PowerJob是全新一代分布式调度与计算框架,支持CRON、API、固定频率、固定延迟等调度策略,提供工作流来编排任务解决依赖关系,使用简单,功能强大,文档齐全,能让您轻松完成作业的调度与繁杂任务的分布式计算。 PowerJob特点: 使用简单:提供前端Web界面,允许开发者可视化地完成调度任务的管理(增、删、改、查)、任务运行状态监控和运行日志查看等功能。 定时策略完善:支持CRON表达式、固定频率、固定延迟和API四种定时调度策略。 执行模式丰富:支持单机、广播、Map、MapReduce四种执行模式,其中Map/MapReduce处理器能使开发者寥寥数行代码便获得集群分布式计算的能力。 DAG工作流支持:支持在线配置任务依赖关系,可视化得对任务进行编排,同时还支持上下游任务间的数据传递 执行器支持广泛:支持Spring Bean、内置/外置Java类、Shell、Python等处理器,应用范围广。 运维便捷:支持在线日志功能,执行器产生的日志可以在前端控制台页面实时显示,降低debug成本,极大地提高开发效率。 依赖精简:最小仅依赖关系型数据库(MySQL/Oracle/MS SQLServer...),扩展依赖为MongoDB(用于存储庞大的在线日志)。 高可用&高性能:调度服务器经过精心设计,一改其他调度框架基于数据库锁的策略,实现了无锁化调度。部署多个调度服务器可以同时实现高可用和性能的提升(支持无限的水平扩展)。 故障转移与恢复:任务执行失败后,可根据配置的重试策略完成重试,只要执行器集群有足够的计算节点,任务就能顺利完成。 PowerJob适用场景: 有定时执行需求的业务场景:如每天凌晨全量同步数据、生成业务报表等。 有需要全部机器一同执行的业务场景:如使用广播执行模式清理集群日志。 有需要分布式处理的业务场景:比如需要更新一大批数据,单机执行耗时非常长,可以使用Map/MapReduce处理器完成任务的分发,调动整个集群加速计算。 有需要延迟执行某些任务的业务场景:比如订单过期处理等。     PowerJob 更新日志: v4.0.1 Features 支持 PostgreSQL 强化前端控制台,新增 tag、上次在线时间等 worker 信息,便于排查无法连接的问题。 BugFix 修复 server 集群选主问题 修复当没有 worker 连接到 server 时出现的 NPE 问题 修复前端控制台错误显示 worker 列表的问题
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值