![](/img/trans.png)
[英]Hibernate Search, Infinispan, jgroups, Wildfly cluster integration configuration
[英]Wildfly - Infinispan Transactions configuration
我正在使用Wildfly 8.2及其隨附的Infinispan(6.0.2),並且試圖將來自某個Oracle數據庫表的所有值都緩存在Infispan緩存中。 在大多數情況下,它似乎有效,但有時卻無效。 當訪問cache.values()
(對於性能而言可能也不是一個好主意,但這只是一個示例),它有時看上去是空的,有時它正確地包含了這些值。 因此,我認為這可能與事務的配置有關。 使Infinispan緩存為非事務性時,問題消失了。
訪問緩存和數據庫的服務是具有容器管理事務的EJB bean。 服務初始化時,所有數據都從DB加載(其中不包含許多條目)。 根據ejb 3.2中的新功能,應該可以在EJB Singleton
bean中以事務方式訪問數據庫。
數據源和Infinispan緩存的配置是否正確? 我可以將非XA數據源與Infinispan一起使用,並期望它能始終如一地工作嗎? 根據Infinispan的文檔 , NON_XA
表示Infinispan正在注冊為同步,這應該沒問題嗎?
緩存在standalone-full.xml中的配置如下(當刪除<transaction mode="NON_XA" locking="PESSIMISTIC"/>
,問題消失了,但沒有事務緩存):
<cache-container name="cacheContainer" start="EAGER">
<local-cache name="my_table_cache">
<locking isolation="REPEATABLE_READ"/>
<transaction mode="NON_XA" locking="PESSIMISTIC"/>
</local-cache>
</cache-container>
Oracle DS定義如下
<datasource jndi-name="java:jboss/datasources/myDataSource" pool-name="dataSource" enabled="true">
<connection-url>jdbc:oracle:thin:@127.0.0.1:1523:orcl</connection-url>
<driver>ojdbc7.jar</driver>
<pool>
<max-pool-size>25</max-pool-size>
</pool>
<security>
<user-name>myuser</user-name>
<password>myuser</password>
</security>
<timeout>
<blocking-timeout-millis>5000</blocking-timeout-millis>
</timeout>
</datasource>
我的服務(Dao使用的是簡單的JDBC操作,而不是Hibernate或類似方法)
@Singleton
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
public class MyService {
@Resource(lookup = "java:jboss/infinispan/container/cacheContainer")
protected EmbeddedCacheManager cm;
protected Cache<String, MyEntity> cache;
@PostConstruct
private void init() {
try {
cache = getCache();
} catch (SQLException ex) {
log.fatal("could not initialize caches", ex);
throw new IllegalStateException(ex);
}
}
public Cache<String, MyEntity> getCache() {
Cache<String, MyEntity> cache = cm.getCache(getCacheName(), true);
fillCache(cache);
return cache;
}
protected void fillCache(Cache<String, MyEntity> cache) {
List<MyEntity> entities = myDao.getEntities();
for (MyEntity e : entities) {
cache.put(e.getKey, e);
}
}
public MyEntity getEntity(String key) {
return cache.get(key);
}
public void insert(MyEntity entity) {
myDao.insert(entity);
cache.put(entity.getKey(), entity);
}
public void debug() {
log.debug(cache.values());
}
}
當使用NON_XA事務時,未能在緩存中提交TX可能會使該事務得以提交,並且您將不會收到任何異常通知您緩存不一致。
至於cache.values()
,在Infinispan 7.0之前,它僅返回本地條目,但是在您的情況下這並不重要-對於本地緩存,所有條目都是本地的。 此操作的事務一致性應保持不變。 我看不到您的配置有任何問題。
通常,我建議您在Hibernate ORM中使用Infinispan模塊,而不是嘗試自己進行緩存,如此處所示。
根據接受的答案,配置正確。 如果有人遇到類似的問題:問題似乎是MyService.getEntity()
類的讀取方法之一在某些特定於應用程序的上下文中經常被極端調用(我不知道),因此使用樂觀鎖定和READ_COMMITTED代替的REPEATABLE_READ似乎可以按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.