1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.apache.ibatis.datasource.pooled;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  
21  
22  
23  
24  public class PoolState {
25  
26    protected PooledDataSource dataSource;
27  
28    protected final List<PooledConnection> idleConnections = new ArrayList<>();
29    protected final List<PooledConnection> activeConnections = new ArrayList<>();
30    protected long requestCount;
31    protected long accumulatedRequestTime;
32    protected long accumulatedCheckoutTime;
33    protected long claimedOverdueConnectionCount;
34    protected long accumulatedCheckoutTimeOfOverdueConnections;
35    protected long accumulatedWaitTime;
36    protected long hadToWaitCount;
37    protected long badConnectionCount;
38  
39    public PoolState(PooledDataSource dataSource) {
40      this.dataSource = dataSource;
41    }
42  
43    public synchronized long getRequestCount() {
44      return requestCount;
45    }
46  
47    public synchronized long getAverageRequestTime() {
48      return requestCount == 0 ? 0 : accumulatedRequestTime / requestCount;
49    }
50  
51    public synchronized long getAverageWaitTime() {
52      return hadToWaitCount == 0 ? 0 : accumulatedWaitTime / hadToWaitCount;
53  
54    }
55  
56    public synchronized long getHadToWaitCount() {
57      return hadToWaitCount;
58    }
59  
60    public synchronized long getBadConnectionCount() {
61      return badConnectionCount;
62    }
63  
64    public synchronized long getClaimedOverdueConnectionCount() {
65      return claimedOverdueConnectionCount;
66    }
67  
68    public synchronized long getAverageOverdueCheckoutTime() {
69      return claimedOverdueConnectionCount == 0 ? 0
70          : accumulatedCheckoutTimeOfOverdueConnections / claimedOverdueConnectionCount;
71    }
72  
73    public synchronized long getAverageCheckoutTime() {
74      return requestCount == 0 ? 0 : accumulatedCheckoutTime / requestCount;
75    }
76  
77    public synchronized int getIdleConnectionCount() {
78      return idleConnections.size();
79    }
80  
81    public synchronized int getActiveConnectionCount() {
82      return activeConnections.size();
83    }
84  
85    @Override
86    public synchronized String toString() {
87      StringBuilder builder = new StringBuilder();
88      builder.append("\n===CONFIGURATION==============================================");
89      builder.append("\n jdbcDriver                     ").append(dataSource.getDriver());
90      builder.append("\n jdbcUrl                        ").append(dataSource.getUrl());
91      builder.append("\n jdbcUsername                   ").append(dataSource.getUsername());
92      builder.append("\n jdbcPassword                   ")
93          .append(dataSource.getPassword() == null ? "NULL" : "************");
94      builder.append("\n poolMaxActiveConnections       ").append(dataSource.poolMaximumActiveConnections);
95      builder.append("\n poolMaxIdleConnections         ").append(dataSource.poolMaximumIdleConnections);
96      builder.append("\n poolMaxCheckoutTime            ").append(dataSource.poolMaximumCheckoutTime);
97      builder.append("\n poolTimeToWait                 ").append(dataSource.poolTimeToWait);
98      builder.append("\n poolPingEnabled                ").append(dataSource.poolPingEnabled);
99      builder.append("\n poolPingQuery                  ").append(dataSource.poolPingQuery);
100     builder.append("\n poolPingConnectionsNotUsedFor  ").append(dataSource.poolPingConnectionsNotUsedFor);
101     builder.append("\n ---STATUS-----------------------------------------------------");
102     builder.append("\n activeConnections              ").append(getActiveConnectionCount());
103     builder.append("\n idleConnections                ").append(getIdleConnectionCount());
104     builder.append("\n requestCount                   ").append(getRequestCount());
105     builder.append("\n averageRequestTime             ").append(getAverageRequestTime());
106     builder.append("\n averageCheckoutTime            ").append(getAverageCheckoutTime());
107     builder.append("\n claimedOverdue                 ").append(getClaimedOverdueConnectionCount());
108     builder.append("\n averageOverdueCheckoutTime     ").append(getAverageOverdueCheckoutTime());
109     builder.append("\n hadToWait                      ").append(getHadToWaitCount());
110     builder.append("\n averageWaitTime                ").append(getAverageWaitTime());
111     builder.append("\n badConnectionCount             ").append(getBadConnectionCount());
112     builder.append("\n===============================================================");
113     return builder.toString();
114   }
115 
116 }