⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 abstractcollectionregionaccessstrategytestcase.java

📁 hibernate 开源框架的代码 jar包希望大家能喜欢
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/* * 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.test.cache.jbc2.collection;import java.util.Iterator;import java.util.concurrent.CountDownLatch;import java.util.concurrent.TimeUnit;import junit.extensions.TestSetup;import junit.framework.AssertionFailedError;import junit.framework.Test;import junit.framework.TestSuite;import org.hibernate.cache.CacheDataDescription;import org.hibernate.cache.CacheException;import org.hibernate.cache.CollectionRegion;import org.hibernate.cache.access.AccessType;import org.hibernate.cache.access.CollectionRegionAccessStrategy;import org.hibernate.cache.impl.CacheDataDescriptionImpl;import org.hibernate.cache.jbc2.BasicRegionAdapter;import org.hibernate.cache.jbc2.JBossCacheRegionFactory;import org.hibernate.cache.jbc2.MultiplexedJBossCacheRegionFactory;import org.hibernate.cache.jbc2.builder.MultiplexingCacheInstanceManager;import org.hibernate.cache.jbc2.collection.CollectionRegionImpl;import org.hibernate.cache.jbc2.entity.TransactionalAccess;import org.hibernate.cache.jbc2.util.CacheHelper;import org.hibernate.cache.jbc2.util.NonLockingDataVersion;import org.hibernate.cfg.Configuration;import org.hibernate.test.cache.jbc2.AbstractJBossCacheTestCase;import org.hibernate.test.util.CacheTestUtil;import org.hibernate.util.ComparableComparator;import org.jboss.cache.Cache;import org.jboss.cache.Fqn;import org.jboss.cache.Node;import org.jboss.cache.NodeSPI;import org.jboss.cache.transaction.BatchModeTransactionManager;/**  * Base class for tests of CollectionRegionAccessStrategy impls. *  * @author <a href="brian.stansberry@jboss.com">Brian Stansberry</a> * @version $Revision: 1 $ */public abstract class AbstractCollectionRegionAccessStrategyTestCase extends AbstractJBossCacheTestCase {    public static final String REGION_NAME = "test/com.foo.test";    public static final String KEY_BASE = "KEY";    public static final String VALUE1 = "VALUE1";    public static final String VALUE2 = "VALUE2";        protected static int testCount;        protected static Configuration localCfg;    protected static JBossCacheRegionFactory localRegionFactory;    protected static Cache localCache;    protected static Configuration remoteCfg;    protected static JBossCacheRegionFactory remoteRegionFactory;    protected static Cache remoteCache;        protected CollectionRegion localCollectionRegion;    protected CollectionRegionAccessStrategy localAccessStrategy;    protected CollectionRegion remoteCollectionRegion;    protected CollectionRegionAccessStrategy remoteAccessStrategy;        protected boolean invalidation;    protected boolean optimistic;    protected boolean synchronous;        protected Exception node1Exception;    protected Exception node2Exception;        protected AssertionFailedError node1Failure;    protected AssertionFailedError node2Failure;        public static Test getTestSetup(Class testClass, String configName) {        TestSuite suite = new TestSuite(testClass);        return new AccessStrategyTestSetup(suite, configName);    }        public static Test getTestSetup(Test test, String configName) {        return new AccessStrategyTestSetup(test, configName);    }        /**     * Create a new TransactionalAccessTestCase.     *      * @param name     */    public AbstractCollectionRegionAccessStrategyTestCase(String name) {        super(name);    }    protected abstract AccessType getAccessType();    protected void setUp() throws Exception {        super.setUp();                // Sleep a bit to avoid concurrent FLUSH problem        avoidConcurrentFlush();                invalidation = CacheHelper.isClusteredInvalidation(localCache);        synchronous = CacheHelper.isSynchronous(localCache);        optimistic = localCache.getConfiguration().getNodeLockingScheme() == org.jboss.cache.config.Configuration.NodeLockingScheme.OPTIMISTIC;        localCollectionRegion = localRegionFactory.buildCollectionRegion(REGION_NAME, localCfg.getProperties(), getCacheDataDescription());        localAccessStrategy = localCollectionRegion.buildAccessStrategy(getAccessType());                // Sleep a bit to avoid concurrent FLUSH problem        avoidConcurrentFlush();                remoteCollectionRegion = remoteRegionFactory.buildCollectionRegion(REGION_NAME, remoteCfg.getProperties(), getCacheDataDescription());        remoteAccessStrategy = remoteCollectionRegion.buildAccessStrategy(getAccessType());                node1Exception = null;        node2Exception = null;                node1Failure = null;        node2Failure  = null;    }    protected void tearDown() throws Exception {                super.tearDown();                if (localCollectionRegion != null)            localCollectionRegion.destroy();        if (remoteCollectionRegion != null)            remoteCollectionRegion.destroy();                try {            localCache.getInvocationContext().getOptionOverrides().setCacheModeLocal(true);            localCache.removeNode(Fqn.ROOT);        }        catch (Exception e) {            log.error("Problem purging local cache" ,e);        }                try {            remoteCache.getInvocationContext().getOptionOverrides().setCacheModeLocal(true);            remoteCache.removeNode(Fqn.ROOT);        }        catch (Exception e) {            log.error("Problem purging remote cache" ,e);        }                node1Exception = null;        node2Exception = null;                node1Failure = null;        node2Failure  = null;    }        protected static Configuration createConfiguration(String configName) {        Configuration cfg = CacheTestUtil.buildConfiguration(REGION_PREFIX, MultiplexedJBossCacheRegionFactory.class, true, false);        cfg.setProperty(MultiplexingCacheInstanceManager.ENTITY_CACHE_RESOURCE_PROP, configName);        return cfg;    }        protected CacheDataDescription getCacheDataDescription() {        return new CacheDataDescriptionImpl(true, true, ComparableComparator.INSTANCE);    }        protected boolean isUsingOptimisticLocking() {        return optimistic;    }        protected boolean isUsingInvalidation() {        return invalidation;    }        protected boolean isSynchronous() {        return synchronous;    }        protected Fqn getRegionFqn(String regionName, String regionPrefix) {        return BasicRegionAdapter.getTypeLastRegionFqn(regionName, regionPrefix, CollectionRegionImpl.TYPE);    }        /**     * This is just a setup test where we assert that the cache config is     * as we expected.     */    public abstract void testCacheConfiguration();        /**     * Test method for {@link TransactionalAccess#getRegion()}.     */    public void testGetRegion() {        assertEquals("Correct region", localCollectionRegion, localAccessStrategy.getRegion());    }    /**     * Test method for {@link TransactionalAccess#putFromLoad(java.lang.Object, java.lang.Object, long, java.lang.Object)}.     */    public void testPutFromLoad() throws Exception {        putFromLoadTest(false);    }    /**     * Test method for {@link TransactionalAccess#putFromLoad(java.lang.Object, java.lang.Object, long, java.lang.Object, boolean)}.     */    public void testPutFromLoadMinimal() throws Exception {        putFromLoadTest(true);    }        /**     * Simulate 2 nodes, both start, tx do a get, experience a cache miss,     * then 'read from db.' First does a putFromLoad, then an evict (to represent a change).     * Second tries to do a putFromLoad with stale data (i.e. it took     * longer to read from the db).  Both commit their tx. Then     * both start a new tx and get. First should see the updated data;     * second should either see the updated data (isInvalidation()( == false)     * or null (isInvalidation() == true).     *      * @param useMinimalAPI     * @throws Exception     */    private void putFromLoadTest(final boolean useMinimalAPI) throws Exception {                final String KEY = KEY_BASE + testCount++;                final CountDownLatch writeLatch1 = new CountDownLatch(1);        final CountDownLatch writeLatch2 = new CountDownLatch(1);        final CountDownLatch completionLatch = new CountDownLatch(2);                Thread node1 = new Thread() {                                  public void run() {                                try {                           long txTimestamp = System.currentTimeMillis();                    BatchModeTransactionManager.getInstance().begin();                                        assertEquals("node1 starts clean", null, localAccessStrategy.get(KEY, txTimestamp));                                        writeLatch1.await();                                        if (useMinimalAPI) {                        localAccessStrategy.putFromLoad(KEY, VALUE2, txTimestamp, new Integer(2), true);                                            }                    else {                        localAccessStrategy.putFromLoad(KEY, VALUE2, txTimestamp, new Integer(2));                    }                                        BatchModeTransactionManager.getInstance().commit();                }                catch (Exception e) {                    log.error("node1 caught exception", e);                    node1Exception = e;                    rollback();                }                catch (AssertionFailedError e) {                    node1Failure = e;                    rollback();                }                finally {                    // Let node2 write                    writeLatch2.countDown();                    completionLatch.countDown();                }            }        };                Thread node2 = new Thread() {                      public void run() {                                 try {                                      long txTimestamp = System.currentTimeMillis();                    BatchModeTransactionManager.getInstance().begin();                                        assertNull("node2 starts clean", remoteAccessStrategy.get(KEY, txTimestamp));                                        // Let node1 write                    writeLatch1.countDown();                    // Wait for node1 to finish                    writeLatch2.await();                    

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -