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中可以配置databaseSchema属性:

土豪请注意: 如果您觉得此文有帮助,可以给支付宝账户zuiyanwangyue@126.com转账进行打赏(可扫描右侧二维码),您的捐助将被用于完善此网站的功能和内容。
加入我们团队: 如果你是技术控并且愿意分享自己掌握的知识,欢迎加入我们团队,请联系QQ:421712311 如本文未能解决您面临的问题,也欢迎随时和我联系以便进一步探讨。

评论列表[0]