You can define an optimistic, a pessimistic, or no locking strategy on each BackingMap in
the WebSphere® eXtreme Scale configuration.
About this task
To avoid a java.lang.IllegalStateException exception, you must call the
setLockStrategy method before calling the initialize or
getSession methods on the ObjectGrid instance.
Procedure
-
Configure a locking strategy in your Java™
application.
- Configure an optimistic locking strategy. Use the setLockStrategy method:
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 );
- Configure a pessimistic locking strategy. Use the setLockStrategy
method:
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);
- Configure a no locking strategy. Use the setLockStrategy method:
Note: BackingMaps that are configured to use a no locking strategy cannot participate in
a multi-partition transaction.
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);
-
Configure a lock timeout value.
Use the
setLockTimeout method on the BackingMap
instance:
bm.setLockTimeout( 60 );
The
setLockTimeout method
parameter is a Java primitive integer that specifies the
number of seconds that
eXtreme Scale waits for a lock mode to be
granted. If a transaction waits longer than the lock wait timeout value configured for the
BackingMap, a com.ibm.websphere.objectgrid.LockTimeoutException exception results.
-
If you are using a pessimistic locking strategy, you can use the lock method
to lock the key in the data grid or lock the key and determine whether the value exists in the data
grid.
In previous releases, you used the
get and
getForUpdate
APIs to lock keys in the data grid. However, if you did not need data from the client, performance
degraded when retrieving potentially large value objects to the client. The
containsKey method does not hold any locks, so you were forced do use
get and
getForUpdate methods to get appropriate locks when
using pessimistic locking. The lock API now gives you a
containsKey method while
holding the lock. See the following examples:
- The following methods lock the key in the map, returning true if the key exists, and returning
false if the key does not
exist.
boolean ObjectMap.lock(Object key, LockMode lockMode);
- The following method locks a list of keys in the map, returning a list of true
or false values; returning true if the key exists, and returning
false if the key does not
exist.
List<Boolean> ObjectMap.lockAll(List keys, LockMode lockMode);
LockMode
is an enum with possible values where you can specify the keys that you want to lock:
- SHARED, UPGRADABLE, and EXCLUSIVE
An example of setting the LockMode parameter
follows:
session.begin();
map.lock(key, LockMode.UPGRADABLE);
map.upsert();
session.commit()