JPA+EHCache的使用总结

JPA+EHCache的使用总结

1.Update & Cascade

  1).One-Many, One-One時使用了Cascade-Persistence,保存Object的時候可以同時保存引用的Object。

  2)只在One-One并且關系非常緊密的時候使用Cascade-Update。One-Many則盡量不使用Cascade-Update。【一個 Detached的數據到底是不已經修改了Container應該是需要比較每一個Field之后才能确定,因此数据多了还是会影响效率。】

  3)One-One時只設置單向的Cascade-Update,尽量减少双向的Cascade-Update,例如可以在Update User的時候Cascade-Update PlayerSession,而不在Update PlayerSession的時候Update Player.

  4)在使用API時也需要注意這一點,通過Update"主"Object同時來保存引用的Object,如果沒有使用Cascade的Object需要單獨去Update或Persistent。 

 2. EhCache & Collections

  1).二級緩存適用于更新大大小與讀取的數據,Reference少的數據,數據量小的數據。

  2)Account類似"關鍵數據"不使用Cache

 3)Collections如果不緩存其中的Object那么緩存的只是Collections里面的對象的ID,不能緩存這些對象,只有緩存了這些對象才能緩存Collections中的Object。

  4)Collections里面的任何一個對象修改了都會引起Collections里面的重新讀取。

  5)SlotMachine里緩存了Room以及相關配置的數據和Table的數據,Table的數據修改也相對頻繁,是不是適合緩存需要進一步驗證。

  6)大数据量的Collections使用的时候一定要注意这一点。

 3.生成SQL

  1)openjpa提供了生成sql的插件,命令行執行如下:mvn org.codehaus.mojo:openjpa-maven-plugin:1.0:sql

  2) openjpa生成的mysql 缺省InnoDb, Hibernate生成的mysql表缺省為MyISAM。

  3)Foreign Key在測試環境不很需要加上,因為經常要清理數據,如果加上而沒有Cascade的話可能刪不掉任何一條數據。

  4)在SlotMachine的數據庫里沒有加上任何Foreign Key。因為在生產環境中的任何數據都不应该刪除。

 4.關于Enhance

  1)openjpa提供的enhance命令:

  在pom.xml里配置maven-antrun-plugin,設置:org.apache.openjpa.enhance.PCEnhancer

  mvn org.apache.maven.plugins:maven-antrun-plugin:1.3:run install

  2)也可以用org.codehaus.mojo插件進行Enhance

  3)OpenJPA Enhance以后可以顯著提高性能

  4)OpenJPA在Enhance以后不認識SQL里面的Class定義了?例如沒Enhance以前"Select p from Player p"可以執行而在Enhance以后就不認識了,或者是Enhance的方法不對出問題了。 

5.Hibernate JPA & SubClass

  Hibernate對SubClass的處理在LazyLoading的時候有問題,会提示ClassCastException,可以通过Deproxy来解决这个问题。

http://forum.hibernate.org/viewtopic.php?t=962876  

6.JTA & JTS

  1)Hibernate JPA ON Glassfish:

  需要在persistence.xml里增加:

  ,其他 配置和原來的使用方法沒有任何區別。

 7.OpenJPA & Hibernate JPA

  1)兩者都可以在在運行時進行Enhance,但OpenJPA對不同的Application Server需要配置不同的LoadTimeWeaver,Hibernate適應能力比較強,不需要配置單獨的LoadTimeWeaver,只需要設 置Hibernate VenderAdaptor就可以了。

  2)OpenJPA對Entity的使用方法要求更嚴格,例如:只要get***他都會Warn,認為是一個屬性,設置了Access Method的方法,引用Field的地方都要求使用get/set方法。

  3)Hibernate Provider很大的優勢就是Hibernate和Cache結合的比較好,但這好像不是Hibernate JPA Provider本身的優勢。

 8.Spring

  Spring可以通過PersistenceUnitManager配置使用的Persistence.xml,并制定Multiple Persistence.xml,并制定所有需要在Persistence.xml里設置的Property

  可以直接注入EntityManager或者注入EntityManagerFactory,通過EntityManagerFactory得到EntityManager。

  問題:

1.              當有多個EntityManagerFactory的時候Spring是怎么知道該用哪一個EntityManager的?

2.              當使用多個Persistence的時候如果類重復會出問題?例如:MyAccount這個應用中同時有百家樂和SlotMachine如果在同一個 SpringContext實例中就會需要load很多相同的對象就會警告已經Load了相同的對象。但現在Myaccount中百家樂是在單獨的一個 SpringContext中因此暫時沒有問題。 8.Access Field/Trigger

  Class && Sub Class需要使用相同的Access Field,很多人喜歡用AccessField,但OpenJPA給出的警告太多了。在SlotMachine里使用了AccessFiled + Triger【pre-persistence, pre-update, post-load】

 9.性能

   1)在OO的環境里看起來非常合理的事情對數據庫的效率來說好像不是很OK,例如:Player引用了Session那么每次保存的時候都需要保存一次Player,實際上Player的基礎數據并沒有任何变化,不过這與JPA本身無關。

   2)Collection的使用可能會引起的很大的性能問題,這也與JPA本身無關,慎重使用太大的Collection。

 

你可能感兴趣的:(java)