package com.ycsoft.report.db;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.ycsoft.commons.exception.ReportException;
import com.ycsoft.commons.helper.LoggerHelper;
import com.ycsoft.commons.helper.StringHelper;
import com.ycsoft.report.bean.RepDatabase;
import com.ycsoft.report.commons.ReportConstants;
import com.ycsoft.report.dao.config.RepDatabaseDao;
/**
* 连接池容器
*/
public class ConnContainer {
private static Map<String, DataSource> dsmap = new HashMap<String, DataSource>();
public static void init(RepDatabaseDao dbdao) throws ReportException {
RepDatabase db = new RepDatabase();
try {
List<RepDatabase> dblist = dbdao.findAll();
for (RepDatabase dbcfg : dblist) {
db = dbcfg;
if(!dbcfg.getType().equals(ReportConstants.DATABASETYPE_REALTIME)
&&!dbcfg.getType().equals(ReportConstants.DATABASETYPE_HISTROY)){
throw new ReportException("rep_datebase:"+dbcfg.getDatabase()
+"的type无法识别!(正确类型为"+ReportConstants.DATABASETYPE_REALTIME+","+ReportConstants.DATABASETYPE_HISTROY+"请仔细检查)");
}
if (ReportConstants.DATABASE_SYSTEM.equals(dbcfg.getDatabase()))
dsmap.put(ReportConstants.DATABASE_SYSTEM, dbdao.getDataSource());
else {
dsmap.put(dbcfg.getDatabase(), DataSourceUtil
.configDataSource(dbcfg));
LoggerHelper.info(ConnContainer.class,"database init:"+dbcfg.getDatabase());
}
}
try{
db=dbdao.getRepSortDB();
if(db==null) throw new ReportException("装载多维计算用排序数据源错误:rep_sort_db无记录");
dsmap.put(ReportConstants.DATABASETYPE_CUBE_SORT, DataSourceUtil.configDataSource(db));
LoggerHelper.info(ConnContainer.class,"rep_sort_db init:"+ReportConstants.DATABASETYPE_CUBE_SORT);
}catch(ReportException e1){
throw e1;
}catch(Exception e1){
throw new ReportException("装载多维计算用排序数据源错误.请检查rep_sort_db表配置是否正确",e1);
}
} catch (Exception e) {
throw new ReportException("装载报表数据源" + db.getDatabase() + "错误", e);
}
}
public static Connection getConn(String database) throws SQLException {
if(database==null||"".equals(database))
return dsmap.get(ReportConstants.DATABASE_SYSTEM).getConnection();
if (!dsmap.containsKey(database))
throw new SQLException("database :"+database + " is no config.");
return dsmap.get(database).getConnection();
}
public static void clossContainer() {
Iterator<String> it = dsmap.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
try {
if (!ReportConstants.DATABASE_SYSTEM.equals(key))
((ComboPooledDataSource) dsmap.get(key)).close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class DataSourceUtil {
public static DataSource configDataSource(RepDatabase cfg)
throws PropertyVetoException {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(cfg.getDriverclass().trim());
// loads the jdbc driver
ds.setJdbcUrl(cfg.getUrl().trim());
ds.setUser(cfg.getUsername().trim());
ds.setPassword(cfg.getPassword().trim());
ds.setMaxStatements(20);//
ds.setMaxIdleTime(cfg.getMaxidletime());// 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃
ds.setMaxPoolSize(cfg.getMaxpoolsize());// 池最大连接数
ds.setMinPoolSize(cfg.getMinpoolsize());// 池最小连接数
// 检查有效性
if(StringHelper.isNotEmpty(cfg.getTestquerysql())&&cfg.getTestoeriod()!=null){
ds.setPreferredTestQuery(cfg.getTestquerysql());
ds.setIdleConnectionTestPeriod(cfg.getTestoeriod());// 每隔10分钟检查一次空闲连接的有效性
}
//获取连接超时
ds.setCheckoutTimeout(10000);
return ds;
}
public static void closeDataSource(DataSource ds) throws SQLException {
ComboPooledDataSource bds = (ComboPooledDataSource) ds;
if (bds != null)
bds.close();
bds = null;
}
}