When tuning the datasource connection pool, the following parameters should be considered.
- The application's concurrency requirement.
- The average time taken to run a database query.
- The number of connections the database server can support.
The goal of tuning the pool properties is to maintain a pool that is large enough to handle the peak load to the datasource without unnecessarily utilising resources. The following are the highly used, important properties:
Property Name | How to tune |
---|---|
Min. Idle | Configure this to match the expected minimum concurrency. The default value is 0. |
Max. Idle | The value should be less that the Max. Active value. For high performance, tune Max. Idle to match the number of average, concurrent requests to the pool. If this value is set to a large value, the pool will contain unnecessary idle connections. |
Max. Active | The maximum latency (approximately) = (P/M)T , where,
Therefore, by increasing the Max. Active value ( up to the expected highest number of concurrency), the time that requests wait in the queue for a connection to be released will be decreases. But before increasing the Max. Active value, consult the database administrator, as it takes up system resources unnecessarily. |
Max. Wait | Adjust this value to a value slightly higher than the maximum latency for a request. That is, the Max. Wait = (P/M)t + buffer time |
Validation Query | Set "Validation Query" to a simple test query like SELECT 1 |
Test On Borrow | When the connection to the database is broken, the connection pool does not know that the connection has been lost. As a result, the connection pool will continue to distribute connections to the application until the application actually tries to use the connection. To resolve this problem, set "Test On Borrow" to "true" and make sure that the "Validation Query" property is set. |
validationInterval | This parameter allows to control how frequently a given validation query is executed. By default it is set to 30 seconds. Deciding the value for the "validationInterval" property is a bit tricky. If a larger value is set, the frequency of executing the Validation Query is low, which results in better performance. With a smaller value, a stale connection will be identified quickly when it is presented. Therefore, selecting a value for the this property is a trade-off and ultimately depends on what is acceptable for the application. |
Apart from tuning the pool, the following properties are used to diagnose the pool when a connection leak is observed.
Property Name | How to configure |
---|---|
Remove Abandoned | Set this property to "true" if you wish to detect leaked connections. |
Remove Abandoned Timeout | The value should be set to the longest running query that the applications might have. |
Log Abandoned | Set this property to "true" if you wish to log when the connection was abandoned. If this option is set to "true", a stack trace is recorded during the dataSource.getConnection call and is printed when a connection is not returned. |