EclipseLink Result Cache 不缓存结果
EclipseLink Result Cache not caching results
我想通过查询字符串+查询参数来缓存数据库查询的结果。
我正在使用 EclipseLink 的结果缓存来尝试实现此目的,但每次查询都会访问数据库。
注意:我用相同的注释和逻辑做了一个例子,但删除了所有业务领域术语。
我已经打开 mysql 一般查询日志并确认查询每次都在访问数据库。当我将命名查询更改为仅以 1 个参数为主键的查询时,查询将被缓存。
我试过在实体上同时使用@Cache 和@Cacheable 注释,但没有使用 Cache 注释。
文档指出,使用结果缓存您不需要主键或索引字段。
@Entity
@Table(name = "Ball")
@XmlRootElement
@Cache
@NamedQueries({
@NamedQuery(name="Ball.findBallWithColor",
query="SELECT b FROM Ball b WHERE b.color = :color",
hints = {
@QueryHint(name=QueryHints.QUERY_RESULTS_CACHE, value = "true"),
@QueryHint(name=QueryHints.QUERY_RESULTS_CACHE_SIZE, value = "10")
}
)})
public class Blue implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private BigInteger ballID
private Color color;
}
public enum Color {
BLUE,
YELLOW,
ORANGE,
RED;
}
创建命名查询并执行它的代码:
在向我们的端点发出 1 个请求的过程中多次调用此查询,并且每次查询都会访问数据库。
public List<Ball> findBallsWithColor(Color color) {
TypedQuery<InstitutionLtvCreditScoreGroup> query = em.createNamedQuery("Ball.findBallWithColor", Ball.class);
query.setParameter("color", Color.BLUE);
List<Ball> blueBalls = query.getResultList();
return blueBalls;
}
持久性单位:
<persistence-unit name="Example" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>${some_source}</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="eclipselink.weaving.changetracking"
value="false" />
<property name="eclipselink.target-database" value="MySQL" />
<property name="eclipselink.cache.coordination.protocol"
value="fish.payara.persistence.eclipselink.cache.coordination.HazelcastPublishingTransportManager" />
<property name="eclipselink.cache.coordination.channel"
value="myChannel" />
<property name="eclipselink.logging.logger"
value="org.eclipse.persistence.logging.DefaultSessionLog" />
<property name="eclipselink.logging.level" value="WARNING" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.jdbc.batch-writing.size"
value="1000" />
</properties>
</persistence-unit>
经过多次测试和阅读规范后,我实际上发现了一些非常微妙的缓存无法正常工作的原因。
JPA 2.2 定义了 @Cacheable 注解,可以与 persistence.xml 文件中的 <shared-cache-mode/>
属性 结合使用。
我们将其定义如下:<shared-cache-mode>ENABLE_SELECTIVE<shared-cache-mode/>
。这意味着在明确注释它们被缓存的实体上启用缓存。
问题是,属性 在 persistence.xml 中如此定义,我们必须在实体上使用 @cacheable 注释。 EclipseLink 2.7 具有注释扩展(规范中未找到注释)。其中之一是 @Cache,非常相似
所以 <shared-cache-mode>ENABLE_SELECTIVE<shared-cache-mode/>
@Cache
@Entity
class MyEntity {}
不会被缓存。
@Cacheable(true)
@Entity
class MyEntity{}
将被缓存。
eclipseLink 规范说使用 @Cache 代替 JPA 的 @Cacheable,但我认为这意味着我们可以'不要使用那种持久性 属性.
我想通过查询字符串+查询参数来缓存数据库查询的结果。
我正在使用 EclipseLink 的结果缓存来尝试实现此目的,但每次查询都会访问数据库。
注意:我用相同的注释和逻辑做了一个例子,但删除了所有业务领域术语。
我已经打开 mysql 一般查询日志并确认查询每次都在访问数据库。当我将命名查询更改为仅以 1 个参数为主键的查询时,查询将被缓存。
我试过在实体上同时使用@Cache 和@Cacheable 注释,但没有使用 Cache 注释。
文档指出,使用结果缓存您不需要主键或索引字段。
@Entity
@Table(name = "Ball")
@XmlRootElement
@Cache
@NamedQueries({
@NamedQuery(name="Ball.findBallWithColor",
query="SELECT b FROM Ball b WHERE b.color = :color",
hints = {
@QueryHint(name=QueryHints.QUERY_RESULTS_CACHE, value = "true"),
@QueryHint(name=QueryHints.QUERY_RESULTS_CACHE_SIZE, value = "10")
}
)})
public class Blue implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
private BigInteger ballID
private Color color;
}
public enum Color {
BLUE,
YELLOW,
ORANGE,
RED;
}
创建命名查询并执行它的代码: 在向我们的端点发出 1 个请求的过程中多次调用此查询,并且每次查询都会访问数据库。
public List<Ball> findBallsWithColor(Color color) {
TypedQuery<InstitutionLtvCreditScoreGroup> query = em.createNamedQuery("Ball.findBallWithColor", Ball.class);
query.setParameter("color", Color.BLUE);
List<Ball> blueBalls = query.getResultList();
return blueBalls;
}
持久性单位:
<persistence-unit name="Example" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>${some_source}</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
<properties>
<property name="eclipselink.weaving.changetracking"
value="false" />
<property name="eclipselink.target-database" value="MySQL" />
<property name="eclipselink.cache.coordination.protocol"
value="fish.payara.persistence.eclipselink.cache.coordination.HazelcastPublishingTransportManager" />
<property name="eclipselink.cache.coordination.channel"
value="myChannel" />
<property name="eclipselink.logging.logger"
value="org.eclipse.persistence.logging.DefaultSessionLog" />
<property name="eclipselink.logging.level" value="WARNING" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.jdbc.batch-writing.size"
value="1000" />
</properties>
</persistence-unit>
经过多次测试和阅读规范后,我实际上发现了一些非常微妙的缓存无法正常工作的原因。
JPA 2.2 定义了 @Cacheable 注解,可以与 persistence.xml 文件中的 <shared-cache-mode/>
属性 结合使用。
我们将其定义如下:<shared-cache-mode>ENABLE_SELECTIVE<shared-cache-mode/>
。这意味着在明确注释它们被缓存的实体上启用缓存。
问题是,属性 在 persistence.xml 中如此定义,我们必须在实体上使用 @cacheable 注释。 EclipseLink 2.7 具有注释扩展(规范中未找到注释)。其中之一是 @Cache,非常相似
所以 <shared-cache-mode>ENABLE_SELECTIVE<shared-cache-mode/>
@Cache
@Entity
class MyEntity {}
不会被缓存。
@Cacheable(true)
@Entity
class MyEntity{}
将被缓存。
eclipseLink 规范说使用 @Cache 代替 JPA 的 @Cacheable,但我认为这意味着我们可以'不要使用那种持久性 属性.