/* * IronJacamar, a Java EE Connector Architecture implementation * Copyright 2016, Red Hat Inc, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the Eclipse Public License 1.0 as * published by the Free Software Foundation. * * This software 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 Eclipse * Public License for more details. * * You should have received a copy of the Eclipse Public License * along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.ironjacamar.core.connectionmanager.pool; import org.ironjacamar.core.api.connectionmanager.pool.PoolStatistics; import org.ironjacamar.core.spi.transaction.XAResourceStatistics; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Collections; import java.util.HashMap; import java.util.Locale; import java.util.Map; import java.util.ResourceBundle; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; /** * Pool statistics * * @author <a href="jesper.pedersen@ironjacamar.org">Jesper Pedersen</a> */ public class PoolStatisticsImpl implements PoolStatistics, XAResourceStatistics { /** Serial version uid */ private static final long serialVersionUID = 1L; private static final String ACTIVE_COUNT = "ActiveCount"; private static final String AVAILABLE_COUNT = "AvailableCount"; private static final String AVERAGE_BLOCKING_TIME = "AverageBlockingTime"; private static final String AVERAGE_CREATION_TIME = "AverageCreationTime"; private static final String AVERAGE_GET_TIME = "AverageGetTime"; private static final String AVERAGE_POOL_TIME = "AveragePoolTime"; private static final String AVERAGE_USAGE_TIME = "AverageUsageTime"; private static final String BLOCKING_FAILURE_COUNT = "BlockingFailureCount"; private static final String CREATED_COUNT = "CreatedCount"; private static final String DESTROYED_COUNT = "DestroyedCount"; private static final String IDLE_COUNT = "IdleCount"; private static final String IN_USE_COUNT = "InUseCount"; private static final String MAX_CREATION_TIME = "MaxCreationTime"; private static final String MAX_GET_TIME = "MaxGetTime"; private static final String MAX_POOL_TIME = "MaxPoolTime"; private static final String MAX_USAGE_TIME = "MaxUsageTime"; private static final String MAX_USED_COUNT = "MaxUsedCount"; private static final String MAX_WAIT_COUNT = "MaxWaitCount"; private static final String MAX_WAIT_TIME = "MaxWaitTime"; private static final String TIMED_OUT = "TimedOut"; private static final String TOTAL_BLOCKING_TIME = "TotalBlockingTime"; private static final String TOTAL_CREATION_TIME = "TotalCreationTime"; private static final String TOTAL_GET_TIME = "TotalGetTime"; private static final String TOTAL_POOL_TIME = "TotalPoolTime"; private static final String TOTAL_USAGE_TIME = "TotalUsageTime"; private static final String WAIT_COUNT = "WaitCount"; private static final String XA_COMMIT_COUNT = "XACommitCount"; private static final String XA_COMMIT_AVERAGE_TIME = "XACommitAverageTime"; private static final String XA_COMMIT_TOTAL_TIME = "XACommitTotalTime"; private static final String XA_COMMIT_MAX_TIME = "XACommitMaxTime"; private static final String XA_END_COUNT = "XAEndCount"; private static final String XA_END_AVERAGE_TIME = "XAEndAverageTime"; private static final String XA_END_TOTAL_TIME = "XAEndTotalTime"; private static final String XA_END_MAX_TIME = "XAEndMaxTime"; private static final String XA_FORGET_COUNT = "XAForgetCount"; private static final String XA_FORGET_AVERAGE_TIME = "XAForgetAverageTime"; private static final String XA_FORGET_TOTAL_TIME = "XAForgetTotalTime"; private static final String XA_FORGET_MAX_TIME = "XAForgetMaxTime"; private static final String XA_PREPARE_COUNT = "XAPrepareCount"; private static final String XA_PREPARE_AVERAGE_TIME = "XAPrepareAverageTime"; private static final String XA_PREPARE_TOTAL_TIME = "XAPrepareTotalTime"; private static final String XA_PREPARE_MAX_TIME = "XAPrepareMaxTime"; private static final String XA_RECOVER_COUNT = "XARecoverCount"; private static final String XA_RECOVER_AVERAGE_TIME = "XARecoverAverageTime"; private static final String XA_RECOVER_TOTAL_TIME = "XARecoverTotalTime"; private static final String XA_RECOVER_MAX_TIME = "XARecoverMaxTime"; private static final String XA_ROLLBACK_COUNT = "XARollbackCount"; private static final String XA_ROLLBACK_AVERAGE_TIME = "XARollbackAverageTime"; private static final String XA_ROLLBACK_TOTAL_TIME = "XARollbackTotalTime"; private static final String XA_ROLLBACK_MAX_TIME = "XARollbackMaxTime"; private static final String XA_START_COUNT = "XAStartCount"; private static final String XA_START_AVERAGE_TIME = "XAStartAverageTime"; private static final String XA_START_TOTAL_TIME = "XAStartTotalTime"; private static final String XA_START_MAX_TIME = "XAStartMaxTime"; private int maxPoolSize; private transient SortedSet<String> names; private transient Map<String, Class> types; private transient Map<Locale, ResourceBundle> rbs; private transient AtomicBoolean enabled; private transient AtomicInteger createdCount; private transient AtomicInteger destroyedCount; private transient AtomicInteger maxUsedCount; private transient AtomicLong maxCreationTime; private transient AtomicLong maxGetTime; private transient AtomicLong maxPoolTime; private transient AtomicLong maxUsageTime; private transient AtomicInteger maxWaitCount; private transient AtomicLong maxWaitTime; private transient AtomicInteger timedOut; private transient AtomicLong totalBlockingTime; private transient AtomicLong totalBlockingTimeInvocations; private transient AtomicLong totalCreationTime; private transient AtomicLong totalGetTime; private transient AtomicLong totalGetTimeInvocations; private transient AtomicLong totalPoolTime; private transient AtomicLong totalPoolTimeInvocations; private transient AtomicLong totalUsageTime; private transient AtomicLong totalUsageTimeInvocations; private transient AtomicInteger inUseCount; private transient AtomicInteger blockingFailureCount; private transient AtomicInteger waitCount; private transient AtomicLong commitCount; private transient AtomicLong commitTotalTime; private transient AtomicLong commitMaxTime; private transient AtomicLong endCount; private transient AtomicLong endTotalTime; private transient AtomicLong endMaxTime; private transient AtomicLong forgetCount; private transient AtomicLong forgetTotalTime; private transient AtomicLong forgetMaxTime; private transient AtomicLong prepareCount; private transient AtomicLong prepareTotalTime; private transient AtomicLong prepareMaxTime; private transient AtomicLong recoverCount; private transient AtomicLong recoverTotalTime; private transient AtomicLong recoverMaxTime; private transient AtomicLong rollbackCount; private transient AtomicLong rollbackTotalTime; private transient AtomicLong rollbackMaxTime; private transient AtomicLong startCount; private transient AtomicLong startTotalTime; private transient AtomicLong startMaxTime; /** * Constructor * @param maxPoolSize The maximum pool size */ public PoolStatisticsImpl(int maxPoolSize) { init(maxPoolSize); } /** * Init * @param maxPoolSize The maximum pool size */ private void init(int maxPoolSize) { this.maxPoolSize = maxPoolSize; this.createdCount = new AtomicInteger(0); this.destroyedCount = new AtomicInteger(0); this.maxCreationTime = new AtomicLong(Long.MIN_VALUE); this.maxGetTime = new AtomicLong(Long.MIN_VALUE); this.maxPoolTime = new AtomicLong(Long.MIN_VALUE); this.maxUsageTime = new AtomicLong(Long.MIN_VALUE); this.maxUsedCount = new AtomicInteger(Integer.MIN_VALUE); this.maxWaitCount = new AtomicInteger(0); this.maxWaitTime = new AtomicLong(Long.MIN_VALUE); this.timedOut = new AtomicInteger(0); this.totalBlockingTime = new AtomicLong(0); this.totalBlockingTimeInvocations = new AtomicLong(0); this.totalCreationTime = new AtomicLong(0); this.totalGetTime = new AtomicLong(0); this.totalGetTimeInvocations = new AtomicLong(0); this.totalPoolTime = new AtomicLong(0); this.totalPoolTimeInvocations = new AtomicLong(0); this.totalUsageTime = new AtomicLong(0); this.totalUsageTimeInvocations = new AtomicLong(0); this.inUseCount = new AtomicInteger(0); this.blockingFailureCount = new AtomicInteger(0); this.waitCount = new AtomicInteger(0); this.commitCount = new AtomicLong(0L); this.commitTotalTime = new AtomicLong(0L); this.commitMaxTime = new AtomicLong(0L); this.endCount = new AtomicLong(0L); this.endTotalTime = new AtomicLong(0L); this.endMaxTime = new AtomicLong(0L); this.forgetCount = new AtomicLong(0L); this.forgetTotalTime = new AtomicLong(0L); this.forgetMaxTime = new AtomicLong(0L); this.prepareCount = new AtomicLong(0L); this.prepareTotalTime = new AtomicLong(0L); this.prepareMaxTime = new AtomicLong(0L); this.recoverCount = new AtomicLong(0L); this.recoverTotalTime = new AtomicLong(0L); this.recoverMaxTime = new AtomicLong(0L); this.rollbackCount = new AtomicLong(0L); this.rollbackTotalTime = new AtomicLong(0L); this.rollbackMaxTime = new AtomicLong(0L); this.startCount = new AtomicLong(0L); this.startTotalTime = new AtomicLong(0L); this.startMaxTime = new AtomicLong(0L); SortedSet<String> n = new TreeSet<String>(); Map<String, Class> t = new HashMap<String, Class>(); n.add(ACTIVE_COUNT); t.put(ACTIVE_COUNT, int.class); n.add(AVAILABLE_COUNT); t.put(AVAILABLE_COUNT, int.class); n.add(AVERAGE_BLOCKING_TIME); t.put(AVERAGE_BLOCKING_TIME, long.class); n.add(AVERAGE_CREATION_TIME); t.put(AVERAGE_CREATION_TIME, long.class); n.add(AVERAGE_GET_TIME); t.put(AVERAGE_GET_TIME, long.class); n.add(AVERAGE_USAGE_TIME); t.put(AVERAGE_USAGE_TIME, long.class); n.add(AVERAGE_POOL_TIME); t.put(AVERAGE_POOL_TIME, long.class); n.add(BLOCKING_FAILURE_COUNT); t.put(BLOCKING_FAILURE_COUNT, int.class); n.add(CREATED_COUNT); t.put(CREATED_COUNT, int.class); n.add(DESTROYED_COUNT); t.put(DESTROYED_COUNT, int.class); n.add(IDLE_COUNT); t.put(IDLE_COUNT, int.class); n.add(IN_USE_COUNT); t.put(IN_USE_COUNT, int.class); n.add(MAX_CREATION_TIME); t.put(MAX_CREATION_TIME, long.class); n.add(MAX_GET_TIME); t.put(MAX_GET_TIME, long.class); n.add(MAX_POOL_TIME); t.put(MAX_POOL_TIME, long.class); n.add(MAX_USAGE_TIME); t.put(MAX_USAGE_TIME, long.class); n.add(MAX_USED_COUNT); t.put(MAX_USED_COUNT, int.class); n.add(MAX_WAIT_COUNT); t.put(MAX_WAIT_COUNT, int.class); n.add(MAX_WAIT_TIME); t.put(MAX_WAIT_TIME, long.class); n.add(TIMED_OUT); t.put(TIMED_OUT, int.class); n.add(TOTAL_BLOCKING_TIME); t.put(TOTAL_BLOCKING_TIME, long.class); n.add(TOTAL_CREATION_TIME); t.put(TOTAL_CREATION_TIME, long.class); n.add(TOTAL_GET_TIME); t.put(TOTAL_GET_TIME, long.class); n.add(TOTAL_POOL_TIME); t.put(TOTAL_POOL_TIME, long.class); n.add(TOTAL_USAGE_TIME); t.put(TOTAL_USAGE_TIME, long.class); n.add(WAIT_COUNT); t.put(WAIT_COUNT, int.class); n.add(XA_COMMIT_COUNT); t.put(XA_COMMIT_COUNT, long.class); n.add(XA_COMMIT_AVERAGE_TIME); t.put(XA_COMMIT_AVERAGE_TIME, long.class); n.add(XA_COMMIT_TOTAL_TIME); t.put(XA_COMMIT_TOTAL_TIME, long.class); n.add(XA_COMMIT_MAX_TIME); t.put(XA_COMMIT_MAX_TIME, long.class); n.add(XA_END_COUNT); t.put(XA_END_COUNT, long.class); n.add(XA_END_AVERAGE_TIME); t.put(XA_END_AVERAGE_TIME, long.class); n.add(XA_END_TOTAL_TIME); t.put(XA_END_TOTAL_TIME, long.class); n.add(XA_END_MAX_TIME); t.put(XA_END_MAX_TIME, long.class); n.add(XA_FORGET_COUNT); t.put(XA_FORGET_COUNT, long.class); n.add(XA_FORGET_AVERAGE_TIME); t.put(XA_FORGET_AVERAGE_TIME, long.class); n.add(XA_FORGET_TOTAL_TIME); t.put(XA_FORGET_TOTAL_TIME, long.class); n.add(XA_FORGET_MAX_TIME); t.put(XA_FORGET_MAX_TIME, long.class); n.add(XA_PREPARE_COUNT); t.put(XA_PREPARE_COUNT, long.class); n.add(XA_PREPARE_AVERAGE_TIME); t.put(XA_PREPARE_AVERAGE_TIME, long.class); n.add(XA_PREPARE_TOTAL_TIME); t.put(XA_PREPARE_TOTAL_TIME, long.class); n.add(XA_PREPARE_MAX_TIME); t.put(XA_PREPARE_MAX_TIME, long.class); n.add(XA_RECOVER_COUNT); t.put(XA_RECOVER_COUNT, long.class); n.add(XA_RECOVER_AVERAGE_TIME); t.put(XA_RECOVER_AVERAGE_TIME, long.class); n.add(XA_RECOVER_TOTAL_TIME); t.put(XA_RECOVER_TOTAL_TIME, long.class); n.add(XA_RECOVER_MAX_TIME); t.put(XA_RECOVER_MAX_TIME, long.class); n.add(XA_ROLLBACK_COUNT); t.put(XA_ROLLBACK_COUNT, long.class); n.add(XA_ROLLBACK_AVERAGE_TIME); t.put(XA_ROLLBACK_AVERAGE_TIME, long.class); n.add(XA_ROLLBACK_TOTAL_TIME); t.put(XA_ROLLBACK_TOTAL_TIME, long.class); n.add(XA_ROLLBACK_MAX_TIME); t.put(XA_ROLLBACK_MAX_TIME, long.class); n.add(XA_START_COUNT); t.put(XA_START_COUNT, long.class); n.add(XA_START_AVERAGE_TIME); t.put(XA_START_AVERAGE_TIME, long.class); n.add(XA_START_TOTAL_TIME); t.put(XA_START_TOTAL_TIME, long.class); n.add(XA_START_MAX_TIME); t.put(XA_START_MAX_TIME, long.class); this.names = Collections.unmodifiableSortedSet(n); this.types = Collections.unmodifiableMap(t); this.enabled = new AtomicBoolean(true); ResourceBundle defaultResourceBundle = ResourceBundle.getBundle("poolstatistics", Locale.US, SecurityActions.getClassLoader(PoolStatisticsImpl.class)); this.rbs = new HashMap<Locale, ResourceBundle>(1); this.rbs.put(Locale.US, defaultResourceBundle); clear(); } /** * {@inheritDoc} */ public Set<String> getNames() { return names; } /** * {@inheritDoc} */ public Class getType(String name) { return types.get(name); } /** * {@inheritDoc} */ public String getDescription(String name) { return getDescription(name, Locale.US); } /** * {@inheritDoc} */ public String getDescription(String name, Locale locale) { ResourceBundle rb = rbs.get(locale); if (rb == null) { ResourceBundle newResourceBundle = ResourceBundle.getBundle("poolstatistics", locale, SecurityActions.getClassLoader(PoolStatisticsImpl.class)); if (newResourceBundle != null) rbs.put(locale, newResourceBundle); } if (rb == null) rb = rbs.get(Locale.US); if (rb != null) return rb.getString(name); return ""; } /** * {@inheritDoc} */ @Override public Object getValue(String name) { if (ACTIVE_COUNT.equals(name)) { return getActiveCount(); } else if (AVAILABLE_COUNT.equals(name)) { return getAvailableCount(); } else if (AVERAGE_BLOCKING_TIME.equals(name)) { return getAverageBlockingTime(); } else if (AVERAGE_CREATION_TIME.equals(name)) { return getAverageCreationTime(); } else if (AVERAGE_GET_TIME.equals(name)) { return getAverageGetTime(); } else if (AVERAGE_USAGE_TIME.equals(name)) { return getAverageUsageTime(); } else if (AVERAGE_POOL_TIME.equals(name)) { return getAveragePoolTime(); } else if (BLOCKING_FAILURE_COUNT.equals(name)) { return getBlockingFailureCount(); } else if (CREATED_COUNT.equals(name)) { return getCreatedCount(); } else if (DESTROYED_COUNT.equals(name)) { return getDestroyedCount(); } else if (IDLE_COUNT.equals(name)) { return getIdleCount(); } else if (IN_USE_COUNT.equals(name)) { return getInUseCount(); } else if (MAX_CREATION_TIME.equals(name)) { return getMaxCreationTime(); } else if (MAX_GET_TIME.equals(name)) { return getMaxGetTime(); } else if (MAX_POOL_TIME.equals(name)) { return getMaxPoolTime(); } else if (MAX_USAGE_TIME.equals(name)) { return getMaxUsageTime(); } else if (MAX_USED_COUNT.equals(name)) { return getMaxUsedCount(); } else if (MAX_WAIT_COUNT.equals(name)) { return getMaxWaitCount(); } else if (MAX_WAIT_TIME.equals(name)) { return getMaxWaitTime(); } else if (TIMED_OUT.equals(name)) { return getTimedOut(); } else if (TOTAL_BLOCKING_TIME.equals(name)) { return getTotalBlockingTime(); } else if (TOTAL_CREATION_TIME.equals(name)) { return getTotalCreationTime(); } else if (TOTAL_GET_TIME.equals(name)) { return getTotalGetTime(); } else if (TOTAL_POOL_TIME.equals(name)) { return getTotalPoolTime(); } else if (TOTAL_USAGE_TIME.equals(name)) { return getTotalUsageTime(); } else if (WAIT_COUNT.equals(name)) { return getWaitCount(); } else if (XA_COMMIT_COUNT.equals(name)) { return getCommitCount(); } else if (XA_COMMIT_AVERAGE_TIME.equals(name)) { return getCommitAverageTime(); } else if (XA_COMMIT_TOTAL_TIME.equals(name)) { return getCommitTotalTime(); } else if (XA_COMMIT_MAX_TIME.equals(name)) { return getCommitMaxTime(); } else if (XA_END_COUNT.equals(name)) { return getEndCount(); } else if (XA_END_AVERAGE_TIME.equals(name)) { return getEndAverageTime(); } else if (XA_END_TOTAL_TIME.equals(name)) { return getEndTotalTime(); } else if (XA_END_MAX_TIME.equals(name)) { return getEndMaxTime(); } else if (XA_FORGET_COUNT.equals(name)) { return getForgetCount(); } else if (XA_FORGET_AVERAGE_TIME.equals(name)) { return getForgetAverageTime(); } else if (XA_FORGET_TOTAL_TIME.equals(name)) { return getForgetTotalTime(); } else if (XA_FORGET_MAX_TIME.equals(name)) { return getForgetMaxTime(); } else if (XA_PREPARE_COUNT.equals(name)) { return getPrepareCount(); } else if (XA_PREPARE_AVERAGE_TIME.equals(name)) { return getPrepareAverageTime(); } else if (XA_PREPARE_TOTAL_TIME.equals(name)) { return getPrepareTotalTime(); } else if (XA_PREPARE_MAX_TIME.equals(name)) { return getPrepareMaxTime(); } else if (XA_RECOVER_COUNT.equals(name)) { return getRecoverCount(); } else if (XA_RECOVER_AVERAGE_TIME.equals(name)) { return getRecoverAverageTime(); } else if (XA_RECOVER_TOTAL_TIME.equals(name)) { return getRecoverTotalTime(); } else if (XA_RECOVER_MAX_TIME.equals(name)) { return getRecoverMaxTime(); } else if (XA_ROLLBACK_COUNT.equals(name)) { return getRollbackCount(); } else if (XA_ROLLBACK_AVERAGE_TIME.equals(name)) { return getRollbackAverageTime(); } else if (XA_ROLLBACK_TOTAL_TIME.equals(name)) { return getRollbackTotalTime(); } else if (XA_ROLLBACK_MAX_TIME.equals(name)) { return getRollbackMaxTime(); } else if (XA_START_COUNT.equals(name)) { return getStartCount(); } else if (XA_START_AVERAGE_TIME.equals(name)) { return getStartAverageTime(); } else if (XA_START_TOTAL_TIME.equals(name)) { return getStartTotalTime(); } else if (XA_START_MAX_TIME.equals(name)) { return getStartMaxTime(); } return null; } /** * {@inheritDoc} */ public boolean isEnabled() { return enabled.get(); } /** * {@inheritDoc} */ public void setEnabled(boolean v) { enabled.set(v); clear(); } /** * {@inheritDoc} */ public int getActiveCount() { if (!enabled.get()) return 0; if (createdCount.get() < destroyedCount.get()) clear(); return createdCount.get() - destroyedCount.get(); } /** * {@inheritDoc} */ public int getAvailableCount() { if (!enabled.get()) return 0; return maxPoolSize - inUseCount.get(); } /** * {@inheritDoc} */ public long getAverageBlockingTime() { if (!enabled.get()) return 0L; return totalBlockingTimeInvocations.get() != 0 ? totalBlockingTime.get() / totalBlockingTimeInvocations.get() : 0; } /** * {@inheritDoc} */ public long getAverageCreationTime() { if (!enabled.get()) return 0L; return createdCount.get() != 0 ? totalCreationTime.get() / createdCount.get() : 0; } /** * {@inheritDoc} */ public long getAverageGetTime() { if (!enabled.get()) return 0L; return totalGetTimeInvocations.get() != 0 ? totalGetTime.get() / totalGetTimeInvocations.get() : 0; } /** * {@inheritDoc} */ public long getAverageUsageTime() { if (!enabled.get()) return 0L; return totalUsageTimeInvocations.get() != 0 ? totalUsageTime.get() / totalUsageTimeInvocations.get() : 0; } /** * {@inheritDoc} */ public long getAveragePoolTime() { if (!enabled.get()) return 0L; return totalPoolTimeInvocations.get() != 0 ? totalPoolTime.get() / totalPoolTimeInvocations.get() : 0; } /** * {@inheritDoc} */ public int getBlockingFailureCount() { if (!enabled.get()) return 0; return blockingFailureCount.get(); } /** * Delta the blocking failure count value */ public void deltaBlockingFailureCount() { if (enabled.get()) blockingFailureCount.incrementAndGet(); } /** * {@inheritDoc} */ public int getCreatedCount() { if (!enabled.get()) return 0; return createdCount.get(); } /** * Delta the created count value */ public void deltaCreatedCount() { if (enabled.get()) createdCount.incrementAndGet(); } /** * {@inheritDoc} */ public int getDestroyedCount() { if (!enabled.get()) return 0; return destroyedCount.get(); } /** * Delta the destroyed count value */ public void deltaDestroyedCount() { if (enabled.get()) destroyedCount.incrementAndGet(); } /** * {@inheritDoc} */ public int getIdleCount() { if (!enabled.get()) return 0; return getActiveCount() - getInUseCount(); } /** * {@inheritDoc} */ public int getInUseCount() { if (!enabled.get()) return 0; return inUseCount.get(); } /** * Delta in use count * @param v The value */ public void deltaInUseCount(int v) { setMaxUsedCount(inUseCount.addAndGet(v)); } /** * Get max used count * @return The value */ public int getMaxUsedCount() { if (!enabled.get()) return 0; return maxUsedCount.get() != Integer.MIN_VALUE ? maxUsedCount.get() : 0; } /** * Set max used count * @param v The value */ private void setMaxUsedCount(int v) { if (v > maxUsedCount.get()) maxUsedCount.set(v); } /** * {@inheritDoc} */ public long getMaxCreationTime() { if (!enabled.get()) return 0L; return maxCreationTime.get() != Long.MIN_VALUE ? maxCreationTime.get() : 0; } /** * {@inheritDoc} */ public long getMaxGetTime() { if (!enabled.get()) return 0L; return maxGetTime.get() != Long.MIN_VALUE ? maxGetTime.get() : 0; } /** * {@inheritDoc} */ public long getMaxPoolTime() { if (!enabled.get()) return 0L; return maxPoolTime.get() != Long.MIN_VALUE ? maxPoolTime.get() : 0; } /** * {@inheritDoc} */ public long getMaxUsageTime() { if (!enabled.get()) return 0L; return maxUsageTime.get() != Long.MIN_VALUE ? maxUsageTime.get() : 0; } /** * Get max wait count * @return The value */ public int getMaxWaitCount() { if (!isEnabled()) return 0; return maxWaitCount.get() != Integer.MIN_VALUE ? maxWaitCount.get() : 0; } /** * Set max wait count * @param v The value */ public void setMaxWaitCount(int v) { if (v > maxWaitCount.get()) maxWaitCount.set(v); } /** * {@inheritDoc} */ public long getMaxWaitTime() { if (!enabled.get()) return 0L; return maxWaitTime.get() != Long.MIN_VALUE ? maxWaitTime.get() : 0; } /** * {@inheritDoc} */ public int getTimedOut() { if (!enabled.get()) return 0; return timedOut.get(); } /** * Delta the timed out value */ public void deltaTimedOut() { if (enabled.get()) timedOut.incrementAndGet(); } /** * {@inheritDoc} */ public long getTotalBlockingTime() { if (!enabled.get()) return 0L; return totalBlockingTime.get(); } /** * Add delta to total blocking timeout * @param delta The value */ public void deltaTotalBlockingTime(long delta) { if (enabled.get() && delta > 0) { totalBlockingTime.addAndGet(delta); totalBlockingTimeInvocations.incrementAndGet(); if (delta > maxWaitTime.get()) maxWaitTime.set(delta); } } /** * {@inheritDoc} */ public long getTotalCreationTime() { if (!enabled.get()) return 0L; return totalCreationTime.get(); } /** * Add delta to total creation time * @param delta The value */ public void deltaTotalCreationTime(long delta) { if (enabled.get() && delta > 0) { totalCreationTime.addAndGet(delta); if (delta > maxCreationTime.get()) maxCreationTime.set(delta); } } /** * {@inheritDoc} */ public long getTotalGetTime() { if (!enabled.get()) return 0L; return totalGetTime.get(); } /** * Add delta to total get time * @param delta The value */ public void deltaTotalGetTime(long delta) { if (enabled.get() && delta > 0) { totalGetTime.addAndGet(delta); totalGetTimeInvocations.incrementAndGet(); if (delta > maxGetTime.get()) maxGetTime.set(delta); } } /** * {@inheritDoc} */ public long getTotalPoolTime() { if (!enabled.get()) return 0L; return totalPoolTime.get(); } /** * Add delta to total pool time * @param delta The value */ public void deltaTotalPoolTime(long delta) { if (enabled.get() && delta > 0) { totalPoolTime.addAndGet(delta); totalPoolTimeInvocations.incrementAndGet(); if (delta > maxPoolTime.get()) maxPoolTime.set(delta); } } /** * {@inheritDoc} */ public long getTotalUsageTime() { if (!enabled.get()) return 0L; return totalUsageTime.get(); } /** * Add delta to total usage time * @param delta The value */ public void deltaTotalUsageTime(long delta) { if (enabled.get() && delta > 0) { totalUsageTime.addAndGet(delta); totalUsageTimeInvocations.incrementAndGet(); if (delta > maxUsageTime.get()) maxUsageTime.set(delta); } } /** * {@inheritDoc} */ public int getWaitCount() { if (!enabled.get()) return 0; return waitCount.get(); } /** * Add delta wait count */ public void deltaWaitCount() { if (enabled.get()) waitCount.incrementAndGet(); } /** * {@inheritDoc} */ public long getCommitCount() { if (!isEnabled()) return 0L; return commitCount.get(); } /** * {@inheritDoc} */ public long getCommitTotalTime() { if (!isEnabled()) return 0L; return commitTotalTime.get(); } /** * {@inheritDoc} */ public long getCommitAverageTime() { if (!isEnabled()) return 0L; if (commitCount.get() > 0) return commitTotalTime.get() / commitCount.get(); return 0L; } /** * {@inheritDoc} */ public long getCommitMaxTime() { if (!isEnabled()) return 0L; return commitMaxTime.get(); } /** * {@inheritDoc} */ public void deltaCommit(long time) { commitCount.incrementAndGet(); if (time > 0) { commitTotalTime.addAndGet(time); if (time > commitMaxTime.get()) commitMaxTime.set(time); } } /** * {@inheritDoc} */ public long getEndCount() { if (!isEnabled()) return 0L; return endCount.get(); } /** * {@inheritDoc} */ public long getEndTotalTime() { if (!isEnabled()) return 0L; return endTotalTime.get(); } /** * {@inheritDoc} */ public long getEndAverageTime() { if (!isEnabled()) return 0L; if (endCount.get() > 0) return endTotalTime.get() / endCount.get(); return 0L; } /** * {@inheritDoc} */ public long getEndMaxTime() { if (!isEnabled()) return 0L; return endMaxTime.get(); } /** * {@inheritDoc} */ public void deltaEnd(long time) { endCount.incrementAndGet(); if (time > 0) { endTotalTime.addAndGet(time); if (time > endMaxTime.get()) endMaxTime.set(time); } } /** * {@inheritDoc} */ public long getForgetCount() { if (!isEnabled()) return 0L; return forgetCount.get(); } /** * {@inheritDoc} */ public long getForgetTotalTime() { if (!isEnabled()) return 0L; return forgetTotalTime.get(); } /** * {@inheritDoc} */ public long getForgetAverageTime() { if (!isEnabled()) return 0L; if (forgetCount.get() > 0) return forgetTotalTime.get() / forgetCount.get(); return 0L; } /** * {@inheritDoc} */ public long getForgetMaxTime() { if (!isEnabled()) return 0L; return forgetMaxTime.get(); } /** * {@inheritDoc} */ public void deltaForget(long time) { forgetCount.incrementAndGet(); if (time > 0) { forgetTotalTime.addAndGet(time); if (time > forgetMaxTime.get()) forgetMaxTime.set(time); } } /** * {@inheritDoc} */ public long getPrepareCount() { if (!isEnabled()) return 0L; return prepareCount.get(); } /** * {@inheritDoc} */ public long getPrepareTotalTime() { if (!isEnabled()) return 0L; return prepareTotalTime.get(); } /** * {@inheritDoc} */ public long getPrepareAverageTime() { if (!isEnabled()) return 0L; if (prepareCount.get() > 0) return prepareTotalTime.get() / prepareCount.get(); return 0L; } /** * {@inheritDoc} */ public long getPrepareMaxTime() { if (!isEnabled()) return 0L; return prepareMaxTime.get(); } /** * {@inheritDoc} */ public void deltaPrepare(long time) { prepareCount.incrementAndGet(); if (time > 0) { prepareTotalTime.addAndGet(time); if (time > prepareMaxTime.get()) prepareMaxTime.set(time); } } /** * {@inheritDoc} */ public long getRecoverCount() { if (!isEnabled()) return 0L; return recoverCount.get(); } /** * {@inheritDoc} */ public long getRecoverTotalTime() { if (!isEnabled()) return 0L; return recoverTotalTime.get(); } /** * {@inheritDoc} */ public long getRecoverAverageTime() { if (!isEnabled()) return 0L; if (recoverCount.get() > 0) return recoverTotalTime.get() / recoverCount.get(); return 0L; } /** * {@inheritDoc} */ public long getRecoverMaxTime() { if (!isEnabled()) return 0L; return recoverMaxTime.get(); } /** * {@inheritDoc} */ public void deltaRecover(long time) { recoverCount.incrementAndGet(); if (time > 0) { recoverTotalTime.addAndGet(time); if (time > recoverMaxTime.get()) recoverMaxTime.set(time); } } /** * {@inheritDoc} */ public long getRollbackCount() { if (!isEnabled()) return 0L; return rollbackCount.get(); } /** * {@inheritDoc} */ public long getRollbackTotalTime() { if (!isEnabled()) return 0L; return rollbackTotalTime.get(); } /** * {@inheritDoc} */ public long getRollbackAverageTime() { if (!isEnabled()) return 0L; if (rollbackCount.get() > 0) return rollbackTotalTime.get() / rollbackCount.get(); return 0L; } /** * {@inheritDoc} */ public long getRollbackMaxTime() { if (!isEnabled()) return 0L; return rollbackMaxTime.get(); } /** * {@inheritDoc} */ public void deltaRollback(long time) { rollbackCount.incrementAndGet(); if (time > 0) { rollbackTotalTime.addAndGet(time); if (time > rollbackMaxTime.get()) rollbackMaxTime.set(time); } } /** * {@inheritDoc} */ public long getStartCount() { if (!isEnabled()) return 0L; return startCount.get(); } /** * {@inheritDoc} */ public long getStartTotalTime() { if (!isEnabled()) return 0L; return startTotalTime.get(); } /** * {@inheritDoc} */ public long getStartAverageTime() { if (!isEnabled()) return 0L; if (startCount.get() > 0) return startTotalTime.get() / startCount.get(); return 0L; } /** * {@inheritDoc} */ public long getStartMaxTime() { if (!isEnabled()) return 0L; return startMaxTime.get(); } /** * {@inheritDoc} */ public void deltaStart(long time) { startCount.incrementAndGet(); if (time > 0) { startTotalTime.addAndGet(time); if (time > startMaxTime.get()) startMaxTime.set(time); } } /** * {@inheritDoc} */ public void clear() { this.createdCount.set(0); this.destroyedCount.set(0); this.maxCreationTime.set(Long.MIN_VALUE); this.maxGetTime.set(Long.MIN_VALUE); this.maxPoolTime.set(Long.MIN_VALUE); this.maxUsageTime.set(Long.MIN_VALUE); this.maxUsedCount.set(Integer.MIN_VALUE); this.maxWaitTime.set(Long.MIN_VALUE); this.timedOut.set(0); this.totalBlockingTime.set(0L); this.totalBlockingTimeInvocations.set(0L); this.totalCreationTime.set(0L); this.totalGetTime.set(0L); this.totalGetTimeInvocations.set(0L); this.totalPoolTime.set(0L); this.totalPoolTimeInvocations.set(0L); this.totalUsageTime.set(0L); this.totalUsageTimeInvocations.set(0L); this.inUseCount.set(0); this.blockingFailureCount.set(0); this.waitCount.set(0); this.commitCount = new AtomicLong(0L); this.commitTotalTime = new AtomicLong(0L); this.commitMaxTime = new AtomicLong(0L); this.endCount = new AtomicLong(0L); this.endTotalTime = new AtomicLong(0L); this.endMaxTime = new AtomicLong(0L); this.forgetCount = new AtomicLong(0L); this.forgetTotalTime = new AtomicLong(0L); this.forgetMaxTime = new AtomicLong(0L); this.prepareCount = new AtomicLong(0L); this.prepareTotalTime = new AtomicLong(0L); this.prepareMaxTime = new AtomicLong(0L); this.recoverCount = new AtomicLong(0L); this.recoverTotalTime = new AtomicLong(0L); this.recoverMaxTime = new AtomicLong(0L); this.rollbackCount = new AtomicLong(0L); this.rollbackTotalTime = new AtomicLong(0L); this.rollbackMaxTime = new AtomicLong(0L); this.startCount = new AtomicLong(0L); this.startTotalTime = new AtomicLong(0L); this.startMaxTime = new AtomicLong(0L); } private void writeObject(ObjectOutputStream out) throws IOException { out.defaultWriteObject(); out.writeInt(maxPoolSize); } private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); init(in.readInt()); } /** * toString * @return The value */ public String toString() { StringBuilder sb = new StringBuilder(); sb.append("PoolStatistics@").append(Integer.toHexString(System.identityHashCode(this))); sb.append("["); sb.append("Enabled=").append(isEnabled()); sb.append(","); sb.append(ACTIVE_COUNT).append("=").append(getActiveCount()); sb.append(","); sb.append(AVAILABLE_COUNT).append("=").append(getAvailableCount()); sb.append(","); sb.append(AVERAGE_BLOCKING_TIME).append("=").append(getAverageBlockingTime()); sb.append(","); sb.append(AVERAGE_CREATION_TIME).append("=").append(getAverageCreationTime()); sb.append(","); sb.append(AVERAGE_GET_TIME).append("=").append(getAverageGetTime()); sb.append(","); sb.append(AVERAGE_POOL_TIME).append("=").append(getAveragePoolTime()); sb.append(","); sb.append(AVERAGE_USAGE_TIME).append("=").append(getAverageUsageTime()); sb.append(","); sb.append(BLOCKING_FAILURE_COUNT).append("=").append(getBlockingFailureCount()); sb.append(","); sb.append(CREATED_COUNT).append("=").append(getCreatedCount()); sb.append(","); sb.append(DESTROYED_COUNT).append("=").append(getDestroyedCount()); sb.append(","); sb.append(IDLE_COUNT).append("=").append(getIdleCount()); sb.append(","); sb.append(IN_USE_COUNT).append("=").append(getInUseCount()); sb.append(","); sb.append(MAX_CREATION_TIME).append("=").append(getMaxCreationTime()); sb.append(","); sb.append(MAX_GET_TIME).append("=").append(getMaxGetTime()); sb.append(","); sb.append(MAX_POOL_TIME).append("=").append(getMaxPoolTime()); sb.append(","); sb.append(MAX_USAGE_TIME).append("=").append(getMaxUsageTime()); sb.append(","); sb.append(MAX_USED_COUNT).append("=").append(getMaxUsedCount()); sb.append(","); sb.append(MAX_WAIT_COUNT).append("=").append(getMaxWaitCount()); sb.append(","); sb.append(MAX_WAIT_TIME).append("=").append(getMaxWaitTime()); sb.append(","); sb.append(TIMED_OUT).append("=").append(getTimedOut()); sb.append(","); sb.append(TOTAL_BLOCKING_TIME).append("=").append(getTotalBlockingTime()); sb.append(","); sb.append(TOTAL_CREATION_TIME).append("=").append(getTotalCreationTime()); sb.append(","); sb.append(TOTAL_GET_TIME).append("=").append(getTotalGetTime()); sb.append(","); sb.append(TOTAL_POOL_TIME).append("=").append(getTotalPoolTime()); sb.append(","); sb.append(TOTAL_USAGE_TIME).append("=").append(getTotalUsageTime()); sb.append(","); sb.append(WAIT_COUNT).append("=").append(getWaitCount()); sb.append(","); sb.append(XA_COMMIT_COUNT).append("=").append(getCommitCount()); sb.append(","); sb.append(XA_COMMIT_AVERAGE_TIME).append("=").append(getCommitAverageTime()); sb.append(","); sb.append(XA_COMMIT_TOTAL_TIME).append("=").append(getCommitTotalTime()); sb.append(","); sb.append(XA_COMMIT_MAX_TIME).append("=").append(getCommitMaxTime()); sb.append(","); sb.append(XA_END_COUNT).append("=").append(getEndCount()); sb.append(","); sb.append(XA_END_AVERAGE_TIME).append("=").append(getEndAverageTime()); sb.append(","); sb.append(XA_END_TOTAL_TIME).append("=").append(getEndTotalTime()); sb.append(","); sb.append(XA_END_MAX_TIME).append("=").append(getEndMaxTime()); sb.append(","); sb.append(XA_FORGET_COUNT).append("=").append(getForgetCount()); sb.append(","); sb.append(XA_FORGET_AVERAGE_TIME).append("=").append(getForgetAverageTime()); sb.append(","); sb.append(XA_FORGET_TOTAL_TIME).append("=").append(getForgetTotalTime()); sb.append(","); sb.append(XA_FORGET_MAX_TIME).append("=").append(getForgetMaxTime()); sb.append(","); sb.append(XA_PREPARE_COUNT).append("=").append(getPrepareCount()); sb.append(","); sb.append(XA_PREPARE_AVERAGE_TIME).append("=").append(getPrepareAverageTime()); sb.append(","); sb.append(XA_PREPARE_TOTAL_TIME).append("=").append(getPrepareTotalTime()); sb.append(","); sb.append(XA_PREPARE_MAX_TIME).append("=").append(getPrepareMaxTime()); sb.append(","); sb.append(XA_RECOVER_COUNT).append("=").append(getRecoverCount()); sb.append(","); sb.append(XA_RECOVER_AVERAGE_TIME).append("=").append(getRecoverAverageTime()); sb.append(","); sb.append(XA_RECOVER_TOTAL_TIME).append("=").append(getRecoverTotalTime()); sb.append(","); sb.append(XA_RECOVER_MAX_TIME).append("=").append(getRecoverMaxTime()); sb.append(","); sb.append(XA_ROLLBACK_COUNT).append("=").append(getRollbackCount()); sb.append(","); sb.append(XA_ROLLBACK_AVERAGE_TIME).append("=").append(getRollbackAverageTime()); sb.append(","); sb.append(XA_ROLLBACK_TOTAL_TIME).append("=").append(getRollbackTotalTime()); sb.append(","); sb.append(XA_ROLLBACK_MAX_TIME).append("=").append(getRollbackMaxTime()); sb.append(","); sb.append(XA_START_COUNT).append("=").append(getStartCount()); sb.append(","); sb.append(XA_START_AVERAGE_TIME).append("=").append(getStartAverageTime()); sb.append(","); sb.append(XA_START_TOTAL_TIME).append("=").append(getStartTotalTime()); sb.append(","); sb.append(XA_START_MAX_TIME).append("=").append(getStartMaxTime()); sb.append("]"); return sb.toString(); } }