Class JdbcStringBasedStore<K,​V>

  • All Implemented Interfaces:
    Lifecycle, AdvancedCacheExpirationWriter<K,​V>, AdvancedCacheLoader<K,​V>, AdvancedCacheWriter<K,​V>, AdvancedLoadWriteStore<K,​V>, CacheLoader<K,​V>, CacheWriter<K,​V>, ExternalStore<K,​V>, SegmentedAdvancedLoadWriteStore<K,​V>, TransactionalCacheWriter<K,​V>

    public class JdbcStringBasedStore<K,​V>
    extends Object
    implements SegmentedAdvancedLoadWriteStore<K,​V>, TransactionalCacheWriter<K,​V>
    AdvancedCacheLoader implementation that stores the entries in a database. This cache store will store each entry within a row in the table. This assures a finer grained granularity for all operation, and better performance. In order to be able to store non-string keys, it relies on an Key2StringMapper.

    Note that only the keys are stored as strings, the values are still saved as binary data. Using a character data type for the value column will result in unmarshalling errors.

    The actual storage table is defined through configuration JdbcStringBasedStoreConfiguration. The table can be created/dropped on-the-fly, at deployment time. For more details consult javadoc for JdbcStringBasedStoreConfiguration.

    Preload.In order to support preload functionality the store needs to read the string keys from the database and transform them into the corresponding key objects. Key2StringMapper only supports key to string transformation(one way); in order to be able to use preload one needs to specify an TwoWayKey2StringMapper, which extends Key2StringMapper and allows bidirectional transformation.

    Rehashing. When a node leaves/joins, Infinispan moves around persistent state as part of rehashing process. For this it needs access to the underlaying key objects, so if distribution is used, the mapper needs to be an TwoWayKey2StringMapper otherwise the cache won't start (same constraint as with preloading).

    Author:
    Mircea.Markus@jboss.com
    See Also:
    Key2StringMapper, DefaultTwoWayKey2StringMapper
    • Constructor Detail

      • JdbcStringBasedStore

        public JdbcStringBasedStore()
    • Method Detail

      • start

        public void start()
        Description copied from interface: Lifecycle
        Invoked on component start
        Specified by:
        start in interface Lifecycle
      • stop

        public void stop()
        Description copied from interface: Lifecycle
        Invoked on component stop
        Specified by:
        stop in interface Lifecycle
      • getConnectionFactory

        public org.infinispan.persistence.jdbc.connectionfactory.ConnectionFactory getConnectionFactory()
      • deleteBatch

        public void deleteBatch​(Iterable<Object> keys)
        Description copied from interface: CacheWriter
        Remove all provided keys from the store in a single batch operation. If this is not supported by the underlying store, then keys are removed from the store individually via CacheWriter.delete(Object).
        Specified by:
        deleteBatch in interface CacheWriter<K,​V>
        Parameters:
        keys - an Iterable of entry Keys to be removed from the store.
      • delete

        public boolean delete​(int segment,
                              Object key)
        Description copied from interface: SegmentedAdvancedLoadWriteStore
        Removes the entry for the provided key which is in the given segment. This method then returns whether the entry was removed or not.

        The provided segment may be used for performance purposes, however it it is acceptable to ignore this argument.

        This method may be invoked invoked irrespective if the store is StoreConfiguration.segmented().

        Specified by:
        delete in interface SegmentedAdvancedLoadWriteStore<K,​V>
        Parameters:
        segment - the segment that this key maps to
        key - the key of the entry to remove
        Returns:
        true if the entry existed in the persistent store and it was deleted.
      • delete

        public boolean delete​(Object key)
        Specified by:
        delete in interface CacheWriter<K,​V>
        Returns:
        true if the entry existed in the persistent store and it was deleted.
      • purge

        public void purge​(Executor executor,
                          AdvancedCacheWriter.PurgeListener purgeListener)
        Description copied from interface: AdvancedCacheWriter
        Using the thread in the pool, removed all the expired data from the persistence storage. For each removed entry, the supplied listener is invoked.

        When this method returns all entries will be purged and no tasks will be running due to this loader in the provided executor. If however an exception is thrown there could be tasks still pending or running in the executor.

        Specified by:
        purge in interface AdvancedCacheExpirationWriter<K,​V>
        Specified by:
        purge in interface AdvancedCacheWriter<K,​V>
      • contains

        public boolean contains​(int segment,
                                Object key)
        Description copied from interface: SegmentedAdvancedLoadWriteStore
        Returns true if the storage contains an entry associated with the given key in the given segment

        The provided segment may be used for performance purposes, however it it is acceptable to ignore this argument.

        This method may be invoked invoked irrespective if the store is StoreConfiguration.segmented().

        Specified by:
        contains in interface SegmentedAdvancedLoadWriteStore<K,​V>
        Parameters:
        segment - the segment that the key maps to
        key - the key to see if exists
        Returns:
        true if the key is present in this loader with a given segment
      • contains

        public boolean contains​(Object key)
        Description copied from interface: CacheLoader
        Returns true if the storage contains an entry associated with the given key.
        Specified by:
        contains in interface CacheLoader<K,​V>
      • publishKeys

        public io.reactivex.rxjava3.core.Flowable<K> publishKeys​(Predicate<? super K> filter)
        Description copied from interface: AdvancedCacheLoader
        Publishes all the keys from this store. The given publisher can be used by as many Subscribers as desired. Keys are not retrieved until a given Subscriber requests them from the Subscription.

        Stores will return only non expired keys

        Specified by:
        publishKeys in interface AdvancedCacheLoader<K,​V>
        Parameters:
        filter - a filter - null is treated as allowing all entries
        Returns:
        a publisher that will provide the keys from the store
      • publishKeys

        public org.reactivestreams.Publisher<K> publishKeys​(IntSet segments,
                                                            Predicate<? super K> filter)
        Description copied from interface: SegmentedAdvancedLoadWriteStore
        Publishes all the keys that map to the given segments from this store. The given publisher can be used by as many Subscribers as desired. Keys are not retrieved until a given Subscriber requests them from the Subscription.

        Stores will return only non expired keys

        The segments here must be adhered to and the keys published must not include any that don't belong to the provided segments.

        This method is not invoked invoked when the store is not configured to be StoreConfiguration.segmented().

        Specified by:
        publishKeys in interface SegmentedAdvancedLoadWriteStore<K,​V>
        Parameters:
        segments - the segments that the keys must map to. Always non null.
        filter - a filter
        Returns:
        a publisher that will provide the keys from the store
      • entryPublisher

        public io.reactivex.rxjava3.core.Flowable<MarshallableEntry<K,​V>> entryPublisher​(Predicate<? super K> filter,
                                                                                               boolean fetchValue,
                                                                                               boolean fetchMetadata)
        Description copied from interface: AdvancedCacheLoader
        Publishes all entries from this store. The given publisher can be used by as many Subscribers as desired. Entries are not retrieved until a given Subscriber requests them from the Subscription.

        If fetchMetadata is true this store must guarantee to not return any expired entries.

        Specified by:
        entryPublisher in interface AdvancedCacheLoader<K,​V>
        Parameters:
        filter - a filter - null is treated as allowing all entries
        fetchValue - whether or not to fetch the value from the persistent store. E.g. if the iteration is intended only over the key set, no point fetching the values from the persistent store as well
        fetchMetadata - whether or not to fetch the metadata from the persistent store. E.g. if the iteration is intended only ove the key set, then no point fetching the metadata from the persistent store as well
        Returns:
        a publisher that will provide the entries from the store
      • entryPublisher

        public org.reactivestreams.Publisher<MarshallableEntry<K,​V>> entryPublisher​(IntSet segments,
                                                                                          Predicate<? super K> filter,
                                                                                          boolean fetchValue,
                                                                                          boolean fetchMetadata)
        Description copied from interface: SegmentedAdvancedLoadWriteStore
        Publishes all entries from this store. The given publisher can be used by as many Subscribers as desired. Entries are not retrieved until a given Subscriber requests them from the Subscription.

        If fetchMetadata is true this store must guarantee to not return any expired entries.

        The segments here must be adhered to and the entries published must not include any that don't belong to the provided segments.

        This method is not invoked invoked when the store is not configured to be StoreConfiguration.segmented(). StoreConfiguration.segmented().

        Specified by:
        entryPublisher in interface SegmentedAdvancedLoadWriteStore<K,​V>
        Parameters:
        segments - the segments that the keys of the entries must map to. Always non null.
        filter - a filter on the keys of the entries that if passed will allow the given entry to be returned from the publisher
        fetchValue - whether the value should be included in the marshalled entry
        fetchMetadata - whether the metadata should be included in the marshalled entry
        Returns:
        a publisher that will provide the entries from the store that map to the given segments
      • prepareWithModifications

        public void prepareWithModifications​(Transaction transaction,
                                             org.infinispan.persistence.support.BatchModification batchModification)
                                      throws PersistenceException
        Description copied from interface: TransactionalCacheWriter
        Write modifications to the store in the prepare phase, as this is the only way we know the FINAL values of the entries. This is required to handle scenarios where an objects value is changed after the put command has been executed, but before the commit is called on the Tx.
        Specified by:
        prepareWithModifications in interface TransactionalCacheWriter<K,​V>
        Parameters:
        transaction - the current transactional context.
        batchModification - an object containing the write/remove operations required for this transaction.
        Throws:
        PersistenceException - if an error occurs when communicating/performing writes on the underlying store.
      • size

        public int size​(IntSet segments)
        Description copied from interface: SegmentedAdvancedLoadWriteStore
        Returns the number of elements in the store that map to the given segments that aren't expired.

        The segments here must be adhered to and the size must not count any entries that don't belong to the provided segments.

        This method is not invoked invoked when the store is not configured to be StoreConfiguration.segmented().

        Specified by:
        size in interface SegmentedAdvancedLoadWriteStore<K,​V>
        Parameters:
        segments - the segments which should have their entries counted. Always non null.
        Returns:
        the count of entries in the given segments
      • getTableManager

        public org.infinispan.persistence.jdbc.impl.table.TableManager getTableManager​(String cacheName)