Java 类org.hibernate.cache.spi.access.SoftLock 实例源码

项目:lams    文件:CollectionAction.java   
@Override
public final void beforeExecutions() throws CacheException {
    // we need to obtain the lock before any actions are executed, since this may be an inverse="true"
    // bidirectional association and it is one of the earlier entity actions which actually updates
    // the database (this action is responsible for second-level cache invalidation only)
    if ( persister.hasCache() ) {
        final CacheKey ck = session.generateCacheKey(
                key,
                persister.getKeyType(),
                persister.getRole()
        );
        final SoftLock lock = persister.getCacheAccessStrategy().lockItem( ck, null );
        // the old behavior used key as opposed to getKey()
        afterTransactionProcess = new CacheCleanupProcess( key, persister, lock );
    }
}
项目:hazelcast-hibernate5    文件:LocalRegionCache.java   
@Override
public SoftLock tryLock(final Object key, final Object version) {
    ExpiryMarker marker;
    String markerId = nextMarkerId();
    while (true) {
        final Expirable original = cache.get(key);
        long timeout = nextTimestamp() + CacheEnvironment.getDefaultCacheTimeoutInMillis();
        if (original == null) {
            marker = new ExpiryMarker(version, timeout, markerId);
            if (cache.putIfAbsent(key, marker) == null) {
                break;
            }
        } else {
            marker = original.markForExpiration(timeout, markerId);
            if (cache.replace(key, original, marker)) {
                break;
            }
        }
    }
    return new MarkerWrapper(marker);
}
项目:hazelcast-hibernate    文件:LocalRegionCache.java   
public SoftLock tryLock(final Object key, final Object version) {
    ExpiryMarker marker;
    String markerId = nextMarkerId();
    while (true) {
        final Expirable original = cache.get(key);
        long timeout = nextTimestamp() + CacheEnvironment.getDefaultCacheTimeoutInMillis();
        if (original == null) {
            marker = new ExpiryMarker(version, timeout, markerId);
            if (cache.putIfAbsent(key, marker) == null) {
                break;
            }
        } else {
            marker = original.markForExpiration(timeout, markerId);
            if (cache.replace(key, original, marker)) {
                break;
            }
        }
    }
    return new MarkerWrapper(marker);
}
项目:hazelcast-hibernate    文件:LocalRegionCache.java   
public void unlock(final Object key, SoftLock lock) {
    while (true) {
        final Expirable original = cache.get(key);
        if (original != null) {
            if (!(lock instanceof MarkerWrapper)) {
                break;
            }
            final ExpiryMarker unwrappedMarker = ((MarkerWrapper) lock).getMarker();
            if (original.matches(unwrappedMarker)) {
                final Expirable revised = ((ExpiryMarker) original).expire(nextTimestamp());
                if (cache.replace(key, original, revised)) {
                    break;
                }
            } else if (original.getValue() != null) {
                if (cache.remove(key, original)) {
                    break;
                }
            } else {
                break;
            }
        } else {
            break;
        }
    }
    maybeNotifyTopic(key, null, null);
}
项目:TayzGrid    文件:ReadWriteTayzGridRegionAccessStrategy.java   
/**
 * Called when we have finished the attempted update/delete (which may or
 * may not have been successful), after transaction completion. This method
 * is used by "asynchronous" concurrency strategies.
 *
 * @param key The item key
 * @param lock The lock previously obtained from {@link #lockItem}
 * @throws org.hibernate.cache.CacheException Propogated from underlying
 * {@link org.hibernate.cache.spi.Region}
 */
@Override
public void unlockItem(Object key, SoftLock lock) throws CacheException {
    try {
        _region.getCache().lock(key);

        Lockable lockable = (Lockable) _region.getCache().get(key);
        if (isUnlockable(lock, lockable)) {
            ((Lock) lockable).unlock(_region.nextTimestamp());
            _region.getCache().put(key, lockable);
        } else {
            handleLockExpiry(key);
        }
    } finally {
        _region.getCache().unlock(key);
    }
}
项目:hibernate-l2-memcached    文件:ReadWriteMemcachedEntityRegionAccessStrategy.java   
/**
 * {@inheritDoc}
 * <p>
 * Updates will only succeed if this entry was locked by this transaction and exclusively this transaction for the
 * duration of this transaction.  It is important to also note that updates will fail if the soft-lock expired during
 * the course of this transaction.
 */
@Override
public boolean afterUpdate(SharedSessionContractImplementor session, Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock)
        throws CacheException {
    //what should we do with previousVersion here?
    region.getCache().lock(key);
    try {
        final Lockable item = (Lockable) region().get(key);

        if (item != null && item.isUnlockable(lock)) {
            final Lock lockItem = (Lock) item;
            if (lockItem.wasLockedConcurrently()) {
                decrementLock(key, lockItem);
                return false;
            } else {
                region().put(key, new Item(value, currentVersion, region.nextTimestamp()));
                return true;
            }
        } else {
            handleLockExpiry(key, item);
            return false;
        }
    } finally {
        region.getCache().unlock(key);
    }
}
项目:hibernate-l2-memcached    文件:ReadWriteMemcachedNaturalIdRegionAccessStrategy.java   
/**
 * {@inheritDoc}
 * <p>
 * Updates will only succeed if this entry was locked by this transaction and exclusively this transaction for the
 * duration of this transaction.  It is important to also note that updates will fail if the soft-lock expired during
 * the course of this transaction.
 */
@Override
public boolean afterUpdate(SharedSessionContractImplementor session, Object key, Object value, SoftLock lock) throws CacheException {
    //what should we do with previousVersion here?
    region.getCache().lock(key);
    try {
        final Lockable item = (Lockable) region().get(key);

        if (item != null && item.isUnlockable(lock)) {
            final Lock lockItem = (Lock) item;
            if (lockItem.wasLockedConcurrently()) {
                decrementLock(key, lockItem);
                return false;
            } else {
                region().put(key, new Item(value, null, region.nextTimestamp()));
                return true;
            }
        } else {
            handleLockExpiry(key, item);
            return false;
        }
    } finally {
        region.getCache().unlock(key);
    }
}
项目:hibernate-memcached    文件:AbstractReadWriteMemcachedAccessStrategy.java   
public boolean afterUpdate(Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock) throws CacheException {
    if(region.writeLock(key)) {
        try {
            Item item = (Item) region.get(key);
            if(item == null || item.isWriteable(currentVersion, versionCompator)) {
                region.put(key, new Item(currentVersion, region.nextTimestamp(), value));
                return true;
            } else {
                return false;
            }
        } finally {
            region.releaseLock(key);
        }
    }
    return false;
}
项目:hibernate4-memcached    文件:AbstractReadWriteAccessStrategy.java   
/**
 * Soft-unlock a cache item.
 */
public final void unlockItem(Object key, SoftLock lock) throws CacheException {

    try {
        log.debug("unlocking key[{}] in region[{}]", key, getInternalRegion().getName());
        writeLock.lock();
        Lockable item = (Lockable) getInternalRegion().get(key);

        if ((item != null) && item.isUnlockable(lock)) {
            decrementLock(key, (Lock) item);
        } else {
            handleLockExpiry(key, item);
        }
    } finally {
        writeLock.unlock();
    }
}
项目:hibernate4-memcached    文件:ReadWriteNaturalIdRegionAccessStrategy.java   
@Override
public boolean afterUpdate(Object key, Object value, SoftLock lock) throws CacheException {
    try {
        writeLock.lock();
        Lockable item = (Lockable) region.get( key );

        if ( item != null && item.isUnlockable( lock ) ) {
            Lock lockItem = (Lock) item;
            if ( lockItem.wasLockedConcurrently() ) {
                decrementLock( key, lockItem );
                return false;
            }
            else {
                region.put( key, new Item( value, null, region.nextTimestamp() ) );
                return true;
            }
        }
        else {
            handleLockExpiry( key, item );
            return false;
        }
    }
    finally {
        writeLock.unlock();
    }
}
项目:lams    文件:DefaultLoadEventListener.java   
/**
 * If the class to be loaded has been configured with a cache, then lock
 * given id in that cache and then perform the load.
 *
 * @param event The initiating load request event
 * @param persister The persister corresponding to the entity to be loaded
 * @param keyToLoad The key of the entity to be loaded
 * @param options The defined load options
 * @param source The originating session
 *
 * @return The loaded entity
 *
 * @throws HibernateException
 */
protected Object lockAndLoad(
        final LoadEvent event,
        final EntityPersister persister,
        final EntityKey keyToLoad,
        final LoadEventListener.LoadType options,
        final SessionImplementor source) {
    SoftLock lock = null;
    final CacheKey ck;
    if ( persister.hasCache() ) {
        ck = source.generateCacheKey(
                event.getEntityId(),
                persister.getIdentifierType(),
                persister.getRootEntityName()
        );
        lock = persister.getCacheAccessStrategy().lockItem( ck, null );
    }
    else {
        ck = null;
    }

    Object entity;
    try {
        entity = load( event, persister, keyToLoad, options );
    }
    finally {
        if ( persister.hasCache() ) {
            persister.getCacheAccessStrategy().unlockItem( ck, lock );
        }
    }

    return event.getSession().getPersistenceContext().proxyFor( persister, keyToLoad, entity );
}
项目:hazelcast-hibernate5    文件:LocalRegionCache.java   
@Override
public void unlock(final Object key, final SoftLock lock) {
    while (true) {
        final Expirable original = cache.get(key);
        if (original != null) {
            if (!(lock instanceof MarkerWrapper)) {
                break;
            }
            final ExpiryMarker unwrappedMarker = ((MarkerWrapper) lock).getMarker();
            if (original.matches(unwrappedMarker)) {
                final Expirable revised = ((ExpiryMarker) original).expire(nextTimestamp());
                if (cache.replace(key, original, revised)) {
                    break;
                }
            } else if (original.getValue() != null) {
                if (cache.remove(key, original)) {
                    break;
                }
            } else {
                break;
            }
        } else {
            break;
        }
    }
    maybeNotifyTopic(key, null, null);
}
项目:hazelcast-hibernate5    文件:ReadWriteAccessDelegate.java   
/**
 * {@inheritDoc}
 * <p/>
 * Called after <code>com.hazelcast.ReadWriteAccessDelegate.lockItem()</code>
 */
@Override
public boolean afterUpdate(final Object key, final Object value, final Object currentVersion,
                           final Object previousVersion, final SoftLock lock) throws CacheException {
    try {
        return cache.update(key, value, currentVersion, lock);
    } catch (HazelcastException e) {
        if (log.isFinestEnabled()) {
            log.finest("Could not update Cache[" + hazelcastRegion.getName() + "]: " + e.getMessage());
        }
        return false;
    }
}
项目:hazelcast-hibernate5    文件:ReadOnlyAccessDelegate.java   
/**
 * @throws UnsupportedOperationException
 */
@Override
public boolean afterUpdate(final Object key, final Object value, final Object currentVersion,
                           final Object previousVersion, final SoftLock lock) throws CacheException {
    throw new UnsupportedOperationException("Cannot update an item in a read-only cache: "
            + getHazelcastRegion().getName());
}
项目:hazelcast-hibernate5    文件:ReadOnlyAccessDelegate.java   
/**
 * {@inheritDoc}
 * <p/>
 * Should be a no-op since this cache is read-only
 */
@Override
public void unlockItem(final Object key, final SoftLock lock) throws CacheException {
    /*
     * To err on the safe side though, follow ReadOnlyEhcacheEntityRegionAccessStrategy which nevertheless evicts
     * the key.
     */
    evict(key);
}
项目:hazelcast-hibernate5    文件:IMapRegionCache.java   
@Override
public boolean update(final Object key, final Object newValue, final Object newVersion, final SoftLock lock) {
    if (lock instanceof MarkerWrapper) {
        final ExpiryMarker unwrappedMarker = ((MarkerWrapper) lock).getMarker();
        return (Boolean) map.executeOnKey(key, new UpdateEntryProcessor(unwrappedMarker, newValue, newVersion,
                nextMarkerId(), nextTimestamp(hazelcastInstance)));
    } else {
        return false;
    }
}
项目:hazelcast-hibernate5    文件:IMapRegionCache.java   
@Override
public SoftLock tryLock(final Object key, final Object version) {
    long timeout = nextTimestamp(hazelcastInstance) + lockTimeout;
    final ExpiryMarker marker = (ExpiryMarker) map.executeOnKey(key,
            new LockEntryProcessor(nextMarkerId(), timeout, version));
    return new MarkerWrapper(marker);
}
项目:hazelcast-hibernate5    文件:IMapRegionCache.java   
@Override
public void unlock(final Object key, final SoftLock lock) {
    if (lock instanceof MarkerWrapper) {
        final ExpiryMarker unwrappedMarker = ((MarkerWrapper) lock).getMarker();
        map.executeOnKey(key, new UnlockEntryProcessor(unwrappedMarker, nextMarkerId(),
                nextTimestamp(hazelcastInstance)));
    }
}
项目:hazelcast-hibernate    文件:ReadWriteAccessDelegate.java   
/**
 * {@inheritDoc}
 * <p>
 * Called after <code>com.hazelcast.ReadWriteAccessDelegate.lockItem()</code>
 * </p>
 */
@Override
public boolean afterUpdate(final Object key, final Object value, final Object currentVersion, final Object previousVersion,
                           final SoftLock lock) throws CacheException {
    try {
        return cache.update(key, value, currentVersion, lock);
    } catch (HazelcastException e) {
        if (log.isFinestEnabled()) {
            log.finest("Could not update Cache[" + hazelcastRegion.getName() + "]: " + e.getMessage());
        }
        return false;
    }
}
项目:hazelcast-hibernate    文件:ReadOnlyAccessDelegate.java   
/**
 * @throws UnsupportedOperationException Always thrown as we cannot update an item in a read-only cache
 */
@Override
public boolean afterUpdate(final Object key, final Object value, final Object currentVersion,
                           final Object previousVersion, final SoftLock lock) throws CacheException {
    throw new UnsupportedOperationException("Cannot update an item in a read-only cache: "
            + getHazelcastRegion().getName());
}
项目:hazelcast-hibernate    文件:ReadOnlyAccessDelegate.java   
/**
 * {@inheritDoc}
 * <p>
 * Should be a no-op since this cache is read-only
 * </p>
 */
@Override
public void unlockItem(final Object key, final SoftLock lock) throws CacheException {
    /*
     * To err on the safe side though, follow ReadOnlyEhcacheEntityRegionAccessStrategy which nevertheless evicts
     * the key.
     */
    evict(key);
}
项目:hazelcast-hibernate    文件:IMapRegionCache.java   
public boolean update(final Object key, final Object newValue, final Object newVersion, final SoftLock lock) {
    if (lock instanceof MarkerWrapper) {
        final ExpiryMarker unwrappedMarker = ((MarkerWrapper) lock).getMarker();
        return (Boolean) map.executeOnKey(key, new UpdateEntryProcessor(unwrappedMarker, newValue, newVersion,
                nextMarkerId(), nextTimestamp(hazelcastInstance)));
    } else {
        return false;
    }
}
项目:hazelcast-hibernate    文件:IMapRegionCache.java   
public void unlock(final Object key, SoftLock lock) {
    if (lock instanceof MarkerWrapper) {
        final ExpiryMarker unwrappedMarker = ((MarkerWrapper) lock).getMarker();
        map.executeOnKey(key, new UnlockEntryProcessor(unwrappedMarker, nextMarkerId(),
                nextTimestamp(hazelcastInstance)));
    }
}
项目:hibernate-l2-memcached    文件:AbstractReadWriteMemcachedAccessStrategy.java   
/**
 * Soft-unlock a cache item.
 */
public final void unlockItem(SharedSessionContractImplementor session, Object key, SoftLock lock) throws CacheException {
    region.getCache().lock(key);
    try {
        final Lockable item = (Lockable) region().get(key);

        if ((item != null) && item.isUnlockable(lock)) {
            decrementLock(key, (Lock) item);
        } else {
            handleLockExpiry(key, item);
        }
    } finally {
        region.getCache().unlock(key);
    }
}
项目:hibernate4-memcached    文件:ReadWriteEntityRegionAccessStrategy.java   
@Override
public boolean afterUpdate(Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock)
        throws CacheException {
    try {
        writeLock.lock();
        Lockable item = (Lockable) region.get( key );

        if ( item != null && item.isUnlockable( lock ) ) {
            Lock lockItem = (Lock) item;
            if ( lockItem.wasLockedConcurrently() ) {
                decrementLock( key, lockItem );
                return false;
            }
            else {
                region.put( key, new Item( value, currentVersion, region.nextTimestamp() ) );
                return true;
            }
        }
        else {
            handleLockExpiry( key, item );
            return false;
        }
    }
    finally {
        writeLock.unlock();
    }
}
项目:hibernate4-memcached    文件:ReadOnlyEntityRegionAccessStrategy.java   
/**
 * Throws UnsupportedOperationException since this cache is read-only
 *
 * @throws UnsupportedOperationException always
 */
@Override
public boolean afterUpdate(Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock)
        throws CacheException {
    LOG.invalidEditOfReadOnlyItem( key );
    throw new UnsupportedOperationException( "Can't write to a readonly object" );
}
项目:hibernate4-memcached    文件:NonstrictReadWriteEntityRegionAccessStrategy.java   
/**
 * need evict the key, after update.
 *
 * @see org.hibernate.cache.spi.access.EntityRegionAccessStrategy
 */
@Override
public boolean afterUpdate(Object key, Object value, Object currentVersion, Object previousVersion, SoftLock lock) throws CacheException {
    log.debug("region access strategy nonstrict-read-write entity afterUpdate() {} {}", getInternalRegion().getCacheNamespace(), key);
    getInternalRegion().evict(key);
    return false;
}
项目:hibernate4-memcached    文件:NonstrictReadWriteNaturalIdRegionAccessStrategy.java   
/**
 * need evict the key, after update.
 *
 * @see org.hibernate.cache.spi.access.NaturalIdRegionAccessStrategy
 */
@Override
public boolean afterUpdate(Object key, Object value, SoftLock lock) throws CacheException {
    log.debug("region access strategy nonstrict-read-write naturalId afterUpdate() {} {}", getInternalRegion().getCacheNamespace(), key);
    getInternalRegion().evict(key);
    return false;
}
项目:lams    文件:AbstractLockUpgradeEventListener.java   
/**
 * Performs a pessimistic lock upgrade on a given entity, if needed.
 *
 * @param object The entity for which to upgrade the lock.
 * @param entry The entity's EntityEntry instance.
 * @param lockOptions contains the requested lock mode.
 * @param source The session which is the source of the event being processed.
 */
protected void upgradeLock(Object object, EntityEntry entry, LockOptions lockOptions, EventSource source) {

    LockMode requestedLockMode = lockOptions.getLockMode();
    if ( requestedLockMode.greaterThan( entry.getLockMode() ) ) {
        // The user requested a "greater" (i.e. more restrictive) form of
        // pessimistic lock

        if ( entry.getStatus() != Status.MANAGED ) {
            throw new ObjectDeletedException(
                    "attempted to lock a deleted instance",
                    entry.getId(),
                    entry.getPersister().getEntityName()
            );
        }

        final EntityPersister persister = entry.getPersister();

        if ( log.isTraceEnabled() ) {
            log.tracev(
                    "Locking {0} in mode: {1}",
                    MessageHelper.infoString( persister, entry.getId(), source.getFactory() ),
                    requestedLockMode
            );
        }

        final SoftLock lock;
        final CacheKey ck;
        if ( persister.hasCache() ) {
            ck = source.generateCacheKey( entry.getId(), persister.getIdentifierType(), persister.getRootEntityName() );
            lock = persister.getCacheAccessStrategy().lockItem( ck, entry.getVersion() );
        }
        else {
            ck = null;
            lock = null;
        }

        try {
            if ( persister.isVersioned() && requestedLockMode == LockMode.FORCE  ) {
                // todo : should we check the current isolation mode explicitly?
                Object nextVersion = persister.forceVersionIncrement(
                        entry.getId(), entry.getVersion(), source
                );
                entry.forceLocked( object, nextVersion );
            }
            else {
                persister.lock( entry.getId(), entry.getVersion(), object, lockOptions, source );
            }
            entry.setLockMode(requestedLockMode);
        }
        finally {
            // the database now holds a lock + the object is flushed from the cache,
            // so release the soft lock
            if ( persister.hasCache() ) {
                persister.getCacheAccessStrategy().unlockItem( ck, lock );
            }
        }

    }
}
项目:lams    文件:CollectionAction.java   
private CacheCleanupProcess(Serializable key, CollectionPersister persister, SoftLock lock) {
    this.key = key;
    this.persister = persister;
    this.lock = lock;
}
项目:hazelcast-hibernate5    文件:LocalRegionCache.java   
@Override
public boolean update(final Object key, final Object newValue, final Object newVersion, final SoftLock softLock) {
    boolean updated = false;
    while (true) {
        Expirable original = cache.get(key);
        Expirable revised;
        long timestamp = nextTimestamp();
        if (original == null) {
            // The entry must have expired. it should be safe to update
            revised = new Value(newVersion, timestamp, newValue);
            updated = true;
            if (cache.putIfAbsent(key, revised) == null) {
                break;
            }
        } else {
            if (softLock instanceof MarkerWrapper) {
                final ExpiryMarker unwrappedMarker = ((MarkerWrapper) softLock).getMarker();
                if (original.matches(unwrappedMarker)) {
                    // The lock matches
                    final ExpiryMarker marker = (ExpiryMarker) original;
                    if (marker.isConcurrent()) {
                        revised = marker.expire(timestamp);
                        updated = false;
                    } else {
                        revised = new Value(newVersion, timestamp, newValue);
                        updated = true;
                    }
                    if (cache.replace(key, original, revised)) {
                        break;
                    }
                } else if (original.getValue() == null) {
                    // It's marked for expiration, leave it as is
                    updated = false;
                    break;
                } else {
                    // It's a value. Instead of removing it, expire it to prevent stale from in progress
                    // transactions being put in the cache
                    revised = new ExpiryMarker(newVersion, timestamp, nextMarkerId()).expire(timestamp);
                    updated = false;
                    if (cache.replace(key, original, revised)) {
                        break;
                    }
                }
            } else {
                break;
            }
        }
    }
    maybeNotifyTopic(key, newValue, newVersion);

    return updated;
}
项目:hazelcast-hibernate5    文件:ReadWriteAccessDelegate.java   
@Override
public SoftLock lockItem(final Object key, final Object version) throws CacheException {
    return cache.tryLock(key, version);
}
项目:hazelcast-hibernate5    文件:ReadWriteAccessDelegate.java   
@Override
public void unlockItem(final Object key, final SoftLock lock) throws CacheException {
    cache.unlock(key, lock);
}
项目:hazelcast-hibernate5    文件:ReadOnlyAccessDelegate.java   
@Override
public SoftLock lockItem(final Object key, final Object version) throws CacheException {
    return null;
}
项目:hazelcast-hibernate5    文件:ReadOnlyAccessDelegate.java   
/**
 * @throws UnsupportedOperationException
 */
@Override
public SoftLock lockRegion() throws CacheException {
    throw new UnsupportedOperationException("Attempting to lock a read-only cache region: "
            + getHazelcastRegion().getName());
}
项目:hazelcast-hibernate5    文件:ReadOnlyAccessDelegate.java   
/**
 * This will issue a log warning stating that an attempt was made to unlock a read-only cache region.
 */
@Override
public void unlockRegion(final SoftLock lock) throws CacheException {
    log.warning("Attempting to unlock a read-only cache region");
}
项目:hazelcast-hibernate5    文件:NonStrictReadWriteAccessDelegate.java   
@Override
public boolean afterUpdate(final Object key, final Object value, final Object currentVersion,
                           final Object previousVersion, final SoftLock lock) throws CacheException {
    unlockItem(key, lock);
    return false;
}
项目:hazelcast-hibernate5    文件:NonStrictReadWriteAccessDelegate.java   
@Override
public SoftLock lockItem(final Object key, final Object version) throws CacheException {
    return null;
}
项目:hazelcast-hibernate5    文件:NonStrictReadWriteAccessDelegate.java   
@Override
public void unlockItem(final Object key, final SoftLock lock) throws CacheException {
    remove(key);
}
项目:hazelcast-hibernate5    文件:AbstractAccessDelegate.java   
/**
 * NO-OP
 */
@Override
public SoftLock lockRegion() throws CacheException {
    return null;
}