系统优化之路——hibernate细节之战

来源:互联网 发布:防身甩棍淘宝网 编辑:程序博客网 时间:2024/04/30 10:19

        这两天在系统上线,测试提了一个BUG但是到我的机器上不能复现,和测试沟通后,在log里找到了bug的详细信息,显示在测试和我同时插入数据时,发现数据库爆出了违反唯一性约束的错误,当时我就意识到,有可能是ID生成策略的问题,经过几番教验发现,真的是细节决定成败!

问题:

        并发插入新数据,违反唯一性约束

原因:

        ID生成策略:

以前:

        increment 
        ----表示新增数据操作时由hibernate自动生成主键值。其生成的值为:先查询该主键列的最大值,然后在最大值的基础上加上1.适用于采用代理主键形式的主键列。同样不能用于主键列是自动增长的表。但是,该主键生成策略也有些缺点。 
        (1)新增数据前先查询一遍,影响了性能。 
        (2)主键的类型只能为数值型的int或者long 
        (3)并发操作时的冲突问题。 

更改:

        native 
        ----表示根据不同的数据库采用不同的主键生成策略。比如,当前数据库为sqlserver,则会采用identity,如为oracle,则采用 oracle中的sequence等。区分数据库的不同是以hibernate主配置文件中sessionFactory中配置的数据库方言。 


更改时考虑:

        1, increment 时,id类型已经为number,修改为其他类型,影响已有模块的逻辑!

        2,改动较少,对数据库的改动,仅仅是发个sql,不改变数据库和代码结构!


发散:

        在数据库配置中我们有一点疏忽, <class name="com.zlwy.rcss.entity.BBriefDict" table="B_BRIEF_DICT" schema="SEMS"> 大家看schema="SEMS",在oracle中这是规定只能有sems用户操作,虽然安全了一些,但是在移植数据库到用户机器的时候,发现,用户那的用户命名和我们不一样,我们要更改所有的表,去了这句话,虽然安全性降低了一点,但是移植性大大增加!


总结:

        细节决定成败,理论必须用于实践,HIbernate理论已经学了一年了,例子也敲了不少,真正用于项目才发现,理论离项目还很远,需要我们补充很多细节上的东西,需要我们了解80%配置的大概信息与功能,需要我们根据要求能迅速作出合适的变更,需要我们熟练基本的操作,在现场能迅速解决客户的问题,而且针对有过变成经验的客户,我们的专业与熟练恰恰是提升公司于个人声誉的重要手段!



   


0 0
原创粉丝点击