Refresh Your Java - Before Java Interview
We are Agile, believe in less Documentation - Only Quick notes (Java Interview Questions) of Java/J2ee Read more....
The following steps allows you to use DBCP connection Pool in Hibernate .
Step 1:
Configure you Hibernate Properties as follows .
In Hiberante Properties file or XML file you need to use dbcp Connection API as follows.
hibernate.dialect
org.hibernate.dialect.OracleDialect
hibernate.connection.driver_class
oracle.jdbc.driver.OracleDriver
hibernate.connection.url
jdbc:oracle:thin:@HostName:1522:DBName
hibernate.connection.username sa
hibernate.connection.password yourPassword
hibernate.connection.pool_size 5
hibernate.dbcp.poolPreparedStatements true
#hibernate.dbcp.ps.maxActive
hibernate.connection.provider_class
com.salesorder.DBCPConnectionProvider
Step 2 :
Create your own Connection Provider by using DBCP as follows.
import java.io.PrintWriter;
import java.io.StringWriter;
import
java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import
java.util.Properties;
import
org.apache.commons.dbcp.BasicDataSource;
import
org.apache.commons.dbcp.BasicDataSourceFactory;
import
org.apache.commons.logging.Log;
import
org.apache.commons.logging.LogFactory;
import
org.hibernate.HibernateException;
import
org.hibernate.cfg.Environment;
import
org.hibernate.connection.ConnectionProvider;
import
org.hibernate.connection.ConnectionProviderFactory;
public class DBCPConnectionProvider implements ConnectionProvider {
private static final
Log log = LogFactory.getLog(DBCPConnectionProvider.class);
private static final String
PREFIX = "hibernate.dbcp.";
private BasicDataSource
ds;
// Old Environment
property for backward-compatibility (property removed in
Hibernate3)
private
static final String DBCP_PS_MAXACTIVE =
"hibernate.dbcp.ps.maxActive";
// Property
doesn't exists in Hibernate2
private static final String
AUTOCOMMIT =
"hibernate.connection.autocommit";
public void
configure(Properties props) throws HibernateException {
try {
log.debug("Configure
DBCPConnectionProvider");
// DBCP properties used to create the BasicDataSource
Properties dbcpProperties = new Properties();
// DriverClass & url
String jdbcDriverClass =
props.getProperty(Environment.DRIVER);
String jdbcUrl = props.getProperty(Environment.URL);
dbcpProperties.put("driverClassName",
jdbcDriverClass);
dbcpProperties.put("url", jdbcUrl);
// Username / password
String username = props.getProperty(Environment.USER);
String password = props.getProperty(Environment.PASS);
dbcpProperties.put("username", username);
dbcpProperties.put("password",
password);
// Isolation level
String isolationLevel =
props.getProperty(Environment.ISOLATION);
if ((isolationLevel != null) &&
(isolationLevel.trim().length() > 0)) {
dbcpProperties.put("defaultTransactionIsolation",
isolationLevel);
}
// Turn off autocommit (unless autocommit property is set)
String autocommit = props.getProperty(AUTOCOMMIT);
if ((autocommit != null) &&
(autocommit.trim().length() > 0)) {
dbcpProperties.put("defaultAutoCommit",
autocommit);
} else {
dbcpProperties.put("defaultAutoCommit",
String.valueOf(Boolean.FALSE));
}
// Pool size
String poolSize = props.getProperty(Environment.POOL_SIZE);
if ((poolSize != null) &&
(poolSize.trim().length() > 0)
&& (Integer.parseInt(poolSize) >
0)) {
dbcpProperties.put("maxActive", poolSize);
}
// Copy all "driver" properties into
"connectionProperties"
Properties driverProps =
ConnectionProviderFactory.getConnectionProperties(props);
if (driverProps.size() > 0) {
StringBuffer connectionProperties = new StringBuffer();
for (Iterator iter = driverProps.keySet().iterator();
iter.hasNext();) {
String key = (String) iter.next();
String value = driverProps.getProperty(key);
connectionProperties.append(key).append('=').append(value);
if (iter.hasNext()) {
connectionProperties.append(';');
}
}
dbcpProperties.put("connectionProperties",
connectionProperties.toString());
}
// Copy all DBCP properties removing the prefix
for (Iterator iter = props.keySet().iterator() ; iter.hasNext() ;)
{
String key = String.valueOf(iter.next());
if (key.startsWith(PREFIX)) {
String property = key.substring(PREFIX.length());
String value = props.getProperty(key);
dbcpProperties.put(property, value);
}
}
// Backward-compatibility
if (props.getProperty(DBCP_PS_MAXACTIVE) != null) {
dbcpProperties.put("poolPreparedStatements",
String.valueOf(Boolean.TRUE));
dbcpProperties.put("maxOpenPreparedStatements",
props.getProperty(DBCP_PS_MAXACTIVE));
}
// Some debug info
if (log.isDebugEnabled()) {
log.debug("Creating a DBCP BasicDataSource with the
following DBCP factory properties:");
StringWriter sw = new StringWriter();
dbcpProperties.list(new PrintWriter(sw, true));
log.debug(sw.toString());
}
// Let the factory create the pool
ds = (BasicDataSource)
BasicDataSourceFactory.createDataSource(dbcpProperties);
// The BasicDataSource has lazy initialization
// borrowing a connection will start the DataSource
// and make sure it is configured correctly.
Connection conn = ds.getConnection();
conn.close();
// Log pool statistics before continuing.
logStatistics();
}
catch (Exception e) {
String message = "Could not create a DBCP
pool";
log.fatal(message, e);
if (ds != null) {
try {
ds.close();
}
catch (Exception e2) {
// ignore
}
ds = null;
}
throw new HibernateException(message, e);
}
log.debug("Configure DBCPConnectionProvider
complete");
}
public Connection
getConnection() throws SQLException {
Connection conn = null;
try {
//log.warn(" Get connection
called");
conn = ds.getConnection();
}
finally {
logStatistics();
}
return conn;
}
public void
closeConnection(Connection conn) throws SQLException {
try {
conn.commit();
//Test ***********
conn.close();
//log.warn("Is Connection closed
"+conn.isClosed());
}
catch(Exception e) {
e.printStackTrace();
log.warn("Error While commit/close
concetion",e);
if(!conn.isClosed())
{
log.warn("check point in dbcp
1");
conn.close();
}
}
finally {
if(!conn.isClosed()) {
log.warn("check point in dbcp
2");
conn.close();
}
logStatistics();
}
}
public void close()
throws HibernateException {
try {
if (ds != null) {
ds.close();
ds = null;
}
else {
log.warn("Cannot close DBCP pool (not
initialized)");
}
}
catch (Exception e) {
throw new HibernateException("Could not close DBCP
pool", e);
}
log.debug("Close DBCPConnectionProvider
complete");
}
public boolean supportsAggressiveRelease() {
return true; //It was false ****************
}
}
This Portal is intended to put all Java/J2ee related topics at one single place for quick referance, not only Technical , but also the Project Management Related thing such as Development Process methodoogies build process, unit testing etc.,
This Portal has More than 500 Java Interview Questions (also could be Considered as Quick Notes) very neatly separated topic by topic with simple diagrams which makes you easily understandable. Importantly these are from our Realtime expericance.