zdal配置文件_在项目中使用分库分表中间件Zdal详解

如何构建Zdal,这篇文章主要介绍如何在传统的Java Web项目中引入Zdal,来达到分库或者分表的目的,本文是《zdal设计文档》的实战补充。

添加zdal-client依赖

在Zdal项目中有很多模块,这些模块分别有着不同的功能和角色,在zdal-doc中的《zdal设计文档》中是这么给每个模块定义的:zdal-client : 加载本地配置文件,初始化各种数据源,调整数据源的配置信息,路由规则等

zdal-datasource : 管理访问数据库连接的组件,控制app对数据库资源的使用,目前支持mysql,oracle,db2等数据库的数据访问

zdal-parser : 手工编写的高性能的方便扩展的SQL Parser,支持MySQL、Oracle,DB2等流行关系数据库的SQL Parser

zdal-rule : 在分库分表中,根据拆分字段进行选库选表的组件,基于groovy规则引擎

zdal-common : Zdal功能所用到一些公共组件类

我们在使用zdal中间件的时候其实只需要在POM中引用zdal-client即可,zdal-client已经依赖了内部其他组件,同时建议剔除掉对Spring的引用,主要是为了防止Spring版本的冲突:

com.alipay.zdal

zdal-client

0.0.1

org.springframework

spring

DataSource替换成ZdalDataSource

笔者在《分库分表技术概览》一文中总结过分库分表现在主要是两种解决方案:应用层依赖类中间件和中间层代理类中间件。Zdal属于应用层依赖类中间件,主要是通过重写JDBC接口的方式来实现的,应用层使用ORM框架并没有本质的影响,因为ORM框架底层还是用的JDBC技术来访问数据库。

在JDBC规范中主要是通过DataSource来获取数据库连接,而Zdal也提供了这样一种与以往不同的DataSource。传统项目中可能使用c3p0这种有连接池功能的DataSource,类似于这种配置:

现在Zdal中间件为了对上层尽可能的透明,尽量少的修改业务代码,把分库分表的逻辑封装在DataSource下面,对上层提供ZdalDataSource的实现,用户替换掉老的c3p0数据源即可:

这里的appName即应用项目的名字,appDsName是真实数据源的名字,dbmode的初衷是为了区分开发和生产环境(其实现在很多maven项目可以通过profile和命令行指定的方式来指定特定环境的文件,这种dbmode的方式其实作用不大),configPath是真实数据库配置和规则配置文件的基本地址。

原来的zdal代码中configPath不支持从classpath中加载,可以在ZdalConfigurationLoader中删除 File configurationFile = new File(configPath, MessageFormat.format(Constants.LOCAL_CONFIG_FILENAME_SUFFIX, appName, dbMode)) 这种检验文件是否存在的代码,因为用 java.io.File 类就要求配置文件必须是在文件系统中真实存在,而实际上配置文件可能在jar包中,并没有对应于文件系统中的文件,而且Spring加载文件的时候自己会检验文件是否存在,修改后的getZdalConfigurationFromLocal方法如下:private synchronized Map getZdalConfigurationFromLocal(String appName, String dbMode, String appDsName,

String configPath) {

List zdalConfigurationFilePathList = new ArrayList();

zdalConfigurationFilePathList.add(configPath + "/" + MessageFormat.format(

Constants.LOCAL_CONFIG_FILENAME_SUFFIX, appName, dbMode));

zdalConfigurationFilePathList.add(configPath + "/" + MessageFormat.format(

Constants.LOCAL_RULE_CONFIG_FILENAME_SUFFIX, appName, dbMode));

return loadZdalConfigurationContext(zdalConfigurationFilePathList

.toArray(new String[zdalConfigurationFilePathList.size()]), appName, dbMode);

}

这样修改后loadZdalConfigurationContext中使用FileSystemXmlApplicationContext就可以支持classpath、file前缀来加载不同协议的XML文件。

在配置文件中声明分库分表规则

zdal的配置文件主要有两个,并且默认使用了一种规则,从getZdalConfigurationFromLocal的代码中可以看出来,即 appName-dbMode-ds.xml和appName-dbMode-rule.xml ,这里的appName和dbMode要和dataSource的设置以及两个配置文件内部bean中的value保持一致。

比如笔者在Github中的fantasy项目的配置文件为fantasy-dev-ds.xml,主要用来指定物理数据源有哪些,是使用group、shard、shardfailover、shardgroup的哪种模式,内容如下:<?xml  version="1.0" encoding="GBK"?> 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

另外一个重要的文件是fantasy-dev-rule.xml,主要用来描述分库或者分表字段是哪些,是SQL语句执行的依据:<?xml  version="1.0" encoding="GBK"?> 

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

init-method="init">

return com.yuanwhy.fantasy.rule.ShardRuleParser.parserTbIndex(#id#);

 

这里的示例就是对user表分表,以用户的id为分表字段,解析的方法在 com.yuanwhy.fantasy.rule.ShardRuleParser.parserTbIndex 中,tbSuffix是resetForEachDB方式,即每个分库都有user_0、user_1表,只不过这里恰好只有一个分库;分表规则设计为id % 10的方式获取分表后缀,那么对于id为10的用户则被分配到user_0表(关于更多的分表规则的信息可以参考《zdal设计文档》)。

将fantasy项目运行之前先执行user-schema.sql初始化语句,通过访问 http://localhost:8080?id=10 运行起来后,可以从Debug信息中观察到原始的语句以及根据分表字段解析后获得的真实可执行的语句:[DEBUG]

[original sql]:SELECT id, name, age FROM user

WHERE id = ?

[master_0.user_0]:SELECT id, name, age FROM user_0

WHERE id = ?

至此,一个传统的Java Web项目就具有了分库分表的能力(这里只演示了分表,分库的道理是一样的)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287902.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 C# 隐藏 Console 窗口?

咨询区 Stefan Steiger我有一个 Console 程序&#xff0c;它主要用来重启 IIS 以及删除临时文件&#xff0c;我现在期望它启动后隐藏自身&#xff0c;我在网上找了下面这段代码做了隐藏。static void Main(string[] args) {var currentProcess System.Diagnostics.Process.Get…

Java之new一个对象简单过程

1 问题 new一个对象简单过程 2 过程 1&#xff09;类加载过程(第一次使用该类) 先看这个类有没有加载到内存&#xff0c;没有的话下面操作 &#xff08;1&#xff09;、加载&#xff1a;类加载器&#xff08;双亲委派模式&#xff09;通过全限名读取类的二进制流到jvm内部&am…

编写登陆接口

用任意一种语言实现登陆接口 作者&#xff1a;尹正杰 版权声明&#xff1a; 本篇博客仅仅用于交流学习使用&#xff0c;对一些小功能的实现&#xff0c;来练习对代码的熟练度。同时&#xff0c;本篇博客允许转载&#xff0c;用于互相交流学习&#xff0c;转载必须在博客声明原链…

php基础教程 第十步 阶段性知识补充

简 在php教程中前九步已经了解了php的一些基础知识。大多数人在了解完以上知识后脑子还是迷茫的&#xff0c;最多懂的一些我所讲解过的知识如何实现&#xff08;对象为零基础读者&#xff09;&#xff0c;如何搭建一个网站还是不知晓。没关系&#xff0c;接下来我们即将进入ph…

C#集合类型——Array、ArrayList、List 之浅谈

在学习或工作中&#xff0c;集合是经常用到的&#xff0c;可以换一句话说“无项目无集合”&#xff0c;“项目皆有集合”。它一般存储一系列数据或者将一系列数据进行相关操作。在这里先大略谈一些集合类型的相关知识用于回顾。 数组&#xff08;Array&#xff09; 数组一般只存…

CentOS Linux 系统命令之rmdir命令

在Linux中目录创建是使用mkdir&#xff0c;那有创建目录的命令自然有删除目录的命令&#xff0c;删除目录的命令是rmdir。命令格式&#xff1a;rmdir [选项] 目录参数选项&#xff1a;-p 可以递归删除&#xff0c;但是不能删除非空目录-v 显示删除过程命令实例&#xff1a;1&am…

ArcGIS实验教程——实验十三:栅格空间插值分析

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) >>> 实验前必读:《完美解决ArcGIS10.x栅格空间插值报错无法进行和导出插值栅格结果出错的问题》 一、实验描述 一般情况下采集到的数据都是以离散点的形式存在的,只有在这些采样点上才有…

Java之Callable和Runnable

1 接口定义 1) Callable接口 public interface Callable<V> {V call() throws Exception; } 2) Runnable接口 public interface Runnable {public abstract void run(); } 2 不同点和相同点 1&#xff09;相同点 都是接口&#xff0c;都可编写多线程程序&#xff…

ARM路线的投机性和欺骗性

过去十年里&#xff0c;在自主CPU取得了长足进步的同时&#xff0c;一批企业积极引进英特尔、AMD、VIA、IBM、ARM、高通等公司的技术&#xff0c;或是成立合资公司&#xff0c;相对于X86、Power等处理器很容易被识别为技术引进CPU&#xff0c;ARM的欺骗性则要强很多&#xff0c…

营业执照在线一键生成_如何在线制作证件照?证件照一键生成的方法

如何在线制作证件照&#xff1f;每一年的毕业季也是就业季&#xff0c;几百多万的大学生都面临着找工作&#xff0c;而在工作之前必须准备好证件照&#xff0c;这样方便参加面试和入职。随着市场需求的逐步扩大&#xff0c;很多便捷的软件和网站都被设计出来了&#xff0c;比如…

php基础教程 第十一步 面向对象

面相对象 面向对象程序设计简称OOP&#xff08;Object-oriented programming&#xff09;。是一种类型的抽象&#xff0c;或者说是一种类型以编码的方式进行描述。概念上理解并不能直观的说明问题&#xff0c;以下将会有示例为读者直观的感受面向对象。 类代表一个类别&#…

Hype3使用体验

优点 上手简单&#xff0c;会操作常规软件操作的话一天之前可以掌握基本功能&#xff1b;屏幕适配方便&#xff0c;通过布局&#xff08;或者成为断点&#xff09;来适配不同屏幕分辨率&#xff1b;动画通过时间线方式来设定&#xff0c;并且多一行属性配置&#xff0c;而且可以…

ArcGIS实验教程——实验十四:空间数据库的建立

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 1、GeoDataBase描述 地理数据库(空间数据库)GeoDataBase是一种面向对象的数据模型,它对于地理特征的表达更接近于我们对现实世界的认识。 它建立在标准的关系数据库(RDBMS)基础…

Android NDK开发Crash错误定位[转]

使用 ndk-stack 的时候需要你的 lib 编译为 debug版的&#xff0c;通常需要下面的修改&#xff1a; 1. 修改 android.mk&#xff0c;增加&#xff0c;为 LOCAL_CFLAGS 增加 -g 选项 2. 修改 application.mk&#xff0c;增加 APP_OPTIM : debug 3. nkd-build -B 4. 从 obj/local…

Java之多线程里面的锁理解以及synchronized与Lock的区别

一、宏观的说下锁的分类 1&#xff09;锁分为乐观锁、悲观锁 悲观锁认为对于同一个数据的并发操作&#xff0c;一定是会发生修改的&#xff0c;哪怕没有修改&#xff0c;也会认为修改。因此对于同一个数据的并发操作&#xff0c;悲观锁采取加锁的形式。悲观的认为&#xff0c…

实验报告类与对象水井问题_物业设施设备巡检检查对象、周期和频次

点击上方“物业精英俱乐部”&#xff0c;关注公众号,中国物业管理行业精英联盟&#xff0c;中国百强物业企业精英学习平台。来源&#xff1a;百度文库版权归原创作者所有一巡检对象、周期和频次所谓巡检&#xff0c;并不是说将大大小小的所有物业设施都列入巡检范围&#xff0c…

龙芯2K1000LA处理器流片成功,龙芯业务全面转向LoongArch架构

2022年4月底&#xff0c;龙芯2K1000处理器完成了改版芯片&#xff08;代号龙芯2K1000LA&#xff09;的功能和性能测试&#xff0c;正在开展用户试用。龙芯2K1000LA在实现与原有版本2K1000引脚和接口兼容的基础上&#xff0c;处理器核更新为基于龙芯自主指令系统架构LoongArch&a…

php基础教程 第十一步 面向对象补充

继承 上一节中学习了php类&#xff0c;以及类方法、类成员变量相关的一些知识&#xff0c;接下来开始学习php类中的继承。本节是上一节的补充。&#xff08;其实也就是为了保持日更随便发的一篇文&#xff09; 开始 php继承是继承与父类的所有属性&#xff0c;就像你继承了你…

ArcGIS实验教程——实验十五:拓扑关系创建与编辑

ArcGIS实验视频教程合集:《ArcGIS实验教程从入门到精通》(附配套实验数据) 一、实验描述 1、拓扑关系的概念 拓扑关系是指满足拓扑几何学原理的各空间数据间的相互关系。即用结点、弧段和多边形所表示的实体之间的邻接、关联、包含和连通关系。如:点与点的邻接关系、点与面…

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

1、 首先要搞明白什么叫执行计划&#xff1f; 执行计划是数据库根据SQL语句和相关表的统计信息作出的一个查询方案&#xff0c;这个方案是由查询优化器自动分析产生的&#xff0c;比如一条SQL语句如果用来从一个 10万条记录的表中查1条记录&#xff0c;那查询优化器会选择“索引…