HHH-4027 - Remove current cache-jbosscache module content
git-svn-id: https://svn.jboss.org/repos/hibernate/core/trunk@17015 1b8cb986-b30d-0410-93ca-fae66ebed9b2
This commit is contained in:
parent
db35f58467
commit
640d95bbf6
|
@ -1,85 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import java.util.Properties;
|
||||
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
import org.hibernate.transaction.TransactionManagerLookup;
|
||||
import org.hibernate.transaction.TransactionManagerLookupFactory;
|
||||
|
||||
/**
|
||||
* Support for JBossCache (TreeCache), where the cache instance is available
|
||||
* via JNDI lookup.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class JndiBoundTreeCacheProvider extends AbstractJndiBoundCacheProvider {
|
||||
|
||||
private TransactionManager transactionManager;
|
||||
|
||||
/**
|
||||
* Construct a Cache representing the "region" within in the underlying cache
|
||||
* provider.
|
||||
*
|
||||
* @param regionName the name of the cache region
|
||||
* @param properties configuration settings
|
||||
*
|
||||
* @throws CacheException
|
||||
*/
|
||||
public Cache buildCache(String regionName, Properties properties) throws CacheException {
|
||||
return new TreeCache( getTreeCacheInstance(), regionName, transactionManager );
|
||||
}
|
||||
|
||||
public void prepare(Properties properties) throws CacheException {
|
||||
TransactionManagerLookup transactionManagerLookup = TransactionManagerLookupFactory.getTransactionManagerLookup(properties);
|
||||
if (transactionManagerLookup!=null) {
|
||||
transactionManager = transactionManagerLookup.getTransactionManager(properties);
|
||||
}
|
||||
}
|
||||
/**
|
||||
* Generate a timestamp
|
||||
*/
|
||||
public long nextTimestamp() {
|
||||
return System.currentTimeMillis() / 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* By default, should minimal-puts mode be enabled when using this cache.
|
||||
* <p/>
|
||||
* Since TreeCache is a clusterable cache and we are only getting a
|
||||
* reference the instance from JNDI, safest to assume a clustered
|
||||
* setup and return true here.
|
||||
*
|
||||
* @return True.
|
||||
*/
|
||||
public boolean isMinimalPutsEnabledByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public org.jboss.cache.TreeCache getTreeCacheInstance() {
|
||||
return ( org.jboss.cache.TreeCache ) super.getCache();
|
||||
}
|
||||
}
|
|
@ -1,351 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.Comparator;
|
||||
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.jboss.cache.Fqn;
|
||||
import org.jboss.cache.optimistic.DataVersion;
|
||||
import org.jboss.cache.config.Option;
|
||||
import org.jboss.cache.lock.TimeoutException;
|
||||
|
||||
/**
|
||||
* Represents a particular region within the given JBossCache TreeCache
|
||||
* utilizing TreeCache's optimistic locking capabilities.
|
||||
*
|
||||
* @see OptimisticTreeCacheProvider for more details
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class OptimisticTreeCache implements OptimisticCache, TransactionAwareCache {
|
||||
|
||||
// todo : eventually merge this with TreeCache and just add optional opt-lock support there.
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger( OptimisticTreeCache.class);
|
||||
|
||||
private static final String ITEM = "item";
|
||||
|
||||
private org.jboss.cache.TreeCache cache;
|
||||
private final String regionName;
|
||||
private final Fqn regionFqn;
|
||||
private OptimisticCacheSource source;
|
||||
|
||||
public OptimisticTreeCache(org.jboss.cache.TreeCache cache, String regionName)
|
||||
throws CacheException {
|
||||
this.cache = cache;
|
||||
this.regionName = regionName;
|
||||
this.regionFqn = Fqn.fromString( regionName.replace( '.', '/' ) );
|
||||
}
|
||||
|
||||
|
||||
// OptimisticCache impl ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
public void setSource(OptimisticCacheSource source) {
|
||||
this.source = source;
|
||||
}
|
||||
|
||||
public void writeInsert(Object key, Object value, Object currentVersion) {
|
||||
writeUpdate( key, value, currentVersion, null );
|
||||
}
|
||||
|
||||
public void writeUpdate(Object key, Object value, Object currentVersion, Object previousVersion) {
|
||||
try {
|
||||
Option option = new Option();
|
||||
DataVersion dv = ( source != null && source.isVersioned() )
|
||||
? new DataVersionAdapter( currentVersion, previousVersion, source.getVersionComparator(), source.toString() )
|
||||
: NonLockingDataVersion.INSTANCE;
|
||||
option.setDataVersion( dv );
|
||||
cache.put( new Fqn( regionFqn, key ), ITEM, value, option );
|
||||
}
|
||||
catch ( Exception e ) {
|
||||
throw new CacheException( e );
|
||||
}
|
||||
}
|
||||
|
||||
public void writeLoad(Object key, Object value, Object currentVersion) {
|
||||
try {
|
||||
Option option = new Option();
|
||||
option.setFailSilently( true );
|
||||
option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
cache.remove( new Fqn( regionFqn, key ), "ITEM", option );
|
||||
|
||||
option = new Option();
|
||||
option.setFailSilently( true );
|
||||
DataVersion dv = ( source != null && source.isVersioned() )
|
||||
? new DataVersionAdapter( currentVersion, currentVersion, source.getVersionComparator(), source.toString() )
|
||||
: NonLockingDataVersion.INSTANCE;
|
||||
option.setDataVersion( dv );
|
||||
cache.put( new Fqn( regionFqn, key ), ITEM, value, option );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Cache impl ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
public Object get(Object key) throws CacheException {
|
||||
try {
|
||||
Option option = new Option();
|
||||
option.setFailSilently( true );
|
||||
// option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
return cache.get( new Fqn( regionFqn, key ), ITEM, option );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public Object read(Object key) throws CacheException {
|
||||
try {
|
||||
return cache.get( new Fqn( regionFqn, key ), ITEM );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void update(Object key, Object value) throws CacheException {
|
||||
try {
|
||||
Option option = new Option();
|
||||
option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
cache.put( new Fqn( regionFqn, key ), ITEM, value, option );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void put(Object key, Object value) throws CacheException {
|
||||
try {
|
||||
log.trace( "performing put() into region [" + regionName + "]" );
|
||||
// do the put outside the scope of the JTA txn
|
||||
Option option = new Option();
|
||||
option.setFailSilently( true );
|
||||
option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
cache.put( new Fqn( regionFqn, key ), ITEM, value, option );
|
||||
}
|
||||
catch (TimeoutException te) {
|
||||
//ignore!
|
||||
log.debug("ignoring write lock acquisition failure");
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void remove(Object key) throws CacheException {
|
||||
try {
|
||||
// tree cache in optimistic mode seems to have as very difficult
|
||||
// time with remove calls on non-existent nodes (NPEs)...
|
||||
if ( cache.get( new Fqn( regionFqn, key ), ITEM ) != null ) {
|
||||
Option option = new Option();
|
||||
option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
cache.remove( new Fqn( regionFqn, key ), option );
|
||||
}
|
||||
else {
|
||||
log.trace( "skipping remove() call as the underlying node did not seem to exist" );
|
||||
}
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void clear() throws CacheException {
|
||||
try {
|
||||
Option option = new Option();
|
||||
option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
cache.remove( regionFqn, option );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() throws CacheException {
|
||||
try {
|
||||
Option option = new Option();
|
||||
option.setCacheModeLocal( true );
|
||||
option.setFailSilently( true );
|
||||
option.setDataVersion( NonLockingDataVersion.INSTANCE );
|
||||
cache.remove( regionFqn, option );
|
||||
}
|
||||
catch( Exception e ) {
|
||||
throw new CacheException( e );
|
||||
}
|
||||
}
|
||||
|
||||
public void lock(Object key) throws CacheException {
|
||||
throw new UnsupportedOperationException( "TreeCache is a fully transactional cache" + regionName );
|
||||
}
|
||||
|
||||
public void unlock(Object key) throws CacheException {
|
||||
throw new UnsupportedOperationException( "TreeCache is a fully transactional cache: " + regionName );
|
||||
}
|
||||
|
||||
public long nextTimestamp() {
|
||||
return System.currentTimeMillis() / 100;
|
||||
}
|
||||
|
||||
public int getTimeout() {
|
||||
return 600; //60 seconds
|
||||
}
|
||||
|
||||
public String getRegionName() {
|
||||
return regionName;
|
||||
}
|
||||
|
||||
public long getSizeInMemory() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
public long getElementCountInMemory() {
|
||||
try {
|
||||
Set children = cache.getChildrenNames( regionFqn );
|
||||
return children == null ? 0 : children.size();
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public long getElementCountOnDisk() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Map toMap() {
|
||||
try {
|
||||
Map result = new HashMap();
|
||||
Set childrenNames = cache.getChildrenNames( regionFqn );
|
||||
if (childrenNames != null) {
|
||||
Iterator iter = childrenNames.iterator();
|
||||
while ( iter.hasNext() ) {
|
||||
Object key = iter.next();
|
||||
result.put(
|
||||
key,
|
||||
cache.get( new Fqn( regionFqn, key ), ITEM )
|
||||
);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "OptimisticTreeCache(" + regionName + ')';
|
||||
}
|
||||
|
||||
public static class DataVersionAdapter implements DataVersion {
|
||||
private final Object currentVersion;
|
||||
private final Object previousVersion;
|
||||
private final Comparator versionComparator;
|
||||
private final String sourceIdentifer;
|
||||
|
||||
public DataVersionAdapter(Object currentVersion, Object previousVersion, Comparator versionComparator, String sourceIdentifer) {
|
||||
this.currentVersion = currentVersion;
|
||||
this.previousVersion = previousVersion;
|
||||
this.versionComparator = versionComparator;
|
||||
this.sourceIdentifer = sourceIdentifer;
|
||||
log.trace( "created " + this );
|
||||
}
|
||||
|
||||
/**
|
||||
* newerThan() call is dispatched against the DataVersion currently
|
||||
* associated with the node; the passed dataVersion param is the
|
||||
* DataVersion associated with the data we are trying to put into
|
||||
* the node.
|
||||
* <p/>
|
||||
* we are expected to return true in the case where we (the current
|
||||
* node DataVersion) are newer that then incoming value. Returning
|
||||
* true here essentially means that a optimistic lock failure has
|
||||
* occured (because conversely, the value we are trying to put into
|
||||
* the node is "older than" the value already there...)
|
||||
*/
|
||||
public boolean newerThan(DataVersion dataVersion) {
|
||||
log.trace( "checking [" + this + "] against [" + dataVersion + "]" );
|
||||
if ( dataVersion instanceof CircumventChecksDataVersion ) {
|
||||
log.trace( "skipping lock checks..." );
|
||||
return false;
|
||||
}
|
||||
else if ( dataVersion instanceof NonLockingDataVersion ) {
|
||||
// can happen because of the multiple ways Cache.remove()
|
||||
// can be invoked :(
|
||||
log.trace( "skipping lock checks..." );
|
||||
return false;
|
||||
}
|
||||
DataVersionAdapter other = ( DataVersionAdapter ) dataVersion;
|
||||
if ( other.previousVersion == null ) {
|
||||
log.warn( "Unexpected optimistic lock check on inserting data" );
|
||||
// work around the "feature" where tree cache is validating the
|
||||
// inserted node during the next transaction. no idea...
|
||||
if ( this == dataVersion ) {
|
||||
log.trace( "skipping lock checks due to same DV instance" );
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return versionComparator.compare( currentVersion, other.previousVersion ) >= 1;
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return super.toString() + " [current=" + currentVersion + ", previous=" + previousVersion + ", src=" + sourceIdentifer + "]";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used in regions where no locking should ever occur. This includes query-caches,
|
||||
* update-timestamps caches, collection caches, and entity caches where the entity
|
||||
* is not versioned.
|
||||
*/
|
||||
public static class NonLockingDataVersion implements DataVersion {
|
||||
public static final DataVersion INSTANCE = new NonLockingDataVersion();
|
||||
public boolean newerThan(DataVersion dataVersion) {
|
||||
log.trace( "non locking lock check...");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Used to signal to a DataVersionAdapter to simply not perform any checks. This
|
||||
* is currently needed for proper handling of remove() calls for entity cache regions
|
||||
* (we do not know the version info...).
|
||||
*/
|
||||
public static class CircumventChecksDataVersion implements DataVersion {
|
||||
public static final DataVersion INSTANCE = new CircumventChecksDataVersion();
|
||||
public boolean newerThan(DataVersion dataVersion) {
|
||||
throw new CacheException( "optimistic locking checks should never happen on CircumventChecksDataVersion" );
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,152 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import java.util.Properties;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.transaction.TransactionManagerLookup;
|
||||
import org.hibernate.transaction.TransactionManagerLookupFactory;
|
||||
import org.jboss.cache.PropertyConfigurator;
|
||||
|
||||
/**
|
||||
* Support for a standalone JBossCache TreeCache instance utilizing TreeCache's
|
||||
* optimistic locking capabilities. This capability was added in JBossCache
|
||||
* version 1.3.0; as such this provider will only work with that version or
|
||||
* higher.
|
||||
* <p/>
|
||||
* The TreeCache instance is configured via a local config resource. The
|
||||
* resource to be used for configuration can be controlled by specifying a value
|
||||
* for the {@link #CONFIG_RESOURCE} config property.
|
||||
*
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class OptimisticTreeCacheProvider implements CacheProvider {
|
||||
|
||||
/**
|
||||
* @deprecated use {@link Environment#CACHE_PROVIDER_CONFIG}
|
||||
*/
|
||||
public static final String CONFIG_RESOURCE = "hibernate.cache.opt_tree_cache.config";
|
||||
public static final String DEFAULT_CONFIG = "treecache-optimistic.xml";
|
||||
|
||||
private static final String NODE_LOCKING_SCHEME = "OPTIMISTIC";
|
||||
private static final Logger log = LoggerFactory.getLogger( OptimisticTreeCacheProvider.class );
|
||||
|
||||
private org.jboss.cache.TreeCache cache;
|
||||
|
||||
/**
|
||||
* Construct and configure the Cache representation of a named cache region.
|
||||
*
|
||||
* @param regionName the name of the cache region
|
||||
* @param properties configuration settings
|
||||
* @return The Cache representation of the named cache region.
|
||||
* @throws CacheException
|
||||
* Indicates an error building the cache region.
|
||||
*/
|
||||
public Cache buildCache(String regionName, Properties properties) throws CacheException {
|
||||
return new OptimisticTreeCache( cache, regionName );
|
||||
}
|
||||
|
||||
public long nextTimestamp() {
|
||||
return System.currentTimeMillis() / 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the underlying JBossCache TreeCache instance.
|
||||
*
|
||||
* @param properties All current config settings.
|
||||
* @throws CacheException
|
||||
* Indicates a problem preparing cache for use.
|
||||
*/
|
||||
public void start(Properties properties) {
|
||||
String resource = properties.getProperty( Environment.CACHE_PROVIDER_CONFIG );
|
||||
if (resource == null) {
|
||||
resource = properties.getProperty( CONFIG_RESOURCE );
|
||||
}
|
||||
if ( resource == null ) {
|
||||
resource = DEFAULT_CONFIG;
|
||||
}
|
||||
log.debug( "Configuring TreeCache from resource [" + resource + "]" );
|
||||
try {
|
||||
cache = new org.jboss.cache.TreeCache();
|
||||
PropertyConfigurator config = new PropertyConfigurator();
|
||||
config.configure( cache, resource );
|
||||
TransactionManagerLookup transactionManagerLookup =
|
||||
TransactionManagerLookupFactory.getTransactionManagerLookup( properties );
|
||||
if ( transactionManagerLookup == null ) {
|
||||
throw new CacheException(
|
||||
"JBossCache only supports optimisitc locking with a configured " +
|
||||
"TransactionManagerLookup (" + Environment.TRANSACTION_MANAGER_STRATEGY + ")"
|
||||
);
|
||||
}
|
||||
cache.setTransactionManagerLookup(
|
||||
new TransactionManagerLookupAdaptor(
|
||||
transactionManagerLookup,
|
||||
properties
|
||||
)
|
||||
);
|
||||
if ( ! NODE_LOCKING_SCHEME.equalsIgnoreCase( cache.getNodeLockingScheme() ) ) {
|
||||
log.info( "Overriding node-locking-scheme to : " + NODE_LOCKING_SCHEME );
|
||||
cache.setNodeLockingScheme( NODE_LOCKING_SCHEME );
|
||||
}
|
||||
cache.start();
|
||||
}
|
||||
catch ( Exception e ) {
|
||||
throw new CacheException( e );
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if ( cache != null ) {
|
||||
cache.stop();
|
||||
cache.destroy();
|
||||
cache = null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMinimalPutsEnabledByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
static final class TransactionManagerLookupAdaptor implements org.jboss.cache.TransactionManagerLookup {
|
||||
private final TransactionManagerLookup tml;
|
||||
private final Properties props;
|
||||
|
||||
TransactionManagerLookupAdaptor(TransactionManagerLookup tml, Properties props) {
|
||||
this.tml = tml;
|
||||
this.props = props;
|
||||
}
|
||||
|
||||
public TransactionManager getTransactionManager() throws Exception {
|
||||
return tml.getTransactionManager( props );
|
||||
}
|
||||
}
|
||||
|
||||
public org.jboss.cache.TreeCache getUnderlyingCache() {
|
||||
return cache;
|
||||
}
|
||||
}
|
|
@ -1,227 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import javax.transaction.SystemException;
|
||||
import javax.transaction.Transaction;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.jboss.cache.Fqn;
|
||||
import org.jboss.cache.lock.TimeoutException;
|
||||
|
||||
/**
|
||||
* Represents a particular region within the given JBossCache TreeCache.
|
||||
*
|
||||
* @author Gavin King
|
||||
*/
|
||||
public class TreeCache implements Cache, TransactionAwareCache {
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger(TreeCache.class);
|
||||
|
||||
private static final String ITEM = "item";
|
||||
|
||||
private org.jboss.cache.TreeCache cache;
|
||||
private final String regionName;
|
||||
private final Fqn regionFqn;
|
||||
private final TransactionManager transactionManager;
|
||||
|
||||
public TreeCache(org.jboss.cache.TreeCache cache, String regionName, TransactionManager transactionManager)
|
||||
throws CacheException {
|
||||
this.cache = cache;
|
||||
this.regionName = regionName;
|
||||
this.regionFqn = Fqn.fromString( regionName.replace( '.', '/' ) );
|
||||
this.transactionManager = transactionManager;
|
||||
}
|
||||
|
||||
public Object get(Object key) throws CacheException {
|
||||
Transaction tx = suspend();
|
||||
try {
|
||||
return read(key);
|
||||
}
|
||||
finally {
|
||||
resume( tx );
|
||||
}
|
||||
}
|
||||
|
||||
public Object read(Object key) throws CacheException {
|
||||
try {
|
||||
return cache.get( new Fqn( regionFqn, key ), ITEM );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void update(Object key, Object value) throws CacheException {
|
||||
try {
|
||||
cache.put( new Fqn( regionFqn, key ), ITEM, value );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void put(Object key, Object value) throws CacheException {
|
||||
Transaction tx = suspend();
|
||||
try {
|
||||
//do the failfast put outside the scope of the JTA txn
|
||||
cache.putFailFast( new Fqn( regionFqn, key ), ITEM, value, 0 );
|
||||
}
|
||||
catch (TimeoutException te) {
|
||||
//ignore!
|
||||
log.debug("ignoring write lock acquisition failure");
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
finally {
|
||||
resume( tx );
|
||||
}
|
||||
}
|
||||
|
||||
private void resume(Transaction tx) {
|
||||
try {
|
||||
if (tx!=null) transactionManager.resume(tx);
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException("Could not resume transaction", e);
|
||||
}
|
||||
}
|
||||
|
||||
private Transaction suspend() {
|
||||
Transaction tx = null;
|
||||
try {
|
||||
if ( transactionManager!=null ) {
|
||||
tx = transactionManager.suspend();
|
||||
}
|
||||
}
|
||||
catch (SystemException se) {
|
||||
throw new CacheException("Could not suspend transaction", se);
|
||||
}
|
||||
return tx;
|
||||
}
|
||||
|
||||
public void remove(Object key) throws CacheException {
|
||||
try {
|
||||
cache.remove( new Fqn( regionFqn, key ) );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void clear() throws CacheException {
|
||||
try {
|
||||
cache.remove( regionFqn );
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void destroy() throws CacheException {
|
||||
try {
|
||||
// NOTE : evict() operates locally only (i.e., does not propogate
|
||||
// to any other nodes in the potential cluster). This is
|
||||
// exactly what is needed when we destroy() here; destroy() is used
|
||||
// as part of the process of shutting down a SessionFactory; thus
|
||||
// these removals should not be propogated
|
||||
cache.evict( regionFqn );
|
||||
}
|
||||
catch( Exception e ) {
|
||||
throw new CacheException( e );
|
||||
}
|
||||
}
|
||||
|
||||
public void lock(Object key) throws CacheException {
|
||||
throw new UnsupportedOperationException( "TreeCache is a fully transactional cache" + regionName );
|
||||
}
|
||||
|
||||
public void unlock(Object key) throws CacheException {
|
||||
throw new UnsupportedOperationException( "TreeCache is a fully transactional cache: " + regionName );
|
||||
}
|
||||
|
||||
public long nextTimestamp() {
|
||||
return System.currentTimeMillis() / 100;
|
||||
}
|
||||
|
||||
public int getTimeout() {
|
||||
return 600; //60 seconds
|
||||
}
|
||||
|
||||
public String getRegionName() {
|
||||
return regionName;
|
||||
}
|
||||
|
||||
public long getSizeInMemory() {
|
||||
return -1;
|
||||
}
|
||||
|
||||
public long getElementCountInMemory() {
|
||||
try {
|
||||
Set children = cache.getChildrenNames( regionFqn );
|
||||
return children == null ? 0 : children.size();
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public long getElementCountOnDisk() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
public Map toMap() {
|
||||
try {
|
||||
Map result = new HashMap();
|
||||
Set childrenNames = cache.getChildrenNames( regionFqn );
|
||||
if (childrenNames != null) {
|
||||
Iterator iter = childrenNames.iterator();
|
||||
while ( iter.hasNext() ) {
|
||||
Object key = iter.next();
|
||||
result.put(
|
||||
key,
|
||||
cache.get( new Fqn( regionFqn, key ), ITEM )
|
||||
);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public String toString() {
|
||||
return "TreeCache(" + regionName + ')';
|
||||
}
|
||||
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import java.util.Properties;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.hibernate.transaction.TransactionManagerLookup;
|
||||
import org.hibernate.transaction.TransactionManagerLookupFactory;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.jboss.cache.PropertyConfigurator;
|
||||
|
||||
/**
|
||||
* Support for a standalone JBossCache (TreeCache) instance. The JBossCache is configured
|
||||
* via a local config resource.
|
||||
*
|
||||
* @author Gavin King
|
||||
*/
|
||||
public class TreeCacheProvider implements CacheProvider {
|
||||
|
||||
/**
|
||||
* @deprecated use {@link org.hibernate.cfg.Environment#CACHE_PROVIDER_CONFIG}
|
||||
*/
|
||||
public static final String CONFIG_RESOURCE = "hibernate.cache.tree_cache.config";
|
||||
public static final String DEFAULT_CONFIG = "treecache-optimistic.xml";
|
||||
|
||||
private static final Logger log = LoggerFactory.getLogger( TreeCacheProvider.class );
|
||||
|
||||
private org.jboss.cache.TreeCache cache;
|
||||
private TransactionManager transactionManager;
|
||||
|
||||
/**
|
||||
* Construct and configure the Cache representation of a named cache region.
|
||||
*
|
||||
* @param regionName the name of the cache region
|
||||
* @param properties configuration settings
|
||||
* @return The Cache representation of the named cache region.
|
||||
* @throws CacheException Indicates an error building the cache region.
|
||||
*/
|
||||
public Cache buildCache(String regionName, Properties properties) throws CacheException {
|
||||
return new TreeCache(cache, regionName, transactionManager);
|
||||
}
|
||||
|
||||
public long nextTimestamp() {
|
||||
return System.currentTimeMillis() / 100;
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the underlying JBossCache TreeCache instance.
|
||||
*
|
||||
* @param properties All current config settings.
|
||||
*
|
||||
* @throws CacheException Indicates a problem preparing cache for use.
|
||||
*/
|
||||
public void start(Properties properties) {
|
||||
String resource = properties.getProperty( Environment.CACHE_PROVIDER_CONFIG );
|
||||
|
||||
if ( resource == null ) {
|
||||
resource = properties.getProperty( CONFIG_RESOURCE );
|
||||
}
|
||||
if ( resource == null ) {
|
||||
resource = DEFAULT_CONFIG;
|
||||
}
|
||||
log.debug( "Configuring TreeCache from resource [" + resource + "]" );
|
||||
try {
|
||||
cache = new org.jboss.cache.TreeCache();
|
||||
PropertyConfigurator config = new PropertyConfigurator();
|
||||
config.configure( cache, resource );
|
||||
TransactionManagerLookup transactionManagerLookup = TransactionManagerLookupFactory.getTransactionManagerLookup(properties);
|
||||
if (transactionManagerLookup!=null) {
|
||||
cache.setTransactionManagerLookup( new TransactionManagerLookupAdaptor(transactionManagerLookup, properties) );
|
||||
transactionManager = transactionManagerLookup.getTransactionManager(properties);
|
||||
}
|
||||
cache.start();
|
||||
}
|
||||
catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
}
|
||||
}
|
||||
|
||||
public void stop() {
|
||||
if (cache!=null) {
|
||||
cache.stop();
|
||||
cache.destroy();
|
||||
cache=null;
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isMinimalPutsEnabledByDefault() {
|
||||
return true;
|
||||
}
|
||||
|
||||
static final class TransactionManagerLookupAdaptor implements org.jboss.cache.TransactionManagerLookup {
|
||||
private final TransactionManagerLookup tml;
|
||||
private final Properties props;
|
||||
TransactionManagerLookupAdaptor(TransactionManagerLookup tml, Properties props) {
|
||||
this.tml=tml;
|
||||
this.props=props;
|
||||
}
|
||||
public TransactionManager getTransactionManager() throws Exception {
|
||||
return tml.getTransactionManager(props);
|
||||
}
|
||||
}
|
||||
|
||||
public org.jboss.cache.TreeCache getUnderlyingCache() {
|
||||
return cache;
|
||||
}
|
||||
}
|
|
@ -1,131 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.Assert;
|
||||
import org.jboss.cache.Fqn;
|
||||
import org.jboss.cache.TreeCache;
|
||||
import org.jboss.cache.config.Option;
|
||||
import org.jboss.cache.optimistic.DataVersion;
|
||||
|
||||
import org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge;
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
|
||||
import org.hibernate.test.cache.BaseCacheProviderTestCase;
|
||||
import org.hibernate.test.tm.SimpleJtaTransactionManagerImpl;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class OptimisticTreeCacheTest extends BaseCacheProviderTestCase {
|
||||
public OptimisticTreeCacheTest(String x) {
|
||||
super( x );
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new FunctionalTestClassTestSuite( OptimisticTreeCacheTest.class );
|
||||
}
|
||||
|
||||
public String getCacheConcurrencyStrategy() {
|
||||
return "transactional";
|
||||
}
|
||||
|
||||
protected Class getCacheProvider() {
|
||||
return OptimisticTreeCacheProvider.class;
|
||||
}
|
||||
|
||||
protected String getConfigResourceKey() {
|
||||
return Environment.CACHE_PROVIDER_CONFIG;
|
||||
}
|
||||
|
||||
protected String getConfigResourceLocation() {
|
||||
return "treecache-optimistic.xml";
|
||||
}
|
||||
|
||||
protected boolean useTransactionManager() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public void testCacheLevelStaleWritesFail() throws Throwable {
|
||||
Fqn fqn = new Fqn( "whatever" );
|
||||
TreeCache treeCache = ( ( OptimisticTreeCacheProvider ) ( ( RegionFactoryCacheProviderBridge ) sfi().getSettings().getRegionFactory() ).getCacheProvider() ).getUnderlyingCache();
|
||||
|
||||
Long long1 = new Long(1);
|
||||
Long long2 = new Long(2);
|
||||
|
||||
try {
|
||||
System.out.println( "****************************************************************" );
|
||||
SimpleJtaTransactionManagerImpl.getInstance().begin();
|
||||
treeCache.put( fqn, "ITEM", long1, ManualDataVersion.gen( 1 ) );
|
||||
SimpleJtaTransactionManagerImpl.getInstance().commit();
|
||||
|
||||
System.out.println( "****************************************************************" );
|
||||
SimpleJtaTransactionManagerImpl.getInstance().begin();
|
||||
treeCache.put( fqn, "ITEM", long2, ManualDataVersion.gen( 2 ) );
|
||||
SimpleJtaTransactionManagerImpl.getInstance().commit();
|
||||
|
||||
try {
|
||||
System.out.println( "****************************************************************" );
|
||||
SimpleJtaTransactionManagerImpl.getInstance().begin();
|
||||
treeCache.put( fqn, "ITEM", long1, ManualDataVersion.gen( 1 ) );
|
||||
SimpleJtaTransactionManagerImpl.getInstance().commit();
|
||||
Assert.fail( "stale write allowed" );
|
||||
}
|
||||
catch( Throwable ignore ) {
|
||||
// expected behavior
|
||||
SimpleJtaTransactionManagerImpl.getInstance().rollback();
|
||||
}
|
||||
|
||||
Long current = ( Long ) treeCache.get( fqn, "ITEM" );
|
||||
Assert.assertEquals( "unexpected current value", 2, current.longValue() );
|
||||
}
|
||||
finally {
|
||||
try {
|
||||
treeCache.remove( fqn, "ITEM" );
|
||||
}
|
||||
catch( Throwable ignore ) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static class ManualDataVersion implements DataVersion {
|
||||
private final int version;
|
||||
|
||||
public ManualDataVersion(int version) {
|
||||
this.version = version;
|
||||
}
|
||||
|
||||
public boolean newerThan(DataVersion dataVersion) {
|
||||
return this.version > ( ( ManualDataVersion ) dataVersion ).version;
|
||||
}
|
||||
|
||||
public static Option gen(int version) {
|
||||
ManualDataVersion mdv = new ManualDataVersion( version );
|
||||
Option option = new Option();
|
||||
option.setDataVersion( mdv );
|
||||
return option;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Middleware LLC.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
* for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache;
|
||||
|
||||
import junit.framework.Test;
|
||||
|
||||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.junit.functional.FunctionalTestClassTestSuite;
|
||||
import org.hibernate.test.cache.BaseCacheProviderTestCase;
|
||||
|
||||
/**
|
||||
* @author Steve Ebersole
|
||||
*/
|
||||
public class PessimisticTreeCacheTest extends BaseCacheProviderTestCase {
|
||||
public PessimisticTreeCacheTest(String x) {
|
||||
super( x );
|
||||
}
|
||||
|
||||
public static Test suite() {
|
||||
return new FunctionalTestClassTestSuite( PessimisticTreeCacheTest.class );
|
||||
}
|
||||
|
||||
public String getCacheConcurrencyStrategy() {
|
||||
return "transactional";
|
||||
}
|
||||
|
||||
protected Class getCacheProvider() {
|
||||
return TreeCacheProvider.class;
|
||||
}
|
||||
|
||||
protected String getConfigResourceKey() {
|
||||
return Environment.CACHE_PROVIDER_CONFIG;
|
||||
}
|
||||
|
||||
protected String getConfigResourceLocation() {
|
||||
return "treecache-pessimistic.xml";
|
||||
}
|
||||
|
||||
protected boolean useTransactionManager() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
|
@ -1,32 +0,0 @@
|
|||
################################################################################
|
||||
# Hibernate, Relational Persistence for Idiomatic Java #
|
||||
# #
|
||||
# Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as #
|
||||
# indicated by the @author tags or express copyright attribution #
|
||||
# statements applied by the authors. All third-party contributions are #
|
||||
# distributed under license by Red Hat Middleware LLC. #
|
||||
# #
|
||||
# This copyrighted material is made available to anyone wishing to use, modify,#
|
||||
# copy, or redistribute it subject to the terms and conditions of the GNU #
|
||||
# Lesser General Public License, as published by the Free Software Foundation. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
# for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU Lesser General Public License #
|
||||
# along with this distribution; if not, write to: #
|
||||
# Free Software Foundation, Inc. #
|
||||
# 51 Franklin Street, Fifth Floor #
|
||||
# Boston, MA 02110-1301 USA #
|
||||
################################################################################
|
||||
hibernate.dialect org.hibernate.dialect.HSQLDialect
|
||||
hibernate.connection.driver_class org.hsqldb.jdbcDriver
|
||||
hibernate.connection.url jdbc:hsqldb:mem:/test
|
||||
hibernate.connection.username sa
|
||||
hibernate.connection.password
|
||||
|
||||
hibernate.connection.pool_size 5
|
||||
|
||||
hibernate.cache.region_prefix hibernate.test
|
|
@ -1,32 +0,0 @@
|
|||
################################################################################
|
||||
# Hibernate, Relational Persistence for Idiomatic Java #
|
||||
# #
|
||||
# Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as #
|
||||
# indicated by the @author tags or express copyright attribution #
|
||||
# statements applied by the authors. All third-party contributions are #
|
||||
# distributed under license by Red Hat Middleware LLC. #
|
||||
# #
|
||||
# This copyrighted material is made available to anyone wishing to use, modify,#
|
||||
# copy, or redistribute it subject to the terms and conditions of the GNU #
|
||||
# Lesser General Public License, as published by the Free Software Foundation. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, #
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
# for more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU Lesser General Public License #
|
||||
# along with this distribution; if not, write to: #
|
||||
# Free Software Foundation, Inc. #
|
||||
# 51 Franklin Street, Fifth Floor #
|
||||
# Boston, MA 02110-1301 USA #
|
||||
################################################################################
|
||||
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
|
||||
log4j.appender.stdout.Target=System.out
|
||||
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
|
||||
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
|
||||
|
||||
|
||||
log4j.rootLogger=info, stdout
|
||||
|
||||
log4j.logger.org.hibernate.test=info
|
|
@ -1,171 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
~ Hibernate, Relational Persistence for Idiomatic Java
|
||||
~
|
||||
~ Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
~ indicated by the @author tags or express copyright attribution
|
||||
~ statements applied by the authors. All third-party contributions are
|
||||
~ distributed under license by Red Hat Middleware LLC.
|
||||
~
|
||||
~ This copyrighted material is made available to anyone wishing to use, modify,
|
||||
~ copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
~ Lesser General Public License, as published by the Free Software Foundation.
|
||||
~
|
||||
~ This program is distributed in the hope that it will be useful,
|
||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
~ for more details.
|
||||
~
|
||||
~ You should have received a copy of the GNU Lesser General Public License
|
||||
~ along with this distribution; if not, write to:
|
||||
~ Free Software Foundation, Inc.
|
||||
~ 51 Franklin Street, Fifth Floor
|
||||
~ Boston, MA 02110-1301 USA
|
||||
-->
|
||||
|
||||
<!-- ===================================================================== -->
|
||||
<!-- -->
|
||||
<!-- Sample TreeCache Service Configuration -->
|
||||
<!-- Recommended for use as Hibernate's 2nd Level Cache -->
|
||||
<!-- For use with JBossCache >= 1.3.0 ONLY!!! -->
|
||||
<!-- -->
|
||||
<!-- ===================================================================== -->
|
||||
|
||||
<server>
|
||||
|
||||
<classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
|
||||
|
||||
|
||||
<!-- ==================================================================== -->
|
||||
<!-- Defines TreeCache configuration -->
|
||||
<!-- ==================================================================== -->
|
||||
|
||||
<mbean code="org.jboss.cache.TreeCache"
|
||||
name="jboss.cache:service=TreeCache">
|
||||
|
||||
<depends>jboss:service=Naming</depends>
|
||||
<depends>jboss:service=TransactionManager</depends>
|
||||
|
||||
<!--
|
||||
Configure the TransactionManager : no matter since Hibernate will plug in
|
||||
an "adapter" to its own TransactionManagerLookup strategy here
|
||||
-->
|
||||
<attribute name="TransactionManagerLookupClass">org.jboss.cache.GenericTransactionManagerLookup</attribute>
|
||||
|
||||
|
||||
<!--
|
||||
Node locking scheme:
|
||||
OPTIMISTIC
|
||||
PESSIMISTIC (default)
|
||||
-->
|
||||
<attribute name="NodeLockingScheme">OPTIMISTIC</attribute>
|
||||
|
||||
<!--
|
||||
Note that this attribute is IGNORED if your NodeLockingScheme above is OPTIMISTIC.
|
||||
|
||||
Isolation level : SERIALIZABLE
|
||||
REPEATABLE_READ (default)
|
||||
READ_COMMITTED
|
||||
READ_UNCOMMITTED
|
||||
NONE
|
||||
-->
|
||||
<attribute name="IsolationLevel">REPEATABLE_READ</attribute>
|
||||
|
||||
<!--
|
||||
Valid modes are LOCAL
|
||||
REPL_ASYNC
|
||||
REPL_SYNC
|
||||
INVALIDATION_ASYNC
|
||||
INVALIDATION_SYNC
|
||||
|
||||
INVALIDATION_ASYNC is highly recommended as the mode for use
|
||||
with clustered second-level caches.
|
||||
-->
|
||||
<attribute name="CacheMode">LOCAL</attribute>
|
||||
|
||||
<!--
|
||||
Just used for async repl: use a replication queue
|
||||
-->
|
||||
<attribute name="UseReplQueue">false</attribute>
|
||||
|
||||
<!--
|
||||
Replication interval for replication queue (in ms)
|
||||
-->
|
||||
<attribute name="ReplQueueInterval">0</attribute>
|
||||
|
||||
<!--
|
||||
Max number of elements which trigger replication
|
||||
-->
|
||||
<attribute name="ReplQueueMaxElements">0</attribute>
|
||||
|
||||
<!-- Name of cluster. Needs to be the same for all clusters, in order
|
||||
to find each other
|
||||
-->
|
||||
<attribute name="ClusterName">TreeCache-Cluster</attribute>
|
||||
|
||||
<!-- JGroups protocol stack properties. Can also be a URL,
|
||||
e.g. file:/home/bela/default.xml
|
||||
<attribute name="ClusterProperties"></attribute>
|
||||
-->
|
||||
|
||||
<attribute name="ClusterConfig">
|
||||
<config>
|
||||
<!-- UDP: if you have a multihomed machine,
|
||||
set the bind_addr attribute to the appropriate NIC IP address -->
|
||||
<!-- UDP: On Windows machines, because of the media sense feature
|
||||
being broken with multicast (even after disabling media sense)
|
||||
set the loopback attribute to true -->
|
||||
<UDP mcast_addr="228.1.2.3" mcast_port="48866"
|
||||
ip_ttl="64" ip_mcast="true"
|
||||
mcast_send_buf_size="150000" mcast_recv_buf_size="80000"
|
||||
ucast_send_buf_size="150000" ucast_recv_buf_size="80000"
|
||||
loopback="false"/>
|
||||
<PING timeout="2000" num_initial_members="3"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<MERGE2 min_interval="10000" max_interval="20000"/>
|
||||
<!-- <FD shun="true" up_thread="true" down_thread="true" />-->
|
||||
<FD_SOCK/>
|
||||
<VERIFY_SUSPECT timeout="1500"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800"
|
||||
max_xmit_size="8192" up_thread="false" down_thread="false"/>
|
||||
<UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10"
|
||||
down_thread="false"/>
|
||||
<pbcast.STABLE desired_avg_gossip="20000"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<FRAG frag_size="8192"
|
||||
down_thread="false" up_thread="false"/>
|
||||
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000"
|
||||
shun="true" print_local_addr="true"/>
|
||||
<pbcast.STATE_TRANSFER up_thread="true" down_thread="true"/>
|
||||
</config>
|
||||
</attribute>
|
||||
|
||||
<!--
|
||||
Whether or not to fetch state on joining a cluster
|
||||
NOTE this used to be called FetchStateOnStartup and has been renamed to be more descriptive.
|
||||
-->
|
||||
<attribute name="FetchInMemoryState">false</attribute>
|
||||
|
||||
<!--
|
||||
Number of milliseconds to wait until all responses for a
|
||||
synchronous call have been received.
|
||||
-->
|
||||
<attribute name="SyncReplTimeout">20000</attribute>
|
||||
|
||||
<!-- Max number of milliseconds to wait for a lock acquisition -->
|
||||
<attribute name="LockAcquisitionTimeout">15000</attribute>
|
||||
|
||||
|
||||
<!-- Name of the eviction policy class. -->
|
||||
<attribute name="EvictionPolicyClass"></attribute>
|
||||
|
||||
<!--
|
||||
Indicate whether to use marshalling or not. Set this to true if you are running under a scoped
|
||||
class loader, e.g., inside an application server. Default is "false".
|
||||
-->
|
||||
<attribute name="UseMarshalling">false</attribute>
|
||||
|
||||
</mbean>
|
||||
</server>
|
|
@ -1,143 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<!--
|
||||
~ Hibernate, Relational Persistence for Idiomatic Java
|
||||
~
|
||||
~ Copyright (c) 2007, Red Hat Middleware LLC or third-party contributors as
|
||||
~ indicated by the @author tags or express copyright attribution
|
||||
~ statements applied by the authors. All third-party contributions are
|
||||
~ distributed under license by Red Hat Middleware LLC.
|
||||
~
|
||||
~ This copyrighted material is made available to anyone wishing to use, modify,
|
||||
~ copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
~ Lesser General Public License, as published by the Free Software Foundation.
|
||||
~
|
||||
~ This program is distributed in the hope that it will be useful,
|
||||
~ but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
||||
~ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
|
||||
~ for more details.
|
||||
~
|
||||
~ You should have received a copy of the GNU Lesser General Public License
|
||||
~ along with this distribution; if not, write to:
|
||||
~ Free Software Foundation, Inc.
|
||||
~ 51 Franklin Street, Fifth Floor
|
||||
~ Boston, MA 02110-1301 USA
|
||||
-->
|
||||
|
||||
<!-- ===================================================================== -->
|
||||
<!-- -->
|
||||
<!-- Sample TreeCache Service Configuration -->
|
||||
<!-- -->
|
||||
<!-- ===================================================================== -->
|
||||
|
||||
<server>
|
||||
|
||||
<classpath codebase="./lib" archives="jboss-cache.jar, jgroups.jar"/>
|
||||
|
||||
|
||||
<!-- ==================================================================== -->
|
||||
<!-- Defines TreeCache configuration -->
|
||||
<!-- ==================================================================== -->
|
||||
|
||||
<mbean code="org.jboss.cache.TreeCache"
|
||||
name="jboss.cache:service=TreeCache">
|
||||
|
||||
<depends>jboss:service=Naming</depends>
|
||||
<depends>jboss:service=TransactionManager</depends>
|
||||
|
||||
<!--
|
||||
TransactionManager configuration not required for Hibernate!
|
||||
-->
|
||||
|
||||
|
||||
<!--
|
||||
Node isolation level : SERIALIZABLE
|
||||
REPEATABLE_READ (default)
|
||||
READ_COMMITTED
|
||||
READ_UNCOMMITTED
|
||||
NONE
|
||||
-->
|
||||
<attribute name="IsolationLevel">REPEATABLE_READ</attribute>
|
||||
|
||||
<!--
|
||||
Valid modes are LOCAL
|
||||
REPL_ASYNC
|
||||
REPL_SYNC
|
||||
-->
|
||||
<attribute name="CacheMode">LOCAL</attribute>
|
||||
|
||||
<!-- Name of cluster. Needs to be the same for all clusters, in order
|
||||
to find each other
|
||||
-->
|
||||
<attribute name="ClusterName">TreeCache-Cluster</attribute>
|
||||
|
||||
<!-- JGroups protocol stack properties. Can also be a URL,
|
||||
e.g. file:/home/bela/default.xml
|
||||
<attribute name="ClusterProperties"></attribute>
|
||||
-->
|
||||
|
||||
<attribute name="ClusterConfig">
|
||||
<config>
|
||||
<!-- UDP: if you have a multihomed machine,
|
||||
set the bind_addr attribute to the appropriate NIC IP address -->
|
||||
<!-- UDP: On Windows machines, because of the media sense feature
|
||||
being broken with multicast (even after disabling media sense)
|
||||
set the loopback attribute to true -->
|
||||
<UDP mcast_addr="228.1.2.3" mcast_port="45566"
|
||||
ip_ttl="64" ip_mcast="true"
|
||||
mcast_send_buf_size="150000" mcast_recv_buf_size="80000"
|
||||
ucast_send_buf_size="150000" ucast_recv_buf_size="80000"
|
||||
loopback="false"/>
|
||||
<PING timeout="2000" num_initial_members="3"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<MERGE2 min_interval="10000" max_interval="20000"/>
|
||||
<FD shun="true" up_thread="true" down_thread="true"/>
|
||||
<VERIFY_SUSPECT timeout="1500"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<pbcast.NAKACK gc_lag="50" retransmit_timeout="600,1200,2400,4800"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<pbcast.STABLE desired_avg_gossip="20000"
|
||||
up_thread="false" down_thread="false"/>
|
||||
<UNICAST timeout="600,1200,2400" window_size="100" min_threshold="10"
|
||||
down_thread="false"/>
|
||||
<FRAG frag_size="8192"
|
||||
down_thread="false" up_thread="false"/>
|
||||
<pbcast.GMS join_timeout="5000" join_retry_timeout="2000"
|
||||
shun="true" print_local_addr="true"/>
|
||||
<pbcast.STATE_TRANSFER up_thread="false" down_thread="false"/>
|
||||
</config>
|
||||
</attribute>
|
||||
|
||||
<!--
|
||||
Max number of entries in the cache. If this is exceeded, the
|
||||
eviction policy will kick some entries out in order to make
|
||||
more room
|
||||
-->
|
||||
<attribute name="MaxCapacity">20000</attribute>
|
||||
|
||||
<!--
|
||||
The max amount of time (in milliseconds) we wait until the
|
||||
initial state (ie. the contents of the cache) are retrieved from
|
||||
existing members in a clustered environment
|
||||
-->
|
||||
<attribute name="InitialStateRetrievalTimeout">20000</attribute>
|
||||
|
||||
<!--
|
||||
Number of milliseconds to wait until all responses for a
|
||||
synchronous call have been received.
|
||||
-->
|
||||
<attribute name="SyncReplTimeout">10000</attribute>
|
||||
|
||||
<!-- Max number of milliseconds to wait for a lock acquisition -->
|
||||
<attribute name="LockAcquisitionTimeout">15000</attribute>
|
||||
|
||||
<!-- Max number of milliseconds we hold a lock (not currently
|
||||
implemented) -->
|
||||
<attribute name="LockLeaseTimeout">60000</attribute>
|
||||
|
||||
<!-- Name of the eviction policy class. Not supported now. -->
|
||||
<attribute name="EvictionPolicyClass"></attribute>
|
||||
</mbean>
|
||||
|
||||
|
||||
</server>
|
Loading…
Reference in New Issue