某功能在测试环境没问题,发布生产环境后,出现如下错误:
HT_xxx表不存在,无法执行插入操作,跟踪发现,hibernate内部报错,没有创建表HT_xxx的权限。
具体的错误,可参考:
http://stackoverflow.com/questions/4412459/hibernate-bulk-update-leads-to-in-query-which-takes-for-ever-to-complete
一样的代码,一样的配置,测试环境没问题,生产环境报错;
由于生成数据库使用的是阿里云的MySQL数据库,猜测可能是由于帐号权限不够导致(阿里云不提供root帐号),
但是,经过测试,发现使用的帐号具有创建表的权限,只好求助阿里团队,
【问】
db_xxx 库,admin帐号操作, java代码通过hibernate执行update语句【update table_a set status = :status where id = :id】。
相同的代码,测试环境ok,生产环境失败;
跟踪代码,发现,hibernate需要额外执行一条语句【insert into HT_table_a select tablea0_.id as id from table_a tablea0_ where tablea0_.id=?】,
说明hibernate需要额外创建临时表,但该操作失败,从而导致更新操作失败。
请问需要设定什么权限吗?
答:
经查,您的RDS是mysql 5.6版本,对于mysql 5.6是需要在事务以外进行临时表的创建的,如果是5.5可以在事务内进行临时表创建。
您可以确认下这个临时表的操作是否在事务中进行的,如果是事务中执行的这个操作,建议您进行改写,比如是否可以现手动创建这个临时表,然后再执行观察。
至今,不知道该问题的最终原因,只好曲线救国,修改代码,将HQL语句修改为对应的SQL语句。如下: