0

首先,

我有一个使用 JPA/Hibernate 设计的应用程序以实现持久性、一个 JMS 队列和一个与第三方系统的 SOAP Web 服务接口。该应用程序在集群的 JBoss EAP 6.0 服务器中运行。

有 2 个数据库,第一个是 Oracle 10g 数据库,我从中获取我想要处理的所有数据,第二个是 PostgreSQL 数据库,我将处理结果保存到其中。PostgreSQL 数据库用作持久缓存,因为处理来自 Oracle 10g 数据库的数据需要太多时间。整个过程是这样的:

  • 从 Oracle 10g 数据库中获取数据
  • 处理数据并生成结果
  • 将结果异步发送到持久 JMS 队列,并将结果作为 WebService XML 返回
  • MDB 使用队列中的结果并使用 JPA 将其保存在数据库中

但是,响应时间仍然太长,我们需要减少它。当我尝试使用 EHCACHE 作为带有 Hibernate 的二级缓存来缓存来自 PostgreSQL 数据库的结果时,缓存仅在我查询两次时才有效。也就是说,如果数据库中有任何更新、删除或插入,缓存就会与它不同步。我的问题是:

当我在数据库中更新/删除/插入某些内容时,我应该如何更新/同步 EHCACHE?

我的 persistence.xml 是:

<persistence-unit name="sDs" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>java:jboss/datasources/sDs</jta-data-source>

        <shared-cache-mode>DISABLE_SELECTIVE</shared-cache-mode>

        <mapping-file>META-INF/jpql/NamedQueries.xml</mapping-file>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>

        <class>x.AusenciaX</class>


       <properties>
            <property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />             
            <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />
            <property name="hibernate.cache.default_cache_concurrency_strategy" value="read-write" />
            <property name="hibernate.cache.use_second_level_cache" value="false"/>
            <property name="hibernate.cache.use_query_cache" value="false"/>
            <property name="hibernate.default_schema" value="sisfpj" /> 
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.generate_statistics" value="true" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
        </properties>
    </persistence-unit>

ehcache.xml:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd"
    updateCheck="false" monitoring="autodetect"
    dynamicConfig="true">

    <defaultCache
        maxElementsInMemory="1000"
        eternal="false"
        timeToIdleSeconds="86400"
        timeToLiveSeconds="86400"
        overflowToDisk="true"
    />
</ehcache>

提前致谢。

4

2 回答 2

0

可能是在您的 persistence.xml 文件中,该行 hibernate.cache.use_second_level_cache必须设置为true 否则您的缓存将不会被使用。

于 2013-08-08T11:31:48.857 回答
0

回答您的第一部分,缓存仅在我查询两次时才有效。第一次它将查询数据库并将其加载到缓存中,因此第二次查询它将从缓存而不是数据库加载。

于 2013-07-03T05:06:26.390 回答