micro-datasource分布式事务数据源
事务可以分为三个等级:
1,强一致性
事务中未提交的数据不会被其他事务获取,但本事务中可以查看未提交数据。
常用的本地事务就属于强一致性事务。
2,一般一致性
事务中未提交的数据不会被其他事务获取,但重新获取的相同事务编号的分布式事务中也无法查看未提交数据。
两阶段提交时,不同的进程中使用分布式事务,采用独立分布式资源管理器时,属于一般一致性。
3,最终一致性
通过消息发送或重试方式保证不用进程中最终数据一致。
可以看出,跨系统的两阶段提交不能实现强一致性。
使用micro-datasource可以实现跨系统强一致性。
应用原理:
使用micro-datasource数据源使事务与线程解耦,通过groupid在其他线程进行事务提交或回滚。
多个系统需要统一提交时,通过activemq发送提交消息(含有groupid),各系统收到消息后进行统一提交或回滚。
micro-datasource数据源与Mybatis或hibernate或jdbcTemplate等orm框架可以整合使用
原理是micro-datasource包中提供了路由数据源方案,通过aop动态切换普通数据源和分布式数据源
使用普通数据源时仍接受传统事务管理器管理
jar包下载:
需要使用nh-micro-datasource.jar
依赖log4j.jar\org.springframework.beans.jar\org.springframework.aop.jar\org.springframework.core.jar\aopalliance.jar
<dependency> <groupId>com.github.jeffreyning</groupId> <artifactId>nh-micro-datasource</artifactId> <version>1.0.0-RELEASE</version> </dependency>
|
jms通知功能需要使用nh-micro-datasource-msg.jar
依赖geronimo-j2ee-management.jar/geronimo-jms.jar/activemq-core.jar
<dependency> <groupId>com.github.jeffreyning</groupId> <artifactId>nh-micro-datasource-msg</artifactId> <version>1.0.0-RELEASE</version> </dependency>
|
分布式数据源配置样例:
<!– micro分布式数据源 --> <bean id="local_xa_dataSource" class="com.nh.micro.datasource.MicroXaDataSourceFactory" factory-method="createDataSource" init-method=“init”> <!– 多个micro分布式数据源实例时可设置不同的dataSourceId 默认为default --> <constructor-arg value=“default”/> <property name="url" value="${database.url}" /> <property name="username" value="${database.user}" /> <property name="password" value="${database.password}" /> <property name="minSize" value=“5" /> <property name="maxSize" value=“20" /> <property name=“dirverClassName” value=“com.mysql.jdbc.Driver” /> <property name=“validationQuery” value=“select 'x' from dual” /> </bean> <!-- micro动态切换数据源配置 --> <bean id="dynamic_xa_dataSource" class="com.nh.micro.datasource.MicroDynamicDataSource" > <property name="targetDataSources"> <map key-type="java.lang.String"> <!– 设置目标数据源为分布式事务数据源 --> <entry key="local_xa_dataSource" value-ref="local_xa_dataSource"></entry> </map> </property> <!-- 默认目标数据源为主库普通数据源 --> <property name="defaultTargetDataSource" ref="dataSource"/> </bean> <!-- define the Mybatis SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!– Mybatis引入micro动态切换数据源实例 --> <property name="dataSource" ref="dynamic_xa_dataSource"/> <property name="typeAliasesPackage" value="foo.model"/> </bean> <aop:config> <aop:pointcut id="testPointcut" expression="execution( * foo.repository.TestRep.*(..))"/> <aop:advisor pointcut-ref="testPointcut" advice-ref="dataSourceAdvice"/> </aop:config>
|
设置切换分布式数据源的aop:
<!– 设置service层或dao层aop用来动态切换数据源 --> <bean class="com.nh.micro.datasource.DataSourceAdvice" id="dataSourceAdvice"> <property name="readMethodList"> <list> </list> </property> </bean> <aop:config> <aop:pointcut id="testPointcut" expression="execution( * foo.repository.TestRep.*(..))"/> <aop:advisor pointcut-ref="testPointcut" advice-ref="dataSourceAdvice"/> </aop:config>
|
代码中通过注解设置哪些方法需切换为分布式数据源:
//Mybatis的Dao接口代码示例,使用@ChangeDataSource注解决定是否切换为分布式事务数据源 package foo.repository; import java.util.Map; import com.nh.micro.datasource.ChangeDataSource; public interface TestRep { @ChangeDataSource(name="local_xa_dataSource") public int updateInfo(Map paramMap); @ChangeDataSource(name="local_xa_dataSource") public int insertInfo(Map paramMap); }
|
执行过程样例:
//设置xaGroupId和xaBranchId MicroXaDataSource.setXid(groupId,branchId); //从Spring中取dao接口对象调用相关业务方法 TestRep testRep=MicroContextHolder.getContext().getBean("testRep"); Map paramMap=new HashMap(); paramMap.put("meta_key", metaKey); paramMap.put("id", id); testRep.insertInfo(paramMap); //可以在其他的线程中根据xaGroupId提交或回滚分布式事务 MicroXaDataSourceFactory.getDataSourceInstance(“default”).commit(groupid);
|
设置事务提交消息接收和发送对象:
//设置activemq发送对象,发送commit/rollback命令给其他系统 <bean class="com.nh.micro.datasource.msg.MicroDataSourceJmsReceiver" init-method="init"> <property name="jmsUrl" value="tcp://10.10.xx.xx:61616"></property> </bean> //通知其他系统提交的命令是(groupid为参数) //commit MicroDataSourceJmsSender.sendXaMsg("commit", groupId); //rollback MicroDataSourceJmsSender.sendXaMsg(“rollback", groupId); //设置activemq接收对象,接收从其他系统发来的commit/rollback命令,MicroDataSourceJmsReceiver内部收到消息后会负责根据groupid提交或回滚事务 <bean class="com.nh.micro.datasource.msg.MicroDataSourceJmsSender"> <property name="jmsUrl" value="tcp://10.10.xx.xx:61616"></property> </bean> |

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
shell脚本:监控HTTP服务的状态(测试返回码)
#定义函数check_http: #使用curl命令检查http服务器的状态 #-m设置curl不管访问成功或失败,最大消耗的时间为5秒,5秒连接服务为相应则视为无法连接 #-s设置静默连接,不显示连接时的连接速度、时间消耗等信息 #-o将curl下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容) #-w设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码 #!/bin/bash #Author:丁丁历险(Jacob) #设置变量,url为你需要检测的目标网站的网址(IP或域名) url=http://192.168.4.5/index.html #定义函数check_http: #使用curl命令检查http服务器的状态 #-m设置curl不管访问成功或失败,最大消耗的时间为5秒,5秒连接服务为相应则视为无法连接 #-s设置静默连接,不显示连接时的连接速度、时间消耗等信息 #-o将curl下载的页面内容导出到/dev/null(默认会在屏幕显示页面内容) #-w设置curl命令需要显示的内容%{http_code},指定curl返回...
- 下一篇
MySQL数据库root账户密码忘记两种处理方法(保有效)
方法1: 1.停止MySQL服务 # kill `cat /var/run/mysqld/mysqld.pid` 或者 # pkill mysqld 2.创建一个密码赋值语句的文本文件 # vi mysql-init ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass!6'; 在加载授权表之前重置密码。 3.使用—init-file选项启动MySQL服务 # mysqld --init-file=mysql-init --user=mysql & 4.删除文本文件,使用新密码连接MySQL # rm -f mysql-init # mysql -uroot -p 'MyNewPass!6' 5.停止MySQL服务并正常启动 # kill `cat /var/run/mysqld/mysqld.pid` # systemctl start mysqld 方法2: 1.停止MySQL服务 # kill `cat /var/run/mysqld/mysqld.pid` # pkill mysqld 2.使用--skip-gra...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- MySQL8.0.19开启GTID主从同步CentOS8
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker快速安装Oracle11G,搭建oracle11g学习环境