|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2008-07-04
说明一句:不管你用的是java cache产品还是非jvm的cache产品,实现对象粒度并具有事务性的缓存策略是orm这些框架的事,具体的缓存产品只是一个数据的存取位置。
我认为这些策略正是处理了事务性应用数据持久化方面80%的问题。 剩下的0.2,呵呵,比如,让只读事务使用FlushMode.NEVER,数据量大的,自己控制flush,减少sql语句数量,数据量达到构造过多的对象都成为瓶颈,那就不要构造对象了, |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-04
nihongye 写道 说明一句:不管你用的是java cache产品还是非jvm的cache产品,实现对象粒度并具有事务性的缓存策略是orm这些框架的事,具体的缓存产品只是一个数据的存取位置。
我认为这些策略正是处理了事务性应用数据持久化方面80%的问题。 剩下的0.2,呵呵,比如,让只读事务使用FlushMode.NEVER,数据量大的,自己控制flush,减少sql语句数量,数据量达到构造过多的对象都成为瓶颈,那就不要构造对象了, 我认为对象缓存要具有事务性这一点本身就是有问题的,这只会把问题越搞越复杂。一般要考虑到这种级别的缓存策略时,个人倾向与这两个最好分开,大规模的缓存不要牵涉到事务,否则达不到大幅度提升效率的效果。或者说这个时候更应该花精力在业务上,来进一步减少事务的长度,降低系统逻辑对事务的过度依赖,因为很多时候有些事务是没必要的。 cache我没说清楚,我的意思是一级缓存是有价值,ORM的二级缓存从整体上来看就是效率不高的,虽然比没有好,但是仍然是比较差的,自己稍加设计一个简单的对象缓存就能更大幅度的提高运行效率(当然是有这个的需求下,比如针对动态数据字典的缓存设计)。 我说的80%和你说的不是一回事,我说的是由使用了级联或者是跨事务的功能,例如merge产生的。这一点从一般的示例代码中是看不出的,表面上看级联提供了很好的封装,但是实际使用就会发现很多很诡异的现象,究其根本是不是每个人都深刻掌握了级联各种配置的实现原理,然后级联操作本身也没有对二级缓存做完全的同步,自己还是要写些额外代码。进一步,如saveOrUpdate()起不到提高效率的作用,反过来还降低代码可读性(谁有疑问,我给你们举详细例子),像all-delete-orphan这种强耦合要做业务级的重构是很不方便的,多对多级联的操作也是很难优化性能的,集群下跨事务的操作往往更多的带来的是性能的浪费,而不是减少数据库操作,这和SNA思想也是有点背道而驰的。当然有少数业务场景是需要这种技术的,比如类似于ATM机的功能,但是实际呢?国内银行往往用的还是老的技术,美其名曰保险起见,比如他们不相信数据库保证的JTA两段式提交,大多还是用的补偿机制,自己变相的做同步,当然造成这样的原因也有很多银行自己的问题(比如数据库太老,网管不肯开XA等)。 事务控制一般用的都是Spring的,虽然底层也调用了hibernate,但是单就事务传播这个特性上来讲,spring对减少复杂度提供的贡献是要超过hibernate的。 我的意思是Hibernate这类ORM提供了假设是100%的功能,但是其中有些很复杂,要花80%的时间去学习、去培训其他人、去调优,不值得。不如弃用这部分功能,就把Hibernate当作一个高级的Sql生成器。 既然要Sql高手(包括sql调优、数据抓取策略、数据库设计)才能用好Hibernate,还不如把Hibernate当作一个Sql生成器,也比把他当作所谓的ORM要好。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-04
我说的也是二级缓存的设计,在事务环境下,设计一个正确的对象二级缓存是件很难的事情。
二级缓存的cache问题,我遇到的一个:hibernate二级缓存对双向关系的处理,必须保证两个方向的一致性,否则,cache存在脏数据,这个问题不被hibernate的团队所接受,所以只能作为一个原则比接受了。你说的多对多关系,list,或者是很复杂的继承关系,奇怪的映射方式,我也是弃用的原则,中庸的使用hibernate,相比jpa做了很多简化。 无论是否有hibernate,只要涉及大数据量,免不了要懂得sql的优化 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-04
感觉用ibatis 来得爽
|
|
| 返回顶楼 | |
|
最后更新时间:2008-07-06
linux.sir 写道 感觉用ibatis 来得爽
两个问题: 1.ibatis如何解决动态创建sql的烦恼,有没有很好的解决方案,我看我们公司用ibatis的都使用配置脚本逻辑来动态拼sql,太原始了吧。 2.既然以sql为主,为何不用存储过程,难道sql语句放在配置文件中就比放在数据库中好维护么? |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-07
icewubin 写道 linux.sir 写道 感觉用ibatis 来得爽
两个问题: 1.ibatis如何解决动态创建sql的烦恼,有没有很好的解决方案,我看我们公司用ibatis的都使用配置脚本逻辑来动态拼sql,太原始了吧。 2.既然以sql为主,为何不用存储过程,难道sql语句放在配置文件中就比放在数据库中好维护么? Ibatis写起SQL来特别是INSERT, UPDATE, DELETE,一行一行的,也比较烦.动态SQL只能是在配置文件里用逻辑标签拼出来. 俺从IBATIS转向OPENJPA了。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-07
icewubin 写道 linux.sir 写道 感觉用ibatis 来得爽
两个问题: 1.ibatis如何解决动态创建sql的烦恼,有没有很好的解决方案,我看我们公司用ibatis的都使用配置脚本逻辑来动态拼sql,太原始了吧。 2.既然以sql为主,为何不用存储过程,难道sql语句放在配置文件中就比放在数据库中好维护么? 每个产品的出现肯定不会重蹈之前产品覆辙,所以ibatis也肯定不会跟sql一样,以sql为主这个概念被你偷换掉了.说到底,ibatis还是一个具有ORM功能的sql script解决方案.所以编写sql语句只能算是它的工作方法,而不是他的工作目的.看新事物要看它新在哪里,而不是拿长比短 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-08
Joo 写道 icewubin 写道 linux.sir 写道 感觉用ibatis 来得爽
两个问题: 1.ibatis如何解决动态创建sql的烦恼,有没有很好的解决方案,我看我们公司用ibatis的都使用配置脚本逻辑来动态拼sql,太原始了吧。 2.既然以sql为主,为何不用存储过程,难道sql语句放在配置文件中就比放在数据库中好维护么? 每个产品的出现肯定不会重蹈之前产品覆辙,所以ibatis也肯定不会跟sql一样,以sql为主这个概念被你偷换掉了.说到底,ibatis还是一个具有ORM功能的sql script解决方案.所以编写sql语句只能算是它的工作方法,而不是他的工作目的.看新事物要看它新在哪里,而不是拿长比短 少写几个字就被你说成“偷换概念”了?我说的sql为主,是指业务逻辑的所在,也包括“两个问题”的第一个。 真的要说拿长比短,我还没拿Hibernate中的原生sql支持或Spring的JDBCTemplate和iBatis比呢。 那你说说iBatis新事物,新在哪里?他的工作目的何在呢?长在哪里,短在哪里? 还有,我还没提iBatis的长短问题呢?我只是说了我对iBatis的一些困惑,请不要只说什么“长短”,多说点实际使用过程中,如果碰到我提到的两个困惑,一般是如何考虑的。 |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-08
引用 真的要说拿长比短,我还没拿Hibernate中的原生sql支持或Spring的JDBCTemplate和iBatis比呢。
Hibernate为什么会有支持native Sql的功能呢,就是因为有些事情还是需要sql(或者native sql)来做比较好啊,每个产品无不都是在灵活性和简便性之间求平衡,Hibernate偏左,ibatis偏右而已阿!!不同的侧重本身就是他们出生的目的 对于上面的两个问题: 1 写死,动态sql用的并不多的 2 不明白你说的以sql为主是做何解. |
|
| 返回顶楼 | |
|
最后更新时间:2008-07-08
初学JPA,关于实体之间的关系和级联问题,唉,感觉这些理解起来太难了。LS的大大们,都有些什么好经验啊。多给我们提提呗。
|
|
| 返回顶楼 | |









