开发者社区> 问答> 正文

activiti 部署在oracle多用户下不能自动建表,求解决??报错

      Oracle11g下有两个用户,bpm与bpm_test用户。两个用户都部署了工作流程,一个是正式环境、一个是测试环境。当两个用户都没有activiti的表时,把databaseSchemaUpdate设置成true时,activiti在启动时会自动创建流程引擎相关的表。

但现在bpm用户已经部署了工作流,有activiti的表了,但bpm_test用户还是没有,此时,用bpm_test用户去连接数据库,启动测试环境时,流程引擎不会自动创建表。还会报错:

### The error may exist in org/activiti/db/mapping/entity/Property.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: select VALUE_ from ACT_GE_PROPERTY where NAME_ = 'schema.version'
### Cause: java.sql.SQLSyntaxErrorException: ORA-00942: 表或视图不存在

 

很明显,在流程引擎启动时,去读了ACT_GE_PROPERTY表,引擎要获取引擎部署的版本信息做一些初始化。

于是,开始找原因:

难道是databaseSchemaUpdate配置错了,网上查了下,除了配置成true,false,还有create,drop-create等,于是每一个都试下,还是不能自动创建,包同样的错。没办法了,那就看源码吧。

从抛出异常的地方跟踪进去,一直跟到了DbsqlSession那个类,

 

 

 

 

 

原来引擎在创建表之前会有个isEngineTablePresent()方法,判断引擎表是否存在。于是在此处打了个断点。程序执行时没有进到else里面,isEngineTablePresent()返回的是true,接着就在getDbVersion()方法里就抛出了如上异常。现在基本上可以确定是isEngineTablePresent()判断是的问题了。于是在跟踪。

原来判读的是ACT_RU_EXECUTION表是否存在。继续跟踪isTablePresent("ACT_RU_EXECUTION")的执行过程。

原来是这样去判断的,那为什么还是没有返回false呢,在此处打一个断点,原来schema的值是NUll。终于知道为什么是返回true了,对于oracle数据库来说,schema就是用户名。现在的问题是怎么才能让引擎拿到schema呢?那样问题就解决了嘛。看了SpringProcessEngineConfiguration的配置项,貌似没有配置schema的配置项。

展开
收起
爱吃鱼的程序员 2020-06-22 11:24:43 1500 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    找到答案了,ProcessEngineConfiguration类里有databaseSchema这个属性,意味着可以在org.activiti.spring.SpringProcessEngineConfiguration这个bean里配上schema属性!<spanstyle="font-family:微软雅黑,Verdana,sans-serif,宋体;font-size:14px;line-height:normal;background-color:#FFFFFF;">schema属性配置完了 换到其他数据库时还是会有问题啊 如何做到通用呢?分析的很到位

    publicSessionopenSession(CommandContextcommandContext){DbSqlSessiondbSqlSession=newDbSqlSession(this,commandContext.getEntityCache());if(getDatabaseSchema()!=null&&getDatabaseSchema().length()>0){try{dbSqlSession.getSqlSession().getConnection().setSchema(getDatabaseSchema());}catch(SQLExceptione){thrownewActivitiException("Couldnotsetdatabaseschemaonconnection",e);}}if(getDatabaseCatalog()!=null&&getDatabaseCatalog().length()>0){try{dbSqlSession.getSqlSession().getConnection().setCatalog(getDatabaseCatalog());}catch(SQLExceptione){thrownewActivitiException("Couldnotsetdatabasecatalogonconnection",e);}}returndbSqlSession;}

     

    dbSqlSession.getSqlSession().getConnection()拿到的T4CConnection没有setSechema方法。。。不然也能设置

    2020-06-22 11:24:59
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgresChina2018_樊文凯_ORACLE数据库和应用异构迁移最佳实践 立即下载
PostgresChina2018_王帅_从Oracle到PostgreSQL的数据迁移 立即下载
Oracle云上最佳实践 立即下载

相关镜像