Plugins You can find out about all the publicly available Grails plugins.

Proxool jdbc connection pool plugin

  • Authors: Karol Balejko
1 vote
compile "org.grails.plugins:proxool:"

 Documentation  Source  Issues


Grails plugin for proxool jdbc connection pool.


grails install-plugin proxool


Grails plugin for proxool jdbc connection pool.


Example in grails-app/conf/DataSource.groovy

dataSource {
        pooled = false
        dbCreate = "update"
        url = "proxool.grails-pool"
        driverClassName = 'org.logicalcobwebs.proxool.ProxoolDriver'


Example in grails-app/conf/ProxoolConfig.groovy

proxool {

minimumConnectionCount = 5 maximumConnectionCount = 10 statistics = '15s' statisticsLogLevel = 'INFO'

driverProperties {

driverUrl = "jdbc:hsqldb:mem:testDb" driver = 'org.hsqldb.jdbcDriver'

user = "sa" password = "" } }

Proxool config accepts the following properties:

alias Proxool pool alias name (default: grails-pool). The jdbc connection url pattern is proxool.<alias>

fatalSqlException A comma separated list of message fragments. When an SQLException occurs its message is compared to each of these fragments. If it contains any of them (case sensitive) then it is detected as a Fatal SQL Exception. This causes that connection to be discarded. Regardless of what happens, the exception is thrown again so that the user knows what has happened. You can optionally configure a different exception to be thrown (see fatal-sql-exception-wrapper-class property) Default is null.


If you have configured fatal-sql-exception then the default behaviour is to discard the exception that causes the fatal SQLException and then just throw the original exception to the user. Using this property you can wrap the SQLException up inside another exception. This exception can be anything you want as long as it either extends SQLException or RuntimeException. Proxool provides two classes which you can use if you don't want to build your own: FatalSQLException and FatalRuntimeException. To make use of those you should set this property to either 'org.logicalcobwebs.proxool.FatalSQLException' or 'org.logicalcobwebs.proxool.FatalRuntimeException' as appropriate. Default is null (fatal SQLExceptions are not wrapped). Default is null.


How long the house keeping thread sleeps for (milliseconds). The house keeper is responsible for checking the state of all the connections and tests whether any need to be destroyed or created. Default is 30 seconds.


If the house keeping thread finds and idle connections it will test them with this SQL statement. It should be very quick to execute. Something like checking the current date or something. If not defined then this test is omitted.


Allows Proxool to implement methods defined in the delegate Connection object. See Injectable Interfaces.


Allows Proxool to implement methods defined in the delegate Statement object. See Injectable Interfaces.


Allows Proxool to implement methods defined in the delegate PreparedStatement object. See Injectable Interfaces.


Allows Proxool to implement methods defined in the delegate CallableStatement object. See Injectable Interfaces.


If true the pool will be registered as an MBean to a JMX server with the following object name: "Proxool:type=Pool, name=<alias>". Default is false.


A comma separated list of JMX agent ids (as used by MBeanServerFactory.findMBeanServer(String agentId) ) to register the pool to. This property is only used if the "jmx" property is set to "true". All registered JMX servers will be used if this property is not set.


See DataSource.


If the housekeeper comes across a thread that has been active for longer than this then it will kill it. So make sure you set this to a number bigger than your slowest expected response! Default is 5 minutes.


The maximum number of connections to the database. Default is 15.


The maximum amount of time that a connection exists for before it is killed (milliseconds). Default is 4 hours.


The minimum number of connections we will keep open, regardless of whether anyone needs them or not. Default is 5.


This helps us determine the pool status. If we have refused a connection within this threshold (milliseconds) then we are overloaded. Default is 60 seconds.


If there are fewer than this number of connections available then we will build some more (assuming the maximum-connection-count is not exceeded). For example. Of we have 3 active connections and 2 available, but our prototype-count is 4 then it will attempt to build another 2. This differs from minimum-connection-count because it takes into account the number of active connections. minimum-connection-count is absolute and doesn't care how many are in use. prototype-count is the number of spare connections it strives to keep over and above the ones that are currently active. Default is 0.


This helps us determine whether the pool status is up, down or overloaded. As long as at least one connection was started within this threshold (milliseconds) or there are some spare connections available then we assume the pool is up. Default is 60 seconds.


This is the maximum number of connections we can be building at any one time. That is, the number of new connections that have been requested but aren't yet available for use. Because connections can be built using more than one thread (for instance, when they are built on demand) and it takes a finite time between deciding to build the connection and it becoming available we need some way of ensuring that a lot of threads don't all decide to build a connection at once. (We could solve this in a smarter way - and indeed we will one day) Default is 10.


The sample length when taking statistical information, comma-delimited. For example: '10s,15m' would mean take samples every 10 seconds and every 15 minutes. Valid units are s(econds), m(inutes), h(ours) and d(ays). Default is null (no statistics).


Whether statistics are logged as they are produced. Range: DEBUG, INFO, WARN, ERROR, FATAL. Not to be confused with the level used with the general log. You have to configure that separately. Default is null (no logging).


If you set this to true then each connection is tested (with whatever is defined in house-keeping-test-sql) before being served. If a connection fails then it is discarded and another one is picked. If all connections fail a new one is built. If that one fails then you get an SQLException saying so.


If you set this to true then each connection is tested (with whatever is defined in house-keeping-test-sql) after it is closed (that is, returned to the connection pool). If a connection fails then it is discarded.


If true then each SQL call gets logged (DEBUG level) along with the execution time. You can also get this information by registering a ConnectionListener (see ProxoolFacade). Default is false.


Either false (quiet) or true (loud). Default is false.

driverProperties {

driverUrl jdbc connection url

driver driver class name

user database username

password database password

... other properties are populated to jdbc driver }