本文介紹如何在Openxava應用程序上快速啟用Ehcache,從而提高性能。
查看實體及其圖時,將加載關系。 添加第二級緩存可加快關聯元素的檢索速度,因為已加載的元素是從緩存而不是數據庫中檢索的。
最終,該頁面解釋了分鐘項目如何遵守諾言:不寫任何內容。
例如,我們將以Lazuly分鐘項目展示為例。
Openxava-Ehcache集成
在Openxava中,您可以使用Java注釋的POJO來描述模型。注釋來自標準的JPA2 ORM和特定于Openxava的注釋。
但是沒有什么可以阻止您添加其他人。 完成添加緩存的操作。 還有一些配置可以啟用緩存。
行動清單
- 在源的根目錄添加ehcache.xml配置文件
- 修改persistence.xml以包括二級緩存
- 添加緩存注釋(與JPA2一起)
備注:
Openxava帶有ehcache.jar,因此無需添加依賴項。
詳細動作
添加ehcache.xml
在/ persistence處的ehcache.xml文件中
<ehcache><defaultCachemaxElementsInMemory="1000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="300"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="300"memoryStoreEvictionPolicy="LRU"/><cachename="your.domain.object"maxElementsInMemory="5000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="false"/>
</ehcache>
修改persistence.xml
Persistence.xml文件包含與永久單元有關的信息,例如連接池信息,
類或配置加載。 'persistence.xml'位于/ persistence / META-INF中
我們將附加L2緩存的屬性。
<properties><property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/><property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" /><property name="net.sf.ehcache.configurationResourceName" value="/ehcache.xml" /><property name="hibernate.cache.use_query_cache" value="true" /><property name="hibernate.cache.use_second_level_cache" value="true" /><property name="hibernate.generate_statistics" value="true" /> </properties>
添加緩存注釋
這里使用的是休眠注釋,而不是標準注釋(實際上,可緩存似乎不起作用)
將緩存注釋放置在域對象的類級別。
@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
例
懶惰的應用
Lazuly是一個示例數據庫,其中包含用于MinuteProject展示目的的會議信息。
Minuteproject生成了一組綜合的偽像,以加快OX應用程序的發布。
可以在Minuteproject 4 Openxava Lazuly展示柜中找到更多信息。 在這一部分,我們重點介紹為特定于緩存生成的偽像。 用于生成的Minuteproject本身基于配置文件,我們在其中定義數據模型以進行反向工程。 在此配置中,有一個擴充部分,您可以在其中添加信息。 處理實體類型中包含的內容類型的信息之一。 有4種可能性(參考數據,主數據,偽靜態數據,實時業務數據) 如果您使用content-type =“ master-data”或“ reference-data”豐富您的實體,MinuteProject 4 Openxava將生成關聯的緩存。
這是針對國家實體在這里完成的。
<entity name="COUNTRY" content-type="reference-data">
這是與緩存有關的偽像
ehcache.xml
<ehcache><!--Sets the path to the directory where cache files are created.If the path is a Java System Property it is replaced by its value in therunning VM.The following properties are translated:* user.home - User's home directory* user.dir - User's current working directory* java.io.tmpdir - Default temp file pathSubdirectories can be specified below the property e.g. java.io.tmpdir/one-->
<!--MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @ehcache-main-config-conference@--><diskStore path="java.io.tmpdir"/><!--Mandatory Default Cache configuration. These settings will be applied to cachescreated programmtically using CacheManager.add(String cacheName)--><defaultCachemaxElementsInMemory="1000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="300"overflowToDisk="false"diskPersistent="false"diskExpiryThreadIntervalSeconds="300"memoryStoreEvictionPolicy="LRU"/>
<!-- The unnamed query cache --><cachename="org.hibernate.cache.StandardQueryCache"maxElementsInMemory="1000"eternal="false"timeToLiveSeconds="300"overflowToDisk="false"/>
<!--MP-MANAGED-UPDATABLE-ENDING--><!--MP-MANAGED-UPDATABLE-BEGINNING-DISABLE @cache-entity-country-conference@--><cachename="net.sf.mp.demo.conference.domain.admin.Country"maxElementsInMemory="5000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="false"/>
<!--MP-MANAGED-UPDATABLE-ENDING--><!--MP-MANAGED-ADDED-AREA-BEGINNING @custom-cache-definition@-->
<!--MP-MANAGED-ADDED-AREA-ENDING @custom-cache-definition@--></ehcache>
Persistence.xml
<persistence xmlns="http://java.sun.com/xml/ns/persistence"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"version="1.0"><!-- Tomcat + Hypersonic --><persistence-unit name="default"><non-jta-data-source>java:comp/env/jdbc/conferenceDS</non-jta-data-source><class>org.openxava.session.GalleryImage</class><properties><property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/><property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletonEhCacheProvider" /><property name="net.sf.ehcache.configurationResourceName" value="/ehcache.xml" /><property name="hibernate.cache.use_query_cache" value="true" /><property name="hibernate.cache.use_second_level_cache" value="true" /><property name="hibernate.generate_statistics" value="true" />
<!--MP-MANAGED-ADDED-AREA-BEGINNING @properties@-->
<!--MP-MANAGED-ADDED-AREA-ENDING @properties@--></properties>
<!--MP-MANAGED-ADDED-AREA-BEGINNING @persistence-unit@-->
<!--MP-MANAGED-ADDED-AREA-ENDING @persistence-unit@--></persistence-unit> <!--MP-MANAGED-ADDED-AREA-BEGINNING @persistence@-->
<!--MP-MANAGED-ADDED-AREA-ENDING @persistence@--></persistence>
類注解
@org.hibernate.annotations.Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
//MP-MANAGED-ADDED-AREA-BEGINNING @class-annotation@
//MP-MANAGED-ADDED-AREA-ENDING @class-annotation@
public class Country {@Hidden @Id @Column(name="id" )@GeneratedValue(strategy = GenerationType.AUTO)private Integer id;
...
生成的代碼備注
生成的代碼在文件擴展名注釋中包含標記。
在MP-MANAGED-ADDED-AREA-BEGINNING和MP-MANAGED-ADDED-AREA-ENDING中,您可以放置??自定義代碼
在MP-MANAGED-UPDATABLE-BEGINNING-DISABLE和MP-MANAGED-UPDATABLE-ENDING中,您可以更改代碼。 要保留您的修改,請將MP-MANAGED-UPDATABLE-BEGINNING-DISABLE更改為MP-MANAGED-UPDATABLE-BEGINNING-ENABLE。 可更新的代碼可防止您連續幾代丟失定制。
有關可更新代碼的更多信息,請參見Minuteproject可更新代碼 。
代
- 將以下文件mp-config-LAZULY-OPENXAVA.xml放在/ mywork / config中
- 在提示符下執行mp-model-generation(.sh / cmd)mp-config-LAZULY-OPENXAVA.xml
- / DEV / output / openxava / conference中產生的人工制品
要生成,請使用mp-config-LAZULY-OPENXAVA.xml的更新版本
<!DOCTYPE root>
<generator-config><configuration><conventions><target-convention type="enable-updatable-code-feature" /></conventions> <model name="conference" version="1.0" package-root="net.sf.mp.demo"><data-model><driver name="mysql" version="5.1.16" groupId="mysql" artifactId="mysql-connector-java"></driver><dataSource><driverClassName>org.gjt.mm.mysql.Driver</driverClassName><url>jdbc:mysql://127.0.0.1:3306/conference</url><username>root</username><password>mysql</password></dataSource><!--for Oracle and DB2 please set the schema <schema> </schema>--><primaryKeyPolicy oneGlobal="true"><primaryKeyPolicyPattern name="autoincrementPattern"></primaryKeyPolicyPattern></primaryKeyPolicy></data-model><business-model><!--<generation-condition> <condition type="exclude"startsWith="DUAL"></condition> </generation-condition>--><business-package default="conference"><condition type="package" startsWith="STAT" result="statistics"></condition><condition type="package" startsWith="COUNTRY" result="admin"></condition><condition type="package" startsWith="ROLE" result="admin"></condition> </business-package><enrichment><conventions><column-naming-convention type="apply-strip-column-name-suffix"pattern-to-strip="_ID" /><reference-naming-conventiontype="apply-referenced-alias-when-no-ambiguity" is-to-plurialize="true" /></conventions><entity name="COUNTRY" content-type="reference-data"><semantic-reference><sql-path path="NAME" /></semantic-reference></entity><entity name="CONFERENCE_MEMBER"><semantic-reference><sql-path path="FIRST_NAME" /><sql-path path="LAST_NAME" /></semantic-reference><field name="STATUS"><property tag="checkconstraint" alias="conference_member_status"><property name="PENDING" value="PENDING" /><property name="ACTIVE" value="ACTIVE" /></property></field><field name="EMAIL"><stereotype stereotype="EMAIL" /></field></entity><entity name="SPEAKER"><field name="BIO"><stereotype stereotype="HTML_TEXT" /></field><field name="PHOTO"><stereotype stereotype="PHOTO" /></field><field name="WEB_SITE_URL"><stereotype stereotype="WEBURL" /></field></entity><entity name="PRESENTATION"><field name="STATUS"><property tag="checkconstraint" alias="presentation_status"><property name="PROPOSAL" value="PROPOSAL" /><property name="ACTIVE" value="ACTIVE" /></property></field></entity><entity name="SPONSOR"><field name="STATUS"><property tag="checkconstraint" alias="sponsor_status"><property name="PENDING" value="PENDING" /><property name="ACTIVE" value="ACTIVE" /></property></field><field name="PRIVILEGE_TYPE"><property tag="checkconstraint" alias="sponsor_privilege"><property name="GOLDEN" value="Golden" /><property name="SILVER" value="Silver" /><property name="BRONZE" value="Bronze" /></property></field></entity><!-- views --><entity name="stat_mb_per_ctry_conf" alias="MEMBER_PER_COUNTRY_AND_CONFERENCE"><virtual-primary-key isRealPrimaryKey="true"><property name="virtualPrimaryKey" value="ID" /></virtual-primary-key></entity><entity name="stat_mb_by_role" alias="MEMBER_PER_ROLE_COUNTRY_AND_CONFERENCE"><virtual-primary-key isRealPrimaryKey="true"><property name="virtualPrimaryKey" value="id" /></virtual-primary-key><field name="stat_mb_per_ctry_conf_ID" linkToTargetEntity="stat_mb_per_ctry_conf"linkToTargetField="id"></field></entity></enrichment></business-model></model><targets><!-- openxava --><target refname="OpenXava" name="OpenXava"fileName="mp-template-config-openxava-last-features.xml"outputdir-root="../../DEV/output/openxava/conference"templatedir-root="../../template/framework/openxava"></target><target refname="JPA2-LIB" fileName="mp-template-config-JPA2-LIB.xml"templatedir-root="../../template/framework/jpa"></target><target refname="BSLA-LIB" fileName="mp-template-config-bsla-LIB-features.xml"templatedir-root="../../template/framework/bsla"></target><target refname="CACHE-LIB" fileName="mp-template-config-CACHE-LIB.xml" templatedir-root="../../template/framework/cache"></target></targets></configuration>
</generator-config>
測試
為確保緩存正常工作:
- 啟用休眠日志記錄。 將以下代碼段作為額外屬性添加到persistence.xml中。
<property name="hibernate.show_sql" value="true" /><property name="hibernate.format_sql" value="true" />
- 導航到引用國家/地區的實體(示例地址)
- 當您查看此實體的詳細信息時,您會注意到相關實體“國家”的負載很大
- 但是,第二次訪問該實體(或引用同一國家/地區實例的另一個實體)的詳細信息時,該國家/地區不會從數據庫中加載兩次。
參考: JCG合作伙伴 將Ehcache添加到Openxava應用程序 ? 分鐘項目博客上的 Florian Adler。
翻譯自: https://www.javacodegeeks.com/2012/03/adding-ehcache-to-openxava-application.html