package com.lizard.fastdb;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.lizard.fastdb.datasource.DataSource;
import com.lizard.fastdb.datasource.DataSourceCache;
import com.lizard.fastdb.datasource.DataSourceManager;
import com.lizard.fastdb.datasource.DataSourceUtil;
import com.lizard.fastdb.jdbc.JdbcHandler;
import com.lizard.fastdb.jdbc.JdbcHandlerImpl;
/**
* 数据库工厂
*
* @author SHEN.GANG
*/
public final class DBFactory
{
private static final Log logger = LogFactory.getLog(DBFactory.class);
private DBFactory() { }
/**
* 创建指定名称的数据源的 JdbcHandler
*
* @param datasourceName 数据源名称
* @return JdbcHandler
*/
public static JdbcHandler create(String datasourceName)
{
if (datasourceName == null || datasourceName.trim().length() == 0)
{
logger.warn("DataSource name can't be null!");
return null;
}
datasourceName = datasourceName.toLowerCase().trim();
DataSourceManager.initConnectionProvider(datasourceName);
return createJdbcHandler(new DataSource(DataSourceCache.getDataSource(datasourceName)));
}
/**
* 创建根据当前配置的数据源的 JdbcHandler
*
* @param ds_name 数据源名称
* @param driver_class 数据库驱动类
* @param driver_url 数据库URL
* @param user 用户
* @param password 密码
* @return JdbcHandler
*/
public static JdbcHandler create(String ds_name, String driver_class, String driver_url, String user, String password)
{
return create(new DataSource(ds_name, driver_class, driver_url, user, password));
}
/**
* 创建当前数据源对象的 JdbcHandler
*
* @param ds 动态DataSource配置
* @return JdbcHandler
*/
public static JdbcHandler create(DataSource datasource)
{
DataSourceManager.initConnectionProvider(DataSourceUtil.convertDataSourceToProperties(datasource));
return createJdbcHandler(datasource);
}
/**
* 根据数据源对象创建JdbcHandler对象
*
* @param ds 数据源配置对象
* @return JdbcHandler
*/
private static JdbcHandler createJdbcHandler(DataSource ds)
{
return new JdbcHandlerImpl(ds);
}
/**
* 销毁指定的数据源<br>
* <b>注意:该操作将彻底销毁该数据源相关的所有内存资源、物理连接等,以后不能再被使用!</b>
*
* 1.如果传递的是真实数据源名称,将销毁对应的真实数据源;<br>
* 2.如果传递的是虚拟数据源名称,将销毁软连接,软连接将不可用,软连接指向的真实数据源不会被销毁;
*
* @param ds_name 待销毁的数据源名称
*/
public static void destroy(String ds_name)
{
if (ds_name == null || ds_name.trim().length() == 0)
{
logger.warn("DataSource name can't be null!");
return;
}
DataSourceManager.destroy(ds_name.toLowerCase().trim());
}
/**
* 释放指定数据源连接池中创建的所有物理连接,清空连接池,用于暂时缓解数据库连接资源;<br>
* 该数据源以后可以被继续创建使用。<br>
*
* 1.如果传递的是真实数据源名称,将关闭对应的真实数据源;<br>
* 2.如果传递的是软连接虚拟数据源名称,则不作任何处理;
*
* @param ds_name 待释放的数据源名称
*
*/
public static void shutdown( String ds_name )
{
if (ds_name == null || ds_name.trim().length() == 0)
{
logger.warn("DataSource name can't be null!");
return;
}
DataSourceManager.shutdown(ds_name.toLowerCase().trim());
}
}