改DB的结构(由非自动增长改为自动增长)

hibernate 的自动生成主键策略,increment,这个是严重不建议在集群环境下使用的。他是直接用在程序中max函数来生成,这里有两台web server,那么就容易出现插入相同值的问题,更要命的是,我们的项目中也用到了hinernate的二级缓存和查询缓存,那么serverA更新了数据库后,是不会通知serverB的,由于缓存那么serverB不是从数据库中select max的,而是直接从缓存中取出最近一次他自己认为是最新的那条然后加1.那么肯定会出现主键相同的情况了。无论你是不是一起点save按钮,解决的方案:

1 每次save时清空二级缓存的这个类。当然这样要是并发起来,一样是有可能出现问题的。他只是保证每次都到数据库中捞新的记录(sessionFactory.evit(class))
2 写SQL改表的结构。自增长。对应的hbm.xml改为native。下面就是项目中改表的SQl。改表的思路是这样的:
删除外键-->删除主键和约束-->创建临时表(结构和原表一样,主键设为自增长)-->赋值原表内容到临时表-->删除原表-->改临时表的名字为原表-->添加主键和约束-->添加外键。

这里要最后记住主键。外键。约束的名字。
以上都是用sql完成的。没有人工干预。

下面附上一段完整的sql代码:

你可能感兴趣的:(数据结构,sql,Hibernate,Web,SQL Server)