code: public String buildView() {
          final StringBuilder sb = new StringBuilder();
          final ConnectionPool[] pools = ContainerUtil.searchComponentsAll(ConnectionPool.class); // plural if e.g. master/slave
          boolean firstDone = false;
          for (ConnectionPool pool : pools) {
              if (firstDone) {
                  sb.append("\n");
              }
              sb.append(pool.getClass().getName() + "@" + Integer.toHexString(pool.hashCode()));
              synchronized (pool) { // just in case
                  final int free = pool.getFreePoolSize();
                  final int active = pool.getActivePoolSize();
                  final int txActive = pool.getTxActivePoolSize();
                  sb.append("\n").append("freePool=").append(free);
                  sb.append(", activePool=").append(active).append(", txActivePool=").append(txActive);
              }
              final List<String> txViewList = findTransactionViewList(pool);
              if (!txViewList.isEmpty()) {
                  for (String txView : txViewList) {
                      sb.append("\n").append(txView);
                  }
              } else {
                  sb.append("\n(no transaction)");
              }
              firstDone = true;
          }
          return sb.toString();
      }
docs: ==========