/**
* Alipay.com Inc.
* Copyright (c) 2004-2012 All Rights Reserved.
*/
package com.alipay.zdal.datasource.resource.adapter.jdbc.local;
import java.util.Map;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.log4j.Logger;
import com.alipay.zdal.datasource.ZDataSource;
import com.alipay.zdal.datasource.resource.ResourceException;
import com.alipay.zdal.datasource.resource.connectionmanager.CachedConnectionManager;
import com.alipay.zdal.datasource.resource.connectionmanager.JBossManagedConnectionPool;
import com.alipay.zdal.datasource.resource.connectionmanager.TxConnectionManager;
import com.alipay.zdal.datasource.resource.spi.ConnectionManager;
import com.alipay.zdal.datasource.resource.spi.ConnectionRequestInfo;
import com.alipay.zdal.datasource.resource.spi.ManagedConnectionFactory;
import com.alipay.zdal.datasource.transaction.TransactionManager;
import com.alipay.zdal.datasource.util.PoolCondition;
/**
* This is a pojo that instantiates a Local tx connection pool. It provides same
* functionality as ds.xml files
*
*
* @author ����
* @version $Id: LocalTxDataSource.java, v 0.1 2014-1-6 ����05:32:25 Exp $
*/
public class LocalTxDataSource {
protected static Logger logger = Logger.getLogger(LocalTxDataSource.class);
/** */
public final static String SUFFIX = "ConnectionPool";
/**
*
*/
public LocalTxDataSource() {
}
private CachedConnectionManager cachedConnectionManager = null;
private TransactionManager transactionManager = null;
private String name = null;
private final LocalManagedConnectionFactory mcf = new LocalManagedConnectionFactory();
private final JBossManagedConnectionPool pool = new JBossManagedConnectionPool();
private TxConnectionManager connectionManager;
private DataSource datasource;
/** ��������zds */
private ZDataSource zdatasource;
/**
*
* @author sicong.shou
* @version $Id: LocalTxDataSource.java, v 0.1 2012-11-23 ����11:40:05 sicong.shou Exp $
*/
public class ConnectionManagerDelegate implements ConnectionManager {
private static final long serialVersionUID = 1L;
public Object allocateConnection(ManagedConnectionFactory mcf,
ConnectionRequestInfo cxRequestInfo)
throws ResourceException {
return connectionManager.allocateConnection(mcf, cxRequestInfo);
}
}
/**
*
* @param zdatasource
* @throws Exception
*/
public void init(ZDataSource zdatasource) throws Exception {
initPool();
initConnectionManager();
pool.start();
initDataSource(zdatasource);
this.zdatasource = zdatasource;
}
/**
*
* @param zdatasource
* @throws ResourceException
*/
private void initDataSource(ZDataSource zdatasource) throws ResourceException {
datasource = (DataSource) mcf.createConnectionFactory(new ConnectionManagerDelegate(),
this.name, zdatasource);
}
/**
*
*/
private void initConnectionManager() {
if (transactionManager == null) {
throw new IllegalStateException("transactionManager is required");
}
connectionManager = new TxConnectionManager();
connectionManager.setCachedConnectionManager(cachedConnectionManager);
connectionManager.setTransactionManagerInstance(transactionManager);
connectionManager.setName(name);
connectionManager.setLocalTransactions(true);
connectionManager.setTrackConnectionByTx(true);
}
private void initPool() {
pool.setManagedConnectionFactory(mcf);
pool.setName(name);
pool.setDataSource(this);
}
public void destroy() throws Exception {
pool.stop();
}
public void flush() {
pool.flush();
}
public void setName(String Name) {
this.name = Name;
}
public String getBeanName() {
return this.name;
}
/**
*
* @throws Exception
*/
public void start() throws Exception {
pool.startService();
connectionManager.setPoolingStrategy(pool.getPoolingStrategy());
connectionManager.startService();
if (logger.isDebugEnabled()) {
logger.debug("Connection pool " + name + " is started");
}
}
/**
*
* @throws Exception
*/
public void stop() throws Exception {
connectionManager.stopService();
pool.stopService();
if (logger.isDebugEnabled()) {
logger.debug("Connection pool " + name + " is stopped");
}
}
public DataSource getDatasource() {
return datasource;
}
public void setCachedConnectionManager(CachedConnectionManager cachedConnectionManager) {
this.cachedConnectionManager = cachedConnectionManager;
}
public void setTransactionManager(TransactionManager transactionManager) {
this.transactionManager = transactionManager;
}
public int getMinSize() {
return pool.getMinSize();
}
public void setMinSize(int minSize) {
pool.setMinSize(minSize);
}
public int getMaxSize() {
return pool.getMaxSize();
}
public void setMaxSize(int maxSize) {
pool.setMaxSize(maxSize);
}
public int getBlockingTimeoutMillis() {
return pool.getBlockingTimeoutMillis();
}
public void setBlockingTimeoutMillis(int blockingTimeout) {
pool.setBlockingTimeoutMillis(blockingTimeout);
}
public long getIdleTimeoutMinutes() {
return pool.getIdleTimeoutMinutes();
}
public void setIdleTimeoutMinutes(long idleTimeout) {
pool.setIdleTimeoutMinutes(idleTimeout);
}
public boolean getBackgroundValidation() {
return pool.getBackGroundValidation();
}
public void setBackgroundValidation(boolean backgroundValidation) {
pool.setBackGroundValidation(backgroundValidation);
}
public long getBackGroundValidationMinutes() {
return pool.getBackGroundValidationMinutes();
}
public void setBackGroundValidationMinutes(long backgroundInterval) {
pool.setBackGroundValidationMinutes(backgroundInterval);
}
public boolean getPrefill() {
return pool.getPreFill();
}
public void setPrefill(boolean prefill) {
pool.setPreFill(prefill);
}
public String getEncPassword() {
return mcf.getEncPassword();
}
public void setEncPassword(String encPassword) {
mcf.setEncPassword(encPassword);
}
public boolean getUseFastFail() {
return pool.getUseFastFail();
}
public void setUseFastFail(boolean useFastFail) {
pool.setUseFastFail(useFastFail);
}
public String getDriverClass() {
return mcf.getDriverClass();
}
public void setDriverClass(final String driverClass) {
mcf.setDriverClass(driverClass);
}
public String getConnectionURL() {
return mcf.getConnectionURL();
}
public void setConnectionURL(final String connectionURL) {
mcf.setConnectionURL(connectionURL);
}
public void setUserName(final String userName) {
mcf.setUserName(userName);
}
public String getUserName() {
return mcf.getUserName();
}
public void setPassword(final String password) {
mcf.setPassword(password);
}
public String getPassword() {
return mcf.getPassword();
}
public void setPreparedStatementCacheSize(int size) {
mcf.setPreparedStatementCacheSize(size);
}
public int getPreparedStatementCacheSize() {
return mcf.getPreparedStatementCacheSize();
}
public boolean getSharePreparedStatements() {
return mcf.getSharePreparedStatements();
}
public void setSharePreparedStatements(boolean sharePS) {
mcf.setSharePreparedStatements(sharePS);
}
public boolean getTxQueryTimeout() {
return mcf.isTransactionQueryTimeout();
}
public void setTxQueryTimeout(boolean qt) {
mcf.setTransactionQueryTimeout(qt);
}
public int getQueryTimeout() {
return mcf.getQueryTimeout();
}
public void setQueryTimeout(int queryTimeout) {
mcf.setQueryTimeout(queryTimeout);
}
public String getTransactionIsolation() {
return mcf.getTransactionIsolation();
}
public void setTransactionIsolation(String transactionIsolation) {
mcf.setTransactionIsolation(transactionIsolation);
}
public String getNewConnectionSQL() {
return mcf.getNewConnectionSQL();
}
public void setNewConnectionSQL(String newConnectionSQL) {
mcf.setNewConnectionSQL(newConnectionSQL);
}
public String getCheckValidConnectionSQL() {
return mcf.getCheckValidConnectionSQL();
}
public void setCheckValidConnectionSQL(String checkValidConnectionSQL) {
mcf.setCheckValidConnectionSQL(checkValidConnectionSQL);
}
public String getTrackStatements() {
return mcf.getTrackStatements();
}
public void setTrackStatements(String value) {
mcf.setTrackStatements(value);
}
public String getExceptionSorterClassName() {
return mcf.getExceptionSorterClassName();
}
public void setExceptionSorterClassName(String exceptionSorterClassName) {
mcf.setExceptionSorterClassName(exceptionSorterClassName);
}
public String getValidConnectionCheckerClassName() {
return mcf.getValidConnectionCheckerClassName();
}
public void setValidConnectionCheckerClassName(String value) {
mcf.setValidConnectionCheckerClassName(value);
}
public boolean getValidateOnMatch() {
return mcf.getValidateOnMatch();
}
public void setValidateOnMatch(boolean validateOnMatch) {
mcf.setValidateOnMatch(validateOnMatch);
}
public String getConnectionPropertiesString() {
return mcf.getConnectionProperties();
}
//add by yunalan
public Properties getConnectionProperties() {
return mcf.getConnectionProps();
}
public void setConnectionPropertiesString(String connectionProperties) {
mcf.setConnectionProperties(connectionProperties);
}
public void setConnectionProperties(Map<String, String> connectionProperties) {
mcf.setConnectionProperties(connectionProperties);
}
public void setCriteria(String criteria) {
pool.setCriteria(criteria);
}
public String getCriteria() {
return pool.getCriteria();
}
public boolean getNoTxSeparatePools() {
return pool.getNoTxSeparatePools();
}
public void setNoTxSeparatePools(boolean noTxSeparatePools) {
pool.setNoTxSeparatePools(noTxSeparatePools);
}
public boolean isNoTxSeparatePools() {
return pool.getNoTxSeparatePools();
}
/**
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
final String TAB = ", ";
StringBuilder sb = new StringBuilder();
sb.append("LocalTxDataSource(").append(super.toString()).append(TAB).append("beanName = ")
.append(this.getBeanName()).append(TAB).append("connectionURL = ").append(
this.getConnectionURL()).append(TAB).append("driverClass = ").append(
this.getDriverClass()).append(TAB).append("userName = ").append(this.getUserName())
.append(TAB).append("password = ").append(this.getPassword()).append(TAB).append(
"maxSize = ").append(this.getMaxSize()).append(TAB).append("minSize = ").append(
this.getMinSize()).append(TAB).append("preparedStatementCacheSize = ").append(
this.getPreparedStatementCacheSize()).append(TAB).append("connectionProperties = ")
.append(this.getConnectionPropertiesString()).append(TAB).append(
"exceptionSorterClassName = ").append(this.getExceptionSorterClassName()).append(
TAB).append("txQueryTimeout = ").append(this.getTxQueryTimeout()).append(TAB)
.append("queryTimeout = ").append(this.getQueryTimeout()).append(TAB).append(
"transactionIsolation = ").append(this.getTransactionIsolation()).append(TAB)
.append("blockingTimeoutMillis = ").append(this.getBlockingTimeoutMillis()).append(TAB)
.append("backgroundValidation = ").append(this.getBackgroundValidation()).append(TAB)
.append("idleTimeoutMinutes = ").append(this.getIdleTimeoutMinutes()).append(TAB)
.append("validateOnMatch = ").append(this.getValidateOnMatch()).append(TAB).append(
"checkValidConnectionSQL = ").append(this.getCheckValidConnectionSQL()).append(TAB)
.append("validConnectionCheckerClassName = ").append(
this.getValidConnectionCheckerClassName()).append(TAB).append("trackStatements = ")
.append(this.getTrackStatements()).append(TAB).append("prefill = ").append(
this.getPrefill()).append(TAB).append("useFastFail = ").append(
this.getUseFastFail()).append(TAB).append("sharePreparedStatements = ").append(
this.getSharePreparedStatements()).append(TAB).append("newConnectionSQL = ")
.append(this.getNewConnectionSQL()).append(TAB).append("noTxSeparatePools = ").append(
this.getNoTxSeparatePools()).append(TAB).append("backgroundValidationMinutes = ")
.append(this.getBackGroundValidationMinutes()).append(")");
return sb.toString();
}
public ZDataSource getZdataosource() {
return zdatasource;
}
public void setZdataosource(ZDataSource zdatasource) {
this.zdatasource = zdatasource;
}
public PoolCondition getPoolCondition() {
return new PoolCondition(name, pool.getMinSize(), pool.getMaxSize(), pool
.getAvailableConnectionCount(), pool.getConnectionCount(), pool
.getInUseConnectionCount(), pool.getMaxConnectionsInUseCount(), pool
.getConnectionCreatedCount(), pool.getConnectionDestroyedCount());
}
}