支持c#的分表分库组件-Ctrip DAL

简介

Ctrip DAL是携程框架部开发的数据库访问框架,支持代码生成和水平扩展。其由携程技术中心框架部DAL团队开发,历经3年不断打磨,并在长期的实际使用中基于大量的用户反馈不断优化。

开源范围包括代码生成器,Java客户端和C#客户端。

背景

随着企业规模扩张和业务量的急剧增加,作为系统核心的数据库相关开发也会经历一个由单一团队发展为多团队;由单机扩张到集群;由单数据库发展为多数据库;由采用单一数据库产品到多种数据库产品并存的过程。伴随这一过程的是如何管理数据库扩展,如何规范数据库访问,如何保护数据库投资,如何应对访问量增加,如何预防安全问题等一系列挑战。作为中国在线旅游行业的翘楚,携程也曾经面对同样困扰。为了应对这些挑战,实现企业10倍速发展,携程开发了具有自己特色的数据库访问框架Ctrip DAL。

Ctrip DAL支持流行的分库分表操作,支持Java和C#,支持Mysql和MS SqlServer。使用该框架可以在有效地保护企业已有数据库投资的同时,迅速,可靠的为企业提供数据库访问层的横向扩展能力。整个框架包括代码生成器和客户端。工作模式是使用代码生成器在线生成代码和配置,通过DAL客户端完成数据库操作。生成器具有丰富的向导指引,操作简单清晰,即可以批量生成标准DAO,也可以在方法级别定制数据库访问。客户端则可以简单的通过标准的maven方式添加依赖。

Ctrip DAL与一般数据库框架最大的不同是从企业跨部门的角度,统一管理数据库相关资源。通过部署代码生成器,企业可以做到有效的管理全公司的DAL开发团队,明确数据库归属和定制数据库访问。通过代码生成器生成的标准DAO代码与客户端配合使用,可以大幅提高工作效率,保证代码质量。解决了业内常见的伴随业务成长而带来的系统维护困难,开发效率低下,代码风格五花八门,代码质量参差不齐等痛点问题。

代码生成器

代码生成器允许用户创建Dal团队,组织开发人员,管理数据库,创建DAO并生成代码和配置。与一般基于JDBC driver的DB sharding产品不同的是,代码生成器生成的代码和配置可以直接拿来实用,完全无需用户写一行代码和配置。做到了只需开发人员关心业务逻辑,而把繁琐的数据库相关的编码和配置任务全部交给DAL。由于Ctrip DAL完全在DAO这层工作,也没有什么这种SQL语句不支持,那种SQL语句不能用的情况。同时传递hints的方式也非常自然,每个方法都自带hints的接口,需要DAL额外做什么可以直接按给定的已有名字来设置,无需改写原始的sql来添加怪异的注释。

客户端简介

客户端配合代码生成器生成的代码来完成用户的数据库访问操作。通过Dev和QA两方面双重自动化测试来保障质量,覆盖率达到99%,并经过生产实际实用的的长期严格检验。为了适应不同公司的实际情况,DAL客户端定义了丰富的扩展接口,覆盖了从数据源管理,数据库映射,连接串读取到自定义访问方式等等方方面面的功能。同时为了方便系统监控还内置了系统状态,日志和统计模块。

C#客户端 API列表

以下这些API位于BaseDao类中 方法族说明:除了所示的方法之外,至少还包含一个带有IDictionary hints参数的重载方法。

注意:增删改均适用的API被归类至Update系列


CreateObject Insert<T>(T obj) where T : class, new() 方法族
Object InsertByComplexPk<T>(T obj) where T : class, new() 方法族
Boolean BulkInsert<T>(IList<T> list) where T : class, new() 方法族
Retrieve
IQuery<T> GetQuery<T>() where T : class, new()
IList<T> GetAll<T>() where T : class, new() 方法族
IList<T> SelectListOfSingleField<T>(String sql) 方法族
IList<T> SelectList<T>(String sql) where T : class, new() 方法族
IList<T> SelectList<T>(IQuery query) where T : class, new() 方法族
IList<T> SelectListByAdapter<T>(String sql) where T : class, new() 方法族
IList<T> SelectListByAdapter<T>(IQuery query) where T : class, new() 方法族
IList<T> ExecListBySp<T>(String procName, StatementParameterCollection parameters) where T : class, new() 方法族T GetByKey<T>(Object key) where T : class, new() 方法族T SelectFirst<T>(String sql) where T : class, new() 方法族T SelectFirst<T>(IQuery query) where T : class, new() 方法族T VisitDataReader<T>(String sql, Func<IDataReader, T> callback) 方法族T VisitDataReaderBySp<T>(String procName, StatementParameterCollection parameters, Func<IDataReader, T> callback) 方法族DataTable SelectDataTable(String sql) 方法族DataTable ExecDataTableBySp(String procName, StatementParameterCollection parameters) 方法族DataSet SelectDataSet(String sql) 方法族DataSet SelectDataSet<T>(IQuery query) where T : class, new() 方法族DataSet ExecDataSetBySp(String procName, StatementParameterCollection parameters) 方法族IDataReader SelectDataReader(String sql) 方法族IDataReader ExecDataReaderBySp(String procName, StatementParameterCollection parameters) 方法族Object ExecScalar(String sql) 方法族Object ExecScalarBySp(String procName, StatementParameterCollection parameters) 方法族UpdateInt32 Update<T>(T obj) where T : class, new() 方法族IUpdatePartial<T> GetUpdatePartially<T>() where T : class, new()Int32 UpdatePartially<T>(IUpdatePartial<T> partially, T obj) where T : class, new() 方法族Int32 ExecNonQuery(String sql) 方法族void ExecSp(String procName, StatementParameterCollection parameters) 方法族DeleteInt32 Delete<T>(T obj) where T : class, new() 方法族

https://github.com/ctripcorp/dal

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

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

相关文章

万万想不到:吸烟的辐射量比原子弹爆炸点还厉害!

全世界只有3.14 %的人关注了青少年数学之旅近日&#xff0c;外国视频网站上一段关于世界上辐射最高地点的短片火了起来。片中&#xff0c;一位外国小哥亲身探秘了那些广为人知的辐射地点如切尔诺贝利、福岛核电站等&#xff0c;并且给出了究竟哪里的辐射最高的结论。什么是辐射…

伟大架构师的秘密

自我评估• 您当前的项目是否应用了抽象层次&#xff1f; • 层次是否定义完善&#xff1f; • 项目团队是否很好地理解了这些层次&#xff1f; • 如果复杂性在一个层次中变得过大&#xff0c;团队是否将其分离到视图中呢&#xff1f; • 团队是否在层次间保持一致性&…

网站开发标准

Web 开发的分散性和交互性&#xff0c;决定了 Web 开发必须遵从一定的开发规范和技术约定&#xff0c;只有每个开发人员都按照一个共同的规范去设计、沟通、开发、测试、部署&#xff0c;才能保证整个开发团队协调一致的工作&#xff0c;从而提高开发工作效率&#xff0c;提升工…

solr 配置mysql数据源_solr data-config.xml配置文件的见解mysql数据源

陆续完善&#xff1a;检查一下dataSource中的url一般都能用。如果不能用 将后面的编码格式去掉 试试看data-config.xml配置文件deltaImportQuery"select id,%Y-%m-%d) last_modified,id) as char) as dockey from product where cast(concat(p,id) as char)${dih.delta.do…

视频专辑:Hibernate 视频

为什么80%的码农都做不了架构师&#xff1f;>>> 专辑&#xff1a;Hibernate 视频 简介:郭宏志 Hibernate从入门到深入,郭宏志气主讲 1 郭宏志 Hibernate 01 简介 2013-10-29 13:50 | 播放(11) | 评论(0) | 时长:1:17:58 2 郭宏志 Hibernate 02 配置 2013-10-29…

Subversion之路--实现精细的目录访问权限控制(v1.0 更新于2006.12.05)(二)

深入本章将详细介绍前一章所涉及的两个配置文件&#xff0c; svnserve.conf 和 authz.conf&#xff0c;通过对配置逐行的描述&#xff0c;来阐明其中的一些细节含义。除此之外的其他配置、安装等内容&#xff0c;不是本文重点&#xff0c;读者若有什么疑问&#xff0c;请参考后…

未能在给定的程序集中找到任何适合于指定的区域性(或非特定区域性)的资源解决办法...

今天在给一个程序加入ImageList的时候碰到了这样的运行错误&#xff1a; 未能在给定的程序集中找到任何适合于指定的区域性(或非特定区域性)的资源。请确保已将“frmMain.resources”正确嵌入或链接到程序集“XXX”。 baseName: yyy locationInfo: xxx.yyy resource file name:…

人体的血管连起来竟能绕地球两圈!?| 今日最佳

世界只有3.14 % 的人关注了青少年数学之旅你知道怎么回复吗&#xff1f;这五花肉真。。白啊来自唐代的敦煌文书。。。《放妻书》好像发现了点什么不可告人的秘密如果人体的血管首尾相连总长度约为96560.64千米大概可以绕地球2.5圈密集恐惧症表示已经qu世了&#xff08;图源网络…

云原生系统之弹性模式

大纲1.云原生系统的弹性模式resiliency pattern 1.1 服务故障的雪崩效应 1.2 回应之前云原生--弹性请求的疑问&#xff1f;2. 弹性模式&#xff1a;作用在下游请求消息上3. 短期中断的响应码4. Polly经典策略5. Golang 断路器模式德国哲学家尼采说过&#xff1a;那些杀…

终端编译opengl程序编译运行_ubuntu编译opengl和demo之二(glfw版本)

[TOC]1、安装GL和glut等sudo apt-get install mesa-common-dev libgl1-mesa-dev libglu1-mesa-devsudo apt-get install freeglut3-devsudo apt-get install build-essential gdb subversionsudo apt-get install automake autoconf libtoolsudo apt-get install libgtk2.0-dev…

js null加法的处理

首先看一段JS高级编程中&#xff0c;有关加法()操作符的解释&#xff1a;一个简单的测试&#xff1a;alert(3 null); // 3 alert(3 null); // 3null可见对于null的处理&#xff0c;并不是简单的取String。ecma262的定义如下&#xff1a;对第7、8步骤的理解&#xff1a;7. 如果…

符合WEB标准的div+css导航下拉菜单

<html xmlns"http://www.w3.org/1999/xhtml"lang"zh-CN"><head><meta http-equiv"Content-Type"content"text/html; charsetgb2312"/><title>52css.com - css菜单演示</title><style type"text…

深入DataGrid分页样式实例

DataGrid提供了分页功能&#xff0c;不过看上去功能有限&#xff0c;但是我们可以通过DataGrid的一些属性来获取状态以及增加首页、尾页功能按钮。这里没有使用DataGrid的自定义分页功能&#xff0c;如果在速度效率不是很讲究的情况下&#xff0c;由DataGrid自己管理分页还是不…

dotnet中的counter

打造一个完善的软件产品&#xff0c;准确完整实现业务是第一步&#xff0c;再有就是有优秀的性能&#xff0c;稳定的运行。为了能量化性能指标&#xff0c;需要利用工具&#xff0c;来收集这些数据&#xff0c;以便对产品作出代码级调整。先说一下.net中带一个全局工具&#xf…

与殿堂级大师隔空对话——一张纸是怎么限制了我们的想象力

▲ 点击查看七天假期&#xff0c;熊孩子在家捣乱的情况实在是太多啦&#xff0c;就一眨眼的功夫&#xff0c;满地的积木&#xff0c;到处都有&#xff0c;还有到处都是的纸张碎片&#xff0c;真真是十分的头疼&#xff01;在蚊子小时候&#xff0c;玩具远不如现在丰富&#x…

Redis学习手册(String数据类型)

2019独角兽企业重金招聘Python工程师标准>>> 一、概述&#xff1a; 字符串类型是Redis中最为基础的数据存储类型&#xff0c;它在Redis中是二进制安全的&#xff0c;这便意味着该类型可以接受任何格式的数据&#xff0c;如JPEG图像数据或Json对象描述信息等。…

获取客户端浏览器信息

alert("appVersion 获取浏览器运行的平台和版本。"myNavigator.appVersion);alert("appCodeName 获取浏览器的代码名称:" myNavigator.appCodeName);alert("appMinorVersion 获取应用程序的次版本值。"myNavigator.appMinorVersion); alert(&quo…

DDD与批量操作

原文链接&#xff1a;https://enterprisecraftsmanship.com/posts/ddd-bulk-operations/将批量操作与领域驱动设计相结合是一个困难的问题。在这篇文章中&#xff0c;我们将看看为什么会这样&#xff0c;并讨论如何结合两个。本文也是对读者提问的回应。这个问题包含一个有趣的…

检查坏道右键单击盘符/属性/工具中的查错。

检查坏道右键单击盘符/属性/工具中的查错。 7.windowsXP系统经常出现错误提示 答&#xff1a;XP系统经常提示是否将错误报告发送到微软公司&#xff0c;有两个选项&#xff1a;发送或不发送&#xff0c;关闭的方法依此是&#xff1a; 进入&#xff1a;开始菜单-----设置---控制…

crt脚本 js 在_crt脚本 js 在_使用SecureCRT自带的脚本录制功能。

建立登录会话并登录服务器开始录制脚本Script -> Start Recording Script输入登录的命令LANGen_US.UTF-8su - usernamePassword:结束录制Script -> Stop Recording Script把脚本存成你喜欢的名字&#xff0c;例如Script.vbs设置登录脚本选中会话&#xff0c;右键Proper…