package com.lizard.fastdb.connection;
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.lizard.fastdb.datasource.DataSourceCache;
import com.lizard.fastdb.transaction.MultiTransactionController;
import com.lizard.fastdb.transaction.Transaction;
import com.lizard.fastdb.transaction.TransactionConstant;
import com.lizard.fastdb.transaction.TransactionController;
/**
* 连接池管理器,用于从连接池获得和关闭连接,同时可用于获得和关闭非连接池中的连接
*
* @author SHEN.GANG
*/
public class ConnectionPool
{
private static final Log logger = LogFactory.getLog(ConnectionPool.class);
/**
* 获得依赖于数据库连接池的连接
*
* @param ds_name 数据源名称
* @return 当前数据源的数据库连接
*/
public static Connection getConnection(String ds_name)
{
// 确保ds_name是真实数据源名称
Connection conn = null;
ConnectionProvider connP = DataSourceCache.getConnectionProvider(ds_name);
// 事务模式
int trans_model = Transaction.getTransMode();
// 无事务模式
if (trans_model == TransactionConstant.TRANS_MODE_NOTRANSACTION)
{
try
{
conn = connP.getConnection();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
// 单数据源事务模式
else if (trans_model == TransactionConstant.TRANS_MODE_SINGLEDATASOURCE)
{
// 单数据源事务管理器已经加载某数据源
if (TransactionController.contains(ds_name))
{
conn = TransactionController.getConnection();
}
else
{
try
{
conn = connP.getConnection();
}
catch (SQLException e)
{
e.printStackTrace();
}
// 单数据源事务第一次启动,没有数据源被加载
if (!TransactionController.isUsed())
{
TransactionController.load(ds_name, conn);
}
else
{
logger.info("单数据源事务管理器[TransactionController]已经加载数据源[" + TransactionController.LOCAL_DSNAME.get() + "]," + "不会对数据源[" + ds_name
+ "]进行事务管理,如果需要在事务中使用多个数据源,请使用多数据源事务管理器[MultiTransactionController]!");
}
}
}
// 多数据源事务模式
else if (trans_model == TransactionConstant.TRANS_MODE_MULTIDATASOURCE)
{
// 多数据源事务管理器已经加载某数据源
if (MultiTransactionController.contains(ds_name))
{
conn = MultiTransactionController.getConnection(ds_name);
}
else
{
try
{
conn = connP.getXAConnection(MultiTransactionController.transMgr);
}
catch (SQLException e)
{
e.printStackTrace();
}
MultiTransactionController.load(ds_name, conn);
}
}
return conn;
}
/**
* 直接从数据源获得连接,与事务无关
*
* @param ds_name 数据源名称
* @return 数据库连接
*/
public static Connection getIndependConnection(String ds_name)
{
Connection conn = null;
try
{
conn = DataSourceCache.getConnectionProvider(ds_name).getConnection();
}
catch (SQLException e)
{
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库连接池中的连接
*
* @param name 数据源名称
* @param conn 数据库连接
*/
public static void closeConnection(String name, Connection conn)
{
if (Transaction.getTransMode() == TransactionConstant.TRANS_MODE_NOTRANSACTION)
{
try
{
DataSourceCache.getConnectionProvider(name).closeConnection(conn);
}
catch (SQLException e)
{
e.printStackTrace();
}
}
}
/**
* 关闭一个数据库连接,该连接于事务无关
*
* @param ds_name 数据源名称
* @param conn 数据库连接
*/
public static void closeIndependConnection(String ds_name, Connection conn)
{
if (conn != null)
{
try
{
DataSourceCache.getConnectionProvider(ds_name).closeConnection(conn);
}
catch (SQLException e)
{
e.printStackTrace();
}
conn = null;
}
}
/**
* 判断当前是否处于事务中
*
* @return true 处于事务中,false 处于非事务中
*/
public static boolean isInTransaction()
{
return Transaction.getTransMode() != TransactionConstant.TRANS_MODE_NOTRANSACTION;
}
}