Ehcache не может переполнить данные на диск в режиме XA (исключение NotSerializableException)

#java #spring #transactions #ehcache #xa

#java #spring #транзакции #ehcache #xa

Вопрос:

Я экспериментирую с транзакциями XA с Ehcache. В настоящее время я использую Spring transaction management и Bitronix в качестве менеджера транзакций.

Я создаю, настраиваю и заполняю кэш, используя метод, приведенный ниже:

 @Transactional
public void createCache() {
    this.cacheConfiguration = new CacheConfiguration("MyCache", 5000).diskPersistent(false).eternal(false)
            .diskExpiryThreadIntervalSeconds(1).maxElementsInMemory(70).transactionalMode(TransactionalMode.XA);
    final Configuration config = new Configuration();
    config.setDefaultCacheConfiguration(this.cacheConfiguration);
    final DiskStoreConfiguration diskStoreConfiguration = new DiskStoreConfiguration();
    diskStoreConfiguration.setPath("cache");
    config.addDiskStore(diskStoreConfiguration);
    this.cacheManager = new CacheManager(config);
    this.cacheConfiguration.name("primaryCache");
    this.cache = new Cache(this.cacheConfiguration);
    this.cacheManager.addCache(this.cache);

    for (int i = 0; i < 100; i  ) {
        final Integer value = Integer.valueOf(i);
        this.cache.put(new Element(value, value));
    }
}
  

Все работает нормально, и Ehcache работает так, как ожидалось, поскольку количество удаленных элементов превышает 70.

Теперь, если я изменю diskPersistent с false на true , это не сработает, как только Ehcache попытается скопировать какой-либо элемент в дисковое хранилище со следующим исключением:

 [primaryCache.data] ERROR n.s.e.s.c.f.DiskStorageFactory btm-gtrid=737072696E672D62746D0000012F9296448C00000000 - Disk Write of 0 failed (it will be evicted instead): 
java.io.NotSerializableException: net.sf.ehcache.transaction.ReadCommittedSoftLockImpl
  

Это ожидаемо, поскольку переключение Ehcache в транзакционный режим приводит к замене исходных значений Integer типа на SoftLock :

 [main] DEBUG n.s.e.t.local.LocalTransactionStore ehcache-txid=0, btm-gtrid=737072696E672D62746D0000012F9296448C00000000 - put: cache [primaryCache] key [0] was not in, soft lock inserted
  

Для полноты, это также происходит при использовании диспетчера транзакций Atomikos и работает безупречно, когда не используется режим XA.

Вопрос в следующем: есть ли способ совместить транзакции XA и переполнение диска?

Ответ №1:

Все должно работать так, как вы ожидаете, но вы только что обнаружили ошибку, которая полностью не позволяет постоянному хранилищу с открытым исходным кодом работать с любым транзакционным режимом.

Пожалуйста, сообщите о проблеме в Ehcache JIRA (https://jira.terracotta.org/jira/browse/EHC ) и мы исправим это, как только сможем.

Комментарии:

1. Я забыл упомянуть: постоянное хранилище на корпоративном диске, используемое при включенной большой памяти (т. Е. Когда overflowToOffHeap = true), не подвержено влиянию этой ошибки. Возможно, вы захотите рассмотреть это в то же время.

2. Конечно, но это больше не бесплатно (как пиво). В любом случае исправление находится в магистрали, и оно сработало в моем тесте. Спасибо.