package com.lizard.fastdb.connection.druid;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.transaction.TransactionManager;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.enhydra.jdbc.standard.StandardXADataSource;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.lizard.fastdb.connection.ConnectionProvider;
import com.lizard.fastdb.datasource.DataSourceUtil;
/**
* ConnectionProvicer 的 Druid 实现
*
* @author SHEN.GANG
*/
public class DruidConnectionProvider implements ConnectionProvider {
private static final long serialVersionUID = 1L;
private static final Log logger = LogFactory.getLog(DruidConnectionProvider.class);
private Properties prop = null;
private static DruidDataSource ds = new DruidDataSource();
@Override
public void configure(Properties prop) {
if (this.prop != null) return;
this.prop = prop;
try {
// 转换prop属性
convertProp();
DruidDataSourceFactory.config(ds, prop);
logger.info("Druid pool [" + prop.getProperty("name") + "] registered.");
}
catch (Exception e)
{
e.printStackTrace();
logger.error("Fail to register Druid pool [" + prop.getProperty("name") + "]", e);
}
}
@Override
public Connection getConnection() throws SQLException
{
return ds.getConnection();
}
@Override
public Connection getXAConnection(TransactionManager tm) throws SQLException {
StandardXADataSource sxd = DataSourceUtil.convertPropertiesToXADataSource(prop);
sxd.setTransactionManager(tm);
Connection conn = sxd.getXAConnection().getConnection();
conn.setAutoCommit(false);
return conn;
}
@Override
public void closeConnection(Connection conn) throws SQLException {
if (conn != null && !conn.isClosed() )
{
conn.close();
}
}
@Override
public void shutdown() {
try {
ds.close();
} catch( Exception e ) {
e.printStackTrace();
logger.error("Failed to close Druid pool.");
}
}
/**
* 设置属性映射,用于通过方法反射设置属性
*/
private void convertProp()
{
// 参考 :https://github.com/alibaba/druid/wiki/DruidDataSource%E9%85%8D%E7%BD%AE%E5%B1%9E%E6%80%A7%E5%88%97%E8%A1%A8
this.prop.setProperty("driverClassName", this.prop.getProperty("driver-class"));
this.prop.setProperty("name", this.prop.getProperty("name"));
this.prop.setProperty("url", this.prop.getProperty("driver-url"));
this.prop.setProperty("username", this.prop.getProperty("user"));
this.prop.setProperty("password", this.prop.getProperty("password"));
this.prop.setProperty("maxActive", this.prop.getProperty("max-connection-size"));
this.prop.setProperty("minIdle", this.prop.getProperty("min-connection-size"));
this.prop.setProperty("initialSize", this.prop.getProperty("init-connection-size"));
this.prop.setProperty("maxWait", this.prop.getProperty("max-connection-idletime"));
// this.prop.setProperty("validationQuery", null);
this.prop.setProperty("filters", "stat");
}
}