import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.SQLException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
* 数据源切换
*
*/
public class MultiDataSource implements DataSource,ApplicationContextAware {
private static final Log log = LogFactory.getLog(MultiDataSource.class);
@SuppressWarnings("unused")
private ApplicationContext applicationContext = null;
private DataSource dataSource = null;
/* (non-Javadoc)
* @see javax.sql.DataSource#getConnection()
*/
@Override
public Connection getConnection() throws SQLException {
return getDataSource().getConnection();
}
/* (non-Javadoc)
* @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
*/
@Override
public Connection getConnection(String arg0, String arg1)
throws SQLException {
return getDataSource().getConnection(arg0, arg1);
}
/* (non-Javadoc)
* @see javax.sql.DataSource#getLogWriter()
*/
@Override
public PrintWriter getLogWriter() throws SQLException {
return getDataSource().getLogWriter();
}
/* (non-Javadoc)
* @see javax.sql.DataSource#getLoginTimeout()
*/
@Override
public int getLoginTimeout() throws SQLException {
return getDataSource().getLoginTimeout();
}
/* (non-Javadoc)
* @see javax.sql.DataSource#setLogWriter(java.io.PrintWriter)
*/
@Override
public void setLogWriter(PrintWriter arg0) throws SQLException {
getDataSource().setLogWriter(arg0);
}
/* (non-Javadoc)
* @see javax.sql.DataSource#setLoginTimeout(int)
*/
@Override
public void setLoginTimeout(int arg0) throws SQLException {
getDataSource().setLoginTimeout(arg0);
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
public DataSource getDataSource(String dataSourceName){
//System.out.println("dataSourceName:"+dataSourceName);
/*try{
if(dataSourceName==null||dataSourceName.equals("")){
return this.dataSource;
}
System.out.println("DataSource:"+(DataSource)this.applicationContext.getBean(dataSourceName));
return (DataSource)this.applicationContext.getBean(dataSourceName);*/
try{
if(null==dataSourceName){
dataSourceName="p1_dev";
}
Context initCtx = new InitialContext();
try {
Context ctx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource) ctx.lookup(dataSourceName.toUpperCase());
}
catch(NamingException e){
Context ctx = (Context) initCtx.lookup("java:");
dataSource = (DataSource) ctx.lookup(dataSourceName.toUpperCase());
}
return dataSource;
}catch(Exception ex){
System.out.println("没有 <name:"+dataSourceName+"> 数据源 在系统当中!");
log.fatal(ex);
return null;
}
}
public void setDataSource(DataSource dataSource) {
this.dataSource = dataSource;
}
public DataSource getDataSource(){
String sp = SpObserver.getSp();
return getDataSource(sp);
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import mellson.multidata.SpObserver;
/**
*
* 过滤器,从传入参数获取数据源名称
*
*/
public class ServerFilter extends HttpServlet implements Filter {
private static final long serialVersionUID = 6452049924844786456L;
private static FilterConfig filterConfig;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
ServerFilter.filterConfig = filterConfig;
}
public static String getKey(){
String keyCode = ServerFilter.filterConfig.getInitParameter("keyCode");
return keyCode;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
/**
* 需要在此处操作数据源,将数据源切换到新定义好的数据源当中。
*/
//System.out.println("request.getServerName():_"+request.getServerName());
//String url = Thread.currentThread().getContextClassLoader().getResource("") + "dataSource/_"+request.getServerName()+".xml";
//File f=new File(url.substring(6, url.length()));
System.out.println("datasource:"+request.getParameter("datasource"));
if(null!=request.getParameter("datasource")){
SpObserver.putSp(request.getParameter("datasource"));
}else{
SpObserver.putSp("p1");
}
filterChain.doFilter(request, response);
}
}
/**
* 线程控制
*
*/
public class SpObserver {
private static ThreadLocal<String> local = new ThreadLocal<String>();
public static void putSp(String sp) {
local.set(sp);
}
public static String getSp() {
return (String)local.get();
}
}