[Java programming language only]

在 Java 应用程序中配置和实现锁定

您可以在 WebSphere® eXtreme Scale 配置中的每一个 BackingMap 上定义乐观锁定策略、悲观锁定策略或“无”锁定策略。

开始之前

关于此任务

要避免 java.lang.IllegalStateException 异常,必须先对 Objectgrid 实例调用 setLockStrategy 方法,再调用 initializegetSession 方法。

过程

  1. 在 Java™ 应用程序中配置锁定策略。
    • 配置乐观锁定策略。使用 setLockStrategy 方法:
      import com.ibm.websphere.objectgrid.BackingMap;
      import com.ibm.websphere.objectgrid.LockStrategy;
      import com.ibm.websphere.objectgrid.ObjectGrid;
      import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
      ...
      ObjectGrid og =
      		ObjectGridManagerFactory.getObjectGridManager().createObjectGrid("test");
      BackingMap bm = og.defineMap("optimisticMap");
      bm.setLockStrategy( LockStrategy.OPTIMISTIC );
    • 配置悲观锁定策略。使用 setLockStrategy 方法:
      import com.ibm.websphere.objectgrid.BackingMap;
      import com.ibm.websphere.objectgrid.LockStrategy;
      import com.ibm.websphere.objectgrid.ObjectGrid;
      import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
      ...
      ObjectGrid og =
      		ObjectGridManagerFactory.getObjectGridManager().createObjectGrid("test");
      BackingMap bm = og.defineMap("pessimisticMap");
      bm.setLockStrategy( LockStrategy.PESSIMISTIC);
    • 配置“无”锁定策略。使用 setLockStrategy 方法:
      [Version 8.6 and later]注: 已配置成使用“无”锁定策略的 BackingMap 无法参与多分区事务。
      import com.ibm.websphere.objectgrid.BackingMap;
      import com.ibm.websphere.objectgrid.LockStrategy;
      import com.ibm.websphere.objectgrid.ObjectGrid;
      import com.ibm.websphere.objectgrid.ObjectGridManagerFactory;
      ...
      ObjectGrid og =
      		ObjectGridManagerFactory.getObjectGridManager().createObjectGrid("test");
      BackingMap bm = og.defineMap("noLockingMap");
      bm.setLockStrategy( LockStrategy.NONE);
  2. 配置锁定超时值。 对 BackingMap 实例使用 setLockTimeout 方法:
    bm.setLockTimeout( 60 );
    setLockTimeout 方法参数是一个 Java 原语整数,用于指定 eXtreme Scale 等待授予锁定方式的秒数。 如果事务等待的时间超过为 BackingMap 配置的锁定等待超时值,那么将产生 com.ibm.websphere.objectgrid.LockTimeoutException 异常。
  3. [Version 8.6 and later]如果您使用的是悲观锁定策略,那么您可以使用 lock 方法在数据网格中锁定键,或者锁定键并确定该值是否存在于数据网格中。 在前发行版中,您在数据网格中使用了 getgetForUpdate API 来锁定键。但是,如果不需要客户机中的数据,那么将可能的大值对象检索到客户机时,性能会下降。containsKey 方法不持有任何锁定,所以在使用悲观锁定时,强制您使用 getgetForUpdate 方法来获取相应的锁定。现在,锁定 API 在持有锁定的同时,为您提供了 containsKey 方法。请参阅下列示例:
    • 以下方法会在映射中锁定键:如果该键存在,那么返回 true;如果该键不存在,那么返回 false。
      boolean ObjectMap.lock(Object key, LockMode lockMode);
    • [Version 8.6 and later]以下方法会在映射中锁定一列键并返回一列 true 或 false 值:如果该键存在,那么返回 true;如果该键不存在,那么返回 false
      List<Boolean> ObjectMap.lockAll(List keys, LockMode lockMode);
      LockMode 是具有可能值的枚举,您可以在该方式下指定要锁定的键:
      • SHARED、UPGRADABLE 和 EXCLUSIVE
    [Version 8.6 and later]用于设置 LockMode 参数的示例如下所示:
    		session.begin();
    map.lock(key, LockMode.UPGRADABLE);
    map.upsert();
    session.commit()