From: Alexey L. <lou...@us...> - 2004-07-26 16:13:20
|
User: loubyansky Date: 04/07/26 09:13:10 Modified: src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema Tag: Branch_3_2 Cache.java TableCache.java EntityTable.java Log: turned TableCache into an MBean, added CacheListener interface Revision Changes Path No revision No revision 1.1.2.4 +32 -1 jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/Cache.java Index: Cache.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/Cache.java,v retrieving revision 1.1.2.3 retrieving revision 1.1.2.4 diff -u -r1.1.2.3 -r1.1.2.4 --- Cache.java 18 Jul 2004 16:57:00 -0000 1.1.2.3 +++ Cache.java 26 Jul 2004 16:13:10 -0000 1.1.2.4 @@ -6,11 +6,12 @@ */ package org.jboss.ejb.plugins.cmp.jdbc2.schema; + import javax.transaction.Transaction; /** * @author <a href="mailto:al...@jb...">Alexey Loubyansky</a> - * @version <tt>$Revision: 1.1.2.3 $</tt> + * @version <tt>$Revision: 1.1.2.4 $</tt> */ public interface Cache { @@ -32,6 +33,10 @@ void releaseLock(Transaction tx, Object pk) throws Exception; + void start() throws Exception; + + void stop() throws Exception; + Cache NONE = new Cache() { public void lock() @@ -77,6 +82,14 @@ public void releaseLock(Transaction tx, Object pk) throws Exception { } + + public void start() + { + } + + public void stop() + { + } }; interface CacheLoader @@ -85,4 +98,22 @@ Object getCachedValue(); } + + interface Listener + { + void contention(long time); + + void eviction(Object pk, int size); + + public Listener NOOP = new Listener() + { + public void contention(long time) + { + } + + public void eviction(Object pk, int size) + { + } + }; + } } 1.1.2.7 +37 -2 jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/TableCache.java Index: TableCache.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/TableCache.java,v retrieving revision 1.1.2.6 retrieving revision 1.1.2.7 diff -u -r1.1.2.6 -r1.1.2.7 --- TableCache.java 18 Jul 2004 16:57:00 -0000 1.1.2.6 +++ TableCache.java 26 Jul 2004 16:13:10 -0000 1.1.2.7 @@ -6,6 +6,8 @@ */ package org.jboss.ejb.plugins.cmp.jdbc2.schema; +import org.jboss.system.ServiceMBeanSupport; + import javax.transaction.Transaction; import java.util.Map; import java.util.HashMap; @@ -15,10 +17,14 @@ * Simple LRU cache. Items are evicted when maxCapacity is exceeded. * * @author <a href="mailto:al...@jb...">Alexey Loubyansky</a> - * @version <tt>$Revision: 1.1.2.6 $</tt> + * @version <tt>$Revision: 1.1.2.7 $</tt> + * @jmx:mbean extends="org.jboss.system.ServiceMBean" */ -public class TableCache implements Cache +public class TableCache + extends ServiceMBeanSupport + implements Cache, TableCacheMBean { + private Cache.Listener listener = Cache.Listener.NOOP; private final Map rowsById; private CachedRow head; private CachedRow tail; @@ -32,10 +38,36 @@ rowsById = new HashMap(initialCapacity); } + /** + * @jmx.managed-operation + */ + public void registerListener(Cache.Listener listener) + { + log.debug("Registered listener for " + getServiceName()); + this.listener = listener; + } + + /** + * @jmx.managed-operation + */ + public int size() + { + lock(); + try + { + return rowsById.size(); + } + finally + { + unlock(); + } + } + public synchronized void lock() { if(locked) { + long start = System.currentTimeMillis(); while(locked) { try @@ -46,6 +78,8 @@ { } } + + listener.contention(System.currentTimeMillis() - start); } locked = true; } @@ -149,6 +183,7 @@ { dereference(victim); rowsById.remove(victim.pk); + listener.eviction(row.pk, rowsById.size()); } victim = nextVictim; } 1.1.2.20 +53 -3 jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/EntityTable.java Index: EntityTable.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc2/schema/EntityTable.java,v retrieving revision 1.1.2.19 retrieving revision 1.1.2.20 diff -u -r1.1.2.19 -r1.1.2.20 --- EntityTable.java 18 Jul 2004 16:57:00 -0000 1.1.2.19 +++ EntityTable.java 26 Jul 2004 16:13:10 -0000 1.1.2.20 @@ -18,6 +18,9 @@ import org.jboss.ejb.plugins.cmp.jdbc2.bridge.JDBCEntityBridge2; import org.jboss.ejb.plugins.cmp.jdbc2.bridge.JDBCCMPFieldBridge2; import org.jboss.logging.Logger; +import org.jboss.mx.util.MBeanServerLocator; +import org.jboss.mx.util.MBeanProxyExt; +import org.jboss.system.ServiceControllerMBean; import javax.naming.InitialContext; import javax.naming.NamingException; @@ -26,6 +29,8 @@ import javax.ejb.ObjectNotFoundException; import javax.ejb.EJBException; import javax.transaction.Transaction; +import javax.management.MBeanServer; +import javax.management.ObjectName; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -38,7 +43,7 @@ * todo refactor optimistic locking * * @author <a href="mailto:al...@jb...">Alexey Loubyansky</a> - * @version <tt>$Revision: 1.1.2.19 $</tt> + * @version <tt>$Revision: 1.1.2.20 $</tt> */ public class EntityTable implements Table @@ -70,7 +75,9 @@ private Logger log; - private Cache cache = new TableCache(500, 1000); + private Cache cache; + private ServiceControllerMBean serviceController; + private ObjectName cacheName; public EntityTable(JDBCEntityMetaData metadata, JDBCEntityBridge2 entity, Schema schema, int tableId) throws DeploymentException @@ -98,9 +105,28 @@ insertStrategy = NON_BATCH_UPDATE; deleteStrategy = NON_BATCH_UPDATE; updateStrategy = NON_BATCH_UPDATE; + + // create cache + cache = new TableCache(500, 1000); + + final MBeanServer server = MBeanServerLocator.locateJBoss(); + serviceController = (ServiceControllerMBean) + MBeanProxyExt.create(ServiceControllerMBean.class, + ServiceControllerMBean.OBJECT_NAME, + server); + try + { + cacheName = new ObjectName("jboss.cmp:service=tablecache,ejbname=" + metadata.getName() + ",table=" + tableName); + server.registerMBean(cache, cacheName); + serviceController.create(cacheName); + } + catch(Exception e) + { + throw new DeploymentException("Failed to register table cache for " + tableName, e); + } } - public void generateSql() throws DeploymentException + public void start() throws DeploymentException { final JDBCAbstractCMRFieldBridge[] cmrFields = entity.getCMRFields(); relationsTotal = (cmrFields != null ? cmrFields.length : 0); @@ -214,6 +240,30 @@ } log.debug("duplicate pk sql: " + duplicatePkSql); } + + try + { + cache.start(); + } + catch(Exception e) + { + throw new DeploymentException("Failed to start cache", e); + } + + try + { + serviceController.start(cacheName); + } + catch(Exception e) + { + throw new DeploymentException("Failed to start table cache.", e); + } + } + + public void stop() throws Exception + { + serviceController.stop(cacheName); + serviceController = null; } public StringBuffer appendColumnNames(JDBCCMPFieldBridge2[] fields, String alias, StringBuffer buf) |