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

Jack_dun 发布于 2014/03/20 11:34
阅读 5K+
收藏 2

      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的配置项。

加载中
0
J
Jack_dun
找到答案了,ProcessEngineConfiguration类里有databaseSchema这个属性,意味着可以在org.activiti.spring.SpringProcessEngineConfiguration这个bean里配上schema属性!
0
s
sjhp
schema属性配置完了  换到其他数据库时还是会有问题啊  如何做到通用呢?
0
麦田1900
麦田1900
分析的很到位
返回顶部
顶部