package com.unmi.db;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.cfg.Environment;
import org.hibernate.connection.ConnectionProvider;
import org.hibernate.util.NamingHelper;
import com.ibm.websphere.rsadapter.JDBCConnectionSpec;
import com.ibm.websphere.rsadapter.WSCallHelper;
import com.ibm.websphere.rsadapter.WSDataSource;
import com.ibm.websphere.rsadapter.WSRRAFactory;
import com.ibm.ws.rsadapter.jdbc.WSJdbcConnection;
import com.ibm.ws.rsadapter.jdbc.WSJdbcUtil;
/**
* ConnectionProvider implementation that implements WSDataSource specific
* Transaction Isolation level settings for the connection. Modified from the
* original DatasourceConnectionProvider class by Lari Hotari
*
*/
public class WSDataSourceConnectionProvider implements ConnectionProvider {
public boolean supportsAggressiveRelease() {
return false;
}
private WSDataSource ds;
private String user;
private String pass;
private Integer isolation;
private static final Logger log = Logger
.getLogger(WSDataSourceConnectionProvider.class);
public void configure(Properties props) throws HibernateException {
String jndiName = props.getProperty(Environment.DATASOURCE);
if (jndiName == null) {
String msg = "datasource JNDI name was not specified by property "
+ Environment.DATASOURCE;
log.fatal(msg);
throw new HibernateException(msg);
}
user = props.getProperty(Environment.USER);
pass = props.getProperty(Environment.PASS);
String i = props.getProperty(Environment.ISOLATION);
if (i == null) {
isolation = null;
} else {
isolation = new Integer(i);
log.info("JDBC isolation level: "
+ Environment.isolationLevelToString(isolation.intValue()));
}
try {
ds = (WSDataSource) NamingHelper.getInitialContext(props).lookup(
jndiName);
} catch (Exception e) {
log.fatal("Could not find datasource: " + jndiName, e);
throw new HibernateException("Could not find datasource", e);
}
if (ds == null)
throw new HibernateException("Could not find datasource: "
+ jndiName);
log.info("Using datasource: " + jndiName);
}
public Connection getConnection() throws SQLException {
if (log.isDebugEnabled()) {
log.debug("getConnection()");
}
Connection connection = ds.getConnection(createJDBCConnectionSpec());
if (log.isDebugEnabled()) {
if (connection != null) {
log.debug("Returning connection, System.identityHashCode="
+ System.identityHashCode(connection));
log.debug("Connection=" + connection);
log.debug("Shareable=" + WSCallHelper.isShareable(connection));
log.debug("Class=" + connection.getClass());
Connection nativeConnection = (Connection) WSJdbcUtil
.getNativeConnection((WSJdbcConnection) connection);
log.debug("Native connection=" + nativeConnection);
log.debug("Native connection, System.identityHashCode="
+ System.identityHashCode(nativeConnection)
+ ", class=" + nativeConnection.getClass());
} else {
log.debug("Returning null");
}
}
return connection;
}
public void closeConnection(Connection conn) throws SQLException {
conn.close();
}
public void close() {
}
protected JDBCConnectionSpec createJDBCConnectionSpec() {
JDBCConnectionSpec connSpec = WSRRAFactory.createJDBCConnectionSpec();
// 设置事称隔离级别
if (isolation != null) {
connSpec.setTransactionIsolation(isolation);
}
if (user != null || pass != null) {
connSpec.setUserName(user);
connSpec.setPassword(pass);
}
return connSpec;
}
}
关注