`

zeus持久层读写分离单元测试

 
阅读更多

本文是zeus读写分离单元测试,距离分库分表,只有一步了.上代码:

1.ZeusMasterSlaveTest.java

package com.dengliang.zeus.webdemo.test;

import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.dengliang.zeus.webdemo.services.IDajc01Service;
import com.dengliang.zeus.webdemo.services.impl.Dajc01Service;
import com.dengliang.zeus.webdemo.util.UIDGenerator;
import com.dengliang.zeus.webdemo.vo.Dajc01VO;


/**
 * zeus读写分离单元测试
 * @author 100755_邓亮 2015年5月8日
 *
 */
public class ZeusMasterSlaveTest {
	private static ApplicationContext context;
	/**
	 * 获取bean
	 * 
	 * @param id
	 * @return
	 */
	public static Object getBean(String id) {
		if (context == null) {
			synchronized (id) {
				context = new ClassPathXmlApplicationContext(
						"applicationContext-dao.xml",
						"applicationContext-service.xml",
						"applicationContext-Master-Slave.xml");
			}
		}
		return context.getBean(id);
	}
	@Test
	public void slaveTest() {
		// 只读测试
		Dajc01Service service = (Dajc01Service) ZeusMasterSlaveTest.getBean("dajc01Service");
		try {
			List<Dajc01VO> dalist=service.queryAllSystem();
			Assert.assertEquals(null, dalist);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}	
	@Test
	public void masterTest() {
		//主库上新增,再查询
		IDajc01Service service = (IDajc01Service) ZeusMasterSlaveTest.getBean("dajc01Service");
		try {
			List<Dajc01VO> list=new ArrayList();
			for (int i = 0; i < 10; i++) {
				Dajc01VO da001 = new Dajc01VO();
				da001.setUuid(UIDGenerator.getUUID());
				da001.setSysId(i+"");
				list.add(da001);
			}
			service.addList(list);
			
			List<Dajc01VO> dalist=service.queryAllSystem();
			Assert.assertNotNull(dalist); 
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 2.相关配置.

applicationContext-dao.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
		xmlns:p="http://www.springframework.org/schema/p" 
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xmlns:tx="http://www.springframework.org/schema/tx"
		xmlns:context="http://www.springframework.org/schema/context"  
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
	<!-- DAO -->
	<bean id="dajc01DAO" class="com.dengliang.zeus.webdemo.dao.Dajc01DAO" parent="zeusdaoSupport"/>
</beans>

 applicationContext-service.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">

	<!-- BIZ -->
	<bean id="dajc01Service" class="com.dengliang.zeus.webdemo.services.impl.Dajc01Service">
		<property name="dajc01DAO" ref="dajc01DAO" />
	</bean>
	
</beans>

 applicationContext-Master-Slave.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context.xsd 
		http://www.springframework.org/schema/aop
		http://www.springframework.org/schema/aop/spring-aop.xsd
		http://www.springframework.org/schema/tx
		http://www.springframework.org/schema/tx/spring-tx.xsd ">

	 <bean id="parentDataSource" class="com.alibaba.druid.pool.DruidDataSource"
		destroy-method="close">
		<!-- 配置初始化大小、最小、最大 -->
		<property name="initialSize" value="20" />
		<property name="minIdle" value="20" />
		<property name="maxIdle" value="30" />
		<property name="maxActive" value="50" />
		<!-- 配置获取连接等待超时的时间 -->
		<property name="maxWait" value="0" />
		<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
		<property name="timeBetweenEvictionRunsMillis" value="60000" />
		<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
		<property name="minEvictableIdleTimeMillis" value="300000" />
		<property name="validationQuery" value="SELECT 'x'" />
		<property name="testWhileIdle" value="true" />
		<property name="testOnBorrow" value="false" />
		<property name="testOnReturn" value="false" />
		<property name="removeAbandoned" value="false" />
		<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
		<property name="poolPreparedStatements" value="true" />
		<property name="maxPoolPreparedStatementPerConnectionSize"
			value="20" />
			<property name="filters" value ="stat,wall"></property>
	 </bean>
     
     <bean id="master" parent="parentDataSource" destroy-method="close">
		<property name="url" value="jdbc:oracle:thin:@10.68.2.23:1521/erpdb" />
		<property name="username" value="jlerp_db" />
		<property name="password" value="jlerp_db" />
	</bean>	
	 <bean id="slave" parent="parentDataSource" destroy-method="close">
		<property name="url" value="jdbc:oracle:thin:@10.68.2.23:1521/erpdb" />
		<property name="username" value="jlerp_f" />
		<property name="password" value="fjlerp" />
	</bean>	
	<!-- zeus多数据源    -->
	<bean id="zeusDynamicDataSource" class="com.dengliang.zeus.framework.jdbc.ds.DynamicDataSource">
		<property name="targetDataSources">
			<map key-type="java.lang.String">
				<entry value-ref="master" key="master"></entry>
				<entry value-ref="slave" key="slave"></entry>
			</map>
		</property>
		<!-- 默认使用读的数据源 -->
		<property name="defaultTargetDataSource" ref="slave"></property>
	</bean>
	<!--daoSupport-->
	<bean id="zeusdaoSupport" class="com.dengliang.zeus.framework.dao.ZeusDaoSupport">
		<property name="dataSource" ref="zeusDynamicDataSource"/>
	</bean>
	<bean id = "transactionManager" class="com.dengliang.zeus.framework.jdbc.ds.DbDataSourceTransactionManager">
    	<property name="dataSource" ref="zeusDynamicDataSource" />
      </bean>
      
    <!-- 声明式事务配置 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="do*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="del*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="save*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="add*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="begin*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="end*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="update*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="modify*" propagation="REQUIRED" rollback-for="Throwable, Exception, RuntimeException"/>
			<tx:method name="query*" propagation="NOT_SUPPORTED"/>
			<tx:method name="load*" propagation="NOT_SUPPORTED"/>
			<tx:method name="find*" propagation="NOT_SUPPORTED"/>
			<tx:method name="*" read-only="true" propagation="SUPPORTS" />
		</tx:attributes>
	</tx:advice>
	
	<!-- service切面 -->
	<aop:config>
		<aop:pointcut expression="execution(* com.dengliang.zeus..services.*.*(..))" id="pointCut" />
		<aop:advisor  pointcut-ref="pointCut" advice-ref="txAdvice"/>
	</aop:config>
	


	
</beans>

 

 

代码跑过,达到读写分离要求,

3.读写分离的原理,

就是DbDataSourceTransactionManager.java类.事务管理类

默认数据源是只读,在需要事务的时候,让多数据源切换到主库上,他是线程安全的.

package com.dengliang.zeus.framework.jdbc.ds;

import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionDefinition;
/**
 * 事务管理
 * @author 100755_邓亮 2014年1月1日
 *
 */
public class DbDataSourceTransactionManager  extends DataSourceTransactionManager{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1749133882378388130L;
	private static final String Master="master";
	@Override
	protected void doBegin(Object transaction, TransactionDefinition definition) {
		// TODO Auto-generated method stub
		DbContextHolder.setDbNum(Master);
		super.doBegin(transaction, definition);
	}
}

 

 

分享到:
评论

相关推荐

    经过测试的zeus/zbot代码

    首先,“经过测试,可编译,可利用”这一点表明,此代码不仅是一个理论上的样本,而是可以直接用于实践的工具。这为我们提供了分析恶意软件行为、了解其工作机制的宝贵机会,进一步加强了我们的防御能力。然而,值得...

    zeus -- the infamous Zeus crimeware kit

    "The source code to the infamous Zeus crimeware kit, which has been sold on underground forums for years, has been leaked and is now available for anyone to see if they know where to look. Security ...

    zbot/zeus源代码-测试可用

    在IT安全领域,"zbot" 和 "zeus" 是两个非常重要的术语,它们关联着一种高度复杂的恶意软件家族。本文将深入探讨zbot/Zeus源代码的相关知识点,包括其功能、工作原理以及安全应对策略。 zbot,也被称为Zeus,是一款...

    ZeuS 2.0.8.9.rar

    ZeuS 2.0.8.9.rar 完整版源码

    zeus安装部署全套资料

    7. **验证运行**:通过Web界面检查Zeus是否正常运行,测试调度功能。 三、Zeus关键组件解析 1. **Scheduler**:负责任务的调度,根据预设的策略分配资源和时间窗口。 2. **Executor**:执行调度器分配的任务,与...

    OD吾爱破解专版 加zeus插件

    吾爱破解专版,插件也比较齐全,添加了Zeus大神的脱VMP脚本

    zeus开放源码

    Zeus通常用于网络安全研究,特别是对于渗透测试和漏洞扫描。下面,我们将深入探讨Zeus源码的相关知识点。 1. **源码开放的意义**: 开放源码意味着任何人都可以访问、分析和改进软件的代码。这对于开发者和安全...

    Go-ZEUS这是一个现代化的构建系统

    **Go-ZEUS:现代化构建系统的深度解析** Go-ZEUS是一个创新的构建系统,它在Go语言的生态系统中提供了一种高效、便捷的开发体验。这个系统的设计目标是简化项目构建过程,提升开发效率,同时也注重用户体验,通过...

    ZeuS 2.0.8.9

    Zeus:是恶意程序工具包,是臭名昭著但名声卓著的黑客工具包。

    专杀工具Zbot或Zeus专杀.zip

    在IT安全领域,Zbot和Zeus是两种非常知名的恶意软件,主要针对银行和其他金融机构进行网络犯罪活动。这些恶意软件通常被用作银行木马,能够窃取用户的网上银行凭证,进行非法转账,并且可能涉及身份盗窃。专杀工具是...

    zeus.rar_.svmp壳_ZEUS脱壳_Zeus脱_vmp壳官网_vmp插件

    大牛的脱VMP壳的插件,一般的VMP壳都能脱掉

    Python库 | flask-zeus-0.2.1.tar.gz

    **Flask-Zeus** 是一个基于 **Python** 的微型框架 **Flask** 的扩展插件。这个库的主要目的是为了提供更高效、更便捷的开发体验,特别是在后端开发领域。`flask-zeus-0.2.1.tar.gz` 是这个库的一个特定版本,即...

    zeus源代码、原理及查杀

    过去横扫全球的 ZeuS 恶意程序,可说是安全威胁领域最热门的恶意程序工具套件。Zeus病毒的作者 Monstr/Slavik 将 Zeus 的原代码移交给 SpyEye 的作者 Harderman/Gribodemon 之前,Zeus 的最后一个版本为 2.0.8.9。 ...

    Zeus-Android2.rar_Only_Zitmo apk_zeus_zeus Zitmo

    【标题】"Zeus-Android2.rar_Only_Zitmo apk_zeus_zeus Zitmo" 提供的信息表明,这是一个与恶意软件Zitmo相关的Android应用样本,主要用于教育目的。Zitmo(ZeuS in the Mobile)是知名的手机银行木马,通常与桌面版...

    Go-zeus-一个非常简单和快速的HTTP路由器

    在使用Go-zeus时,首先需要引入相关的包,然后通过`zeus.New()`创建一个新的路由器实例。接着,可以通过`.Get()`, `.Post()`, `.Put()`, `.Delete()`等方法定义HTTP路由,并通过匿名函数或者自定义处理器来绑定处理...

    Immergas依玛Zeus-24-28kW使用说明书.pdf

    Immergas依玛Zeus-24-28kW使用说明书.pdf 本使用说明书旨在指导用户正确使用Immergas依玛Zeus-24-28kW锅炉,确保设备的安全运行和最佳性能。以下是本说明书的详细知识点: 清洁和维护 * 锅炉的清洁和维护是非常...

    Zeus GPR V4.0.0 探地雷达处理软件,多格式批量处理

    再者,Zeus GPR V4.0.0新增了杂波去除和层界面去除两大功能。杂波是GPR数据中常见的干扰源,它们可能来自地表反射、仪器自身噪声等,影响对地下目标的识别。现在,软件提供了专门的工具来滤除这些杂波,提升图像的...

    基于Zeus平台的Agent技术在电子商务中的应用

    基于Zeus平台的Agent技术在电子商务中的应用(论文)

    ZEUS

    ZEUS

    Immergas依玛ZEUS-SUPERIOR-28-32使用说明书.pdf

    【Immergas依玛ZEUS-SUPERIOR-28-32使用说明书】 这份使用说明书是针对Immergas依玛品牌的ZEUS-SUPERIOR-28-32型号锅炉的,旨在指导用户正确操作和维护该设备。锅炉的长期安全、性能和运行效率取决于定期的维护和...

Global site tag (gtag.js) - Google Analytics