`
li445970924
  • 浏览: 21660 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

动态切换数据库不用重启服务器

阅读更多
做一个项目可能会用到多个数据库开发一套,测试一套遇到问题可能连接数据库时要换来换去,要去改配置重启 我觉得十分麻烦,所以自己做了一个动态切换数据库的空能 先上代码
public class MultiDataSourceAction extends BaseAction {
...
	private String url;
	public void setUrl(String url){
		this.url=url;
	}
	public String getUrl(){
		return url;
	}
	/**
	 * 切换数据库
	 * @return
	 * @throws Exception
	 */
	public String changeDataSource() throws Exception{
		this.addActionMessage("连接成功");
		String beanName="dataSource";//默认105 要与spring配置文件配置bean id相同
		if("11".equals(url)){
			beanName="dataSource11";
		}else if ("116".equals(url)) {
			beanName="dataSource116";
		}
		TabDataSource.getInstance().changeDataSource(beanName);
		return "success";
	}
...
}
这是action代码  需要从页面传过来一个区分那个数据库的标识
public class TabDataSource{
	public static TabDataSource NEWSOURCE=null;
	public SessionFactory factory;

	public static TabDataSource getInstance() throws Exception{
		if(NEWSOURCE==null)
		NEWSOURCE=new TabDataSource();
		SessionManager.releaseSession();//释放登录用户让其好重新登录 SessionManager是一个session管理,关于session资源的持久化应该统一在此类 就不上代码了
		return NEWSOURCE;
	}
	//new Configuration().configure().buildSessionFactory(); 
	public void changeDataSource(String beanName)throws Exception{
		//清除所有二级缓存 SourceTemplate是一个获得各种静态资源的类 大伙应该能想得到
		factory=(SessionFactory)SourceTemplate.getSpringContextInstance().getBean("sessionFactory");
		factory.evictQueries();
		//切换数据源
		HotSwappableTargetSource swapper=(HotSwappableTargetSource)SourceTemplate.getSpringContextInstance().getBean("swappableDataSource");
		DataSource newDataSource=(DataSource)SourceTemplate.getSpringContextInstance().getBean(beanName);
		swapper.swap(newDataSource);
		// 重新加载菜单
//到这切换数据源算是完成了 下面的主要是我的项目里 在服务器启动的时候就初始化了一个servlet用来加载菜单所以要重新加载 
		ICache cache=(ICache)SourceTemplate.getSpringContextInstance().getBean("BaseSystemCache");
		cache.getCachMap().clear();
		cache.cacheInit();
		CacheManager.addCache(cache.getCachName(), cache);
	}

}

切换数据源在上面完成 下面看配置
<bean id="sessionFactory"
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
     	<property name="dataSource">
     		<ref local="swappable"/>
     	</property>....
     	</bean>
 <bean id="swappable" class="org.springframework.aop.framework.ProxyFactoryBean">   
        <property name="targetSource">   
            <ref local="swappableDataSource"/>   
        </property>   
    </bean>
    <bean id="swappableDataSource" class="org.springframework.aop.target.HotSwappableTargetSource">   
        <constructor-arg>   
            <ref local="dataSource"/>   
        </constructor-arg>   
    </bean>
<bean id="propertyConfigurer"
		class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
		<property name="locations">
			<list>
				<value>
					SqlMapConfig.properties
				</value>
			</list>
		</property>
	</bean>
	<bean id="dataSource"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="url">
			<value>${jdbc.url}</value>
		</property>
		<property name="username">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
	</bean>
	<bean id="dataSource11"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="url">
			<value>${jdbc.11url}</value>
		</property>
		<property name="username">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
	</bean>
	<bean id="dataSource116"
		class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName">
			<value>${jdbc.driverClassName}</value>
		</property>
		<property name="url">
			<value>${jdbc.116url}</value>
		</property>
		<property name="username">
			<value>${jdbc.username}</value>
		</property>
		<property name="password">
			<value>${jdbc.password}</value>
		</property>
	</bean>

到这就差不多了还需要个SqlMapConfig.properties就OK了 因为我所用的库就URL不同 其他的都是一样的 所以上面的配置大伙可以根据自己要求改
jdbc.datasource=org.apache.commons.dbcp.BasicDataSource
jdbc.driverClassName=com.ibm.db2.jcc.DB2Driver
jdbc.url=jdbc\:db2\://ip\:post/dbname
jdbc.username=username
jdbc.password=password
jdbc.105url=jdbc\:db2\://ip\:post/dbname
jdbc.116url=jdbc\:db2\://ip\:post/dbname
jdbc.11url=jdbc\:db2\://ip\:post/dbname

上面是SqlMapConfig.properties 配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
        "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>	
	<package name="multi" namespace="/bbsp/bd" extends="leadmind-base">
    	<!-- -->
    	<global-results>
    		<result name="commonException">/billplatform/exceptions/exception.jsp</result>
    	</global-results>
		<global-exception-mappings>
			<exception-mapping result="commonException" exception="java.lang.Exception"></exception-mapping>		
		</global-exception-mappings>
		 
		<action name="MultiDataSource_*" method="{1}" class="***.actions.MultiDataSourceAction">
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

自己做这个感触很多  通过做这个小功能 对hibernate spring 了解又深了一些 但也遇到了很多问题 我通过spring 通过setter注入sessionfactory时怎么也注入不进去现在还不明白 但注入一些常量又可以 现在还不明白 只能用getbean方法..这个功能是完成了 但不知道效率咋样 请大家指点
0
0
分享到:
评论
3 楼 Howareyou73 2012-08-15  
你好SourceTemplate 这个是jar包名是什么
2 楼 mailter 2012-02-18  
同上

20383972@qq.com
1 楼 lmx0431 2012-01-30  
你好, 把这两个类的代码给我看看咯
SessionManager.java
SourceTemplate.java


1831360698@qq.com

相关推荐

    Oracle RAC重启操作手册

    - **目的**: 避免在数据库重启过程中造成数据丢失或损坏。 - **操作方法**: - 登录到数据库服务器,通过查询相关的进程或服务状态来确认应用程序是否已经停止。 **知识点2:确认数据库状态** - **背景**: 在进行...

    数据库运维 形考任务1 实验1 MySQL数据库服务器配置.pdf

    MySQL数据库服务器配置是数据库运维中的基础工作,本实验涵盖了MySQL的安装、配置、启动与关闭、日志管理、数据库与表的创建以及存储引擎的使用等多个关键知识点。 1. **MySQL安装**:实验要求下载并安装MySQL,这...

    Linux系统怎么用命令重启oracle数据库.docx

    首先,理解数据库重启的基本流程至关重要。重启Oracle数据库通常涉及两个主要步骤:停止数据库实例(如果尚未关闭)和重新启动监听器以及数据库实例。以下是几种常见的重启方法: **方法1:使用`dbstart`和`lsnrctl...

    实验1 MySQL数据库服务器配置.docx

    实验1的目的是让学生熟悉MySQL数据库服务器的安装、配置和管理,包括日志系统、数据库创建、存储引擎的使用以及系统状态参数的查看等关键环节。以下是各实验内容的详细说明: 1. 安装MySQL:从官方网站下载适合操作...

    Linux下启动数据库服务命令

    在Linux系统中,切换数据库环境使用`export ORACLE_SID=数据库名`。Oracle的导出命令为`exp`,导入命令为`imp`,在命令中指定相应的用户、文件路径和数据库连接信息。当遇到导入导出问题,可以执行`catmet.sql`和`...

    linux oracle重新启动

    ### Linux环境下Oracle数据库重启知识点详解 #### 一、概述 在Linux环境中,Oracle数据库的管理是常见的运维操作之一。为了确保系统的稳定运行,有时需要重启Oracle数据库及其监听器。本文将详细介绍在Linux环境下...

    服务器安装Centos7系统作为数据库服务器.docx

    【服务器安装Centos7系统作为数据库服务器】 在搭建数据库服务器时,选择Centos7作为操作系统是一种常见的选择,因为它提供了一个稳定、安全且可定制的Linux环境。本文将详细阐述如何在Centos7上安装和配置数据库...

    数据库应急预案.pdf

    * 节点故障:重启数据库服务器,介质恢复,故障恢复,介质启动CRS,故障解决 * 数据库故障:数据库方面的故障,主备切换,其它故障 二、数据库应急恢复流程 数据库应急恢复流程可以分为以下步骤: 1. 使用本地...

    linux重启oracle相关服务

    在 Linux 中,可以使用 export ORACLE_SID=C1 命令切换到需要启动的数据库实例,然后使用 sqlplus /nolog 命令登录 Sqlplus 控制台,接着使用 connect / as sysdba 命令以系统管理员身份登录,最后使用 startup 命令...

    mysql主备机宕机自动切换

    MySQL复制(Replication)是MySQL数据库系统中一个重要的特性,它允许数据从一台MySQL服务器(称为Master)复制到另一台或多台MySQL服务器(称为Slave)。复制可以实现数据冗余和负载均衡,对于提高系统的可靠性和...

    Oracle数据库服务器参数文件的使用与维护.pdf

    SPFILE的一个显著优势在于它可以被系统动态读写,这意味着许多参数可以在不重启数据库的情况下进行修改,大大减少了系统维护的时间成本。 3. **服务器参数文件的修改** 修改SPFILE通常使用`ALTER SYSTEM`命令,并...

    金仓数据库kingbaseES

    kingbaseES不仅支持Windows操作系统,也支持Linux、Unix等主流服务器平台,具备良好的跨平台兼容性,适应不同企业的IT环境。 8. **版本与许可** 提供的kingbase3.1_Win2K_5users版本,特别适合小型企业或教学环境...

    如何在Linux系统下搭建Web服务器及数据库服务器.doc

    在Linux系统下搭建Web服务器及数据库服务器是一项基础但至关重要的工作,这主要涉及到服务器环境的配置、软件的安装以及服务的启动与管理。本篇将详细介绍这一过程。 首先,Linux系统的安装是整个流程的起点。通常...

    SYBASE数据库维护指南

    - 重启服务器后,再次使用isql登录SQL Server,并将数据库上线。 ```sql online database 数据库名 ``` 4. **继续操作:** - 开启新事务,切换到master数据库,将数据库的状态更新为可用状态(`0`)。 ```sql ...

    数据库应急预案

    - 在服务器宕机的情况下,重启服务器并执行`#/etc/init.d/init.crs start`。 - 使用`crs_stat -t`检查所有节点的CRS服务资源是否已处于在线状态。 - 如果服务器未宕机,可以尝试停止并重新启动CRS服务。 - **...

    mysql_5.1_数据库服务器安装_导入数据及卸载步骤.

    在本文中,我们将详细讨论如何安装MySQL 5.1数据库服务器,导入数据,以及卸载MySQL服务器的步骤。MySQL是一个流行的开源关系型数据库管理系统,广泛应用于各种规模的企业和项目中。 ### 一、安装MySQL 5.1数据库...

    MES服务器及数据库启动操作文档.docx

    1. **切换用户**:首先,需要切换到数据库管理员用户,如`oracle`,通过命令`su - oracle`进行身份切换。 2. **登录数据库**:接着,使用`sqlplus / as sysdba`命令以SYSDBA权限登录Oracle数据库。 3. **启动数据库*...

    Oracle数据库开归档方法

    与相关团队沟通,确保他们能接受即将进行的数据库重启。 三、创建归档日志路径 在开始设置归档模式前,需要在服务器上创建一个用于存储归档日志的目录,例如`E:\archivelog`。这个路径应该根据实际的存储策略和安全...

Global site tag (gtag.js) - Google Analytics