To create your own connection provider class, follow these steps:
create a new class that extends "
org.dbforms.conprovider.ConnectionProvider" class:
public class MyOwnConnectionProvider extends ConnectionProvider
{
...
}
create a default constructor like this one:
/**
* Default constructor.
*
* @throws Exception because of the <code>throws Exception</code> clause
* of the <code>init</code> method.
*/
public MyConnectionProvider() throws Exception
{
super(); // up to now, do nothing...
}
implement the following ConnectionProvider abstract methods:
protected abstract void init() throws Exception;
protected abstract Connection getConnection() throws SQLException;
A connectionProvider class can configure its connection pool attributes sing the values specificed by the pool-property xml elements, children of the dbconnection element of the dbforms-config.xml file.
Here's an example of the configuration of the dbconnection element that uses the ProtomatterConnectionProvider class to obtain JDBC connections from the database:
<dbconnection id = "protomatter" isJndi = "false" isPow2 = "true" defaultConnection = "true" connectionProviderClass = "org.dbforms.conprovider.ProtomatterConnectionProvider" connectionPoolURL = "jdbc:protomatter:pool:postgresPool" conClass = "org.postgresql.Driver" name = "jdbc:postgresql://myHost/myDb" username = "secret" password = "moreSecret"> <!-- jdbc properties --> <property name="charSet" value="ISO-8859-1" /> <!-- Connection pool dataSource properties --> <pool-property name="pool.initialSize" value="4" /> <pool-property name="pool.maxSize" value="10" /> <pool-property name="pool.growBlock" value="2" /> <pool-property name="pool.createWaitTime" value="100" /> <pool-property name="pool.maxConnectionIdleTime" value="" /> <pool-property name="pool.maidThreadCheckInterval" value="" /> <pool-property name="jdbc.validityCheckStatement" value="" /> </dbconnection>
When a ConnectionProvider class is instantiated, it can access to the connection pool properties using the following statement:
Properties props = prefs.getPoolProperties();
The "name" attribute of the pool-property xml element becomes the property key that must be used to retrieve the property value from the above Properties class.
Every connection pool package uses its own configuration system; here's the example code used to configure the ProtomatterConnectionProvider class:
Properties props = null;
...
// now set the connection pool custom properties;
// if the connectionPool properties object is null,
// instance a new properties object anyway, to use default values;
if ((props = prefs.getPoolProperties()) == null)
props = new Properties();
// use defaults values as specified into the documentation;
setIntegerArg(args, props, CP_PROPS_INITIALSIZE, "0");
setIntegerArg(args, props, CP_PROPS_MAXSIZE, "-1");
setIntegerArg(args, props, CP_PROPS_GROWBLOCK, "1");
setIntegerArg(args, props, CP_PROPS_CREATEWAITTIME, "0");
setArg (args, props, CP_PROPS_VALIDITYCHECKSTATEMENT, null);
setIntegerArg(args, props, CP_PROPS_MAXCONNECTIONIDLETIME, null);
setIntegerArg(args, props, CP_PROPS_MAIDTHREADCHECKINTERVAL, null);
// finally create the pool and we're ready to go!
Class.forName(CP_DRIVER).newInstance();
connectionPool = new JdbcConnectionPool(getLastToken(prefs.getConnectionPoolURL(), ":"), args);
and here's the (simpler) code for J akartaConnectionProvider class:
Properties props = null;
...
// now set the connection pool custom properties;
// if the connectionPool properties object is null,
// instance a new properties object anyway, to use default values;
if ((props = prefs.getPoolProperties()) == null)
props = new Properties();
String validationQuery = props.getProperty(CP_PROPS_VALIDATION_QUERY, null);
if (!Util.isNull(validationQuery))
dataSource.setValidationQuery(validationQuery.trim());
dataSource.setMaxActive (Integer.parseInt(props.getProperty(CP_PROPS_MAX_ACTIVE,"20")));
dataSource.setMaxIdle (Integer.parseInt(props.getProperty(CP_PROPS_MAX_IDLE,"5")));
dataSource.setMaxWait (Long.parseLong (props.getProperty(CP_PROPS_MAX_WAIT,"-1")));
// if PROPS_LOG == true, use log4j category to log the datasource info;
String useLog = props.getProperty(CP_PROPS_USE_LOG, "false");
if (!Util.isNull(useLog) "true".equals(useLog.trim()))
{
cat.info("::init - dataSource log activated");
dataSource.setLogWriter(new Log4jPrintWriter(cat, cat.getPriority()));
}