换一种思维实现数据库切换

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,独享型 2核4GB
简介:

一、理论:

          这里例举OracleDAL和SqlServerDAL。

          将OracleDAL的dll名称设置为DAL.OracleDAL.dll,将SqlServerDAL名称设置为DAL.SqlServerDAL.dll,但是两者内部的类名、方法名以及命名空气名称完全一样。也就是说,比如class:OracleDAL有一个Insert方法,那么就将他的类名称改成DAL,Insert名称不变(如果标示了如OracleInsert,最好改成与数据库不相关的名称);而class:SqlServerDAL也同样将类名改成DAL,外部方法需要和OracleDAL一直。这样一来,我们同时引用两个dll会报错,我们只能引用一个dll,也就是我们切换数据库的时候只用替换一下dll就可以了,不必用反射来了,由此大家也能看到冗余。但是仍然可以优化,理想的情况下,可以抽出一个中间的dll(DAL.dll)来封装两者相同的代码以及标准接口,而DAL.OracleDAL.dll和DAL.SqlServerDAL.dll都依赖并遵循于DAL.dll,这样能规范约束并且减少冗余。

二、实施:

          通过反射达到无缝切换:更改数据库连接字符串+更改表示当前数据库的配置文件(一般都是如此做法)。

          通过标准+冗余到无缝切换:更改数据库连接字符串+更换dll。

三、简单示例:

          1.     DAL.Oracle.dll

               1.1     OracleDAL.cs

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Data.OracleClient;

using  Model;

namespace  Data
{
    
// public class OracleDAL
     public   class  DAL
    {
        
public   void  Insert(IModel model)
        {
            OracleCommand cmd 
=   new  OracleCommand( " connectionstring " );
            cmd.CommandText 
=   " Insert into test(column1,column2) values(@column1,@column2) " ;
            
// cmd.Parameters
            cmd.ExecuteNonQuery();
        }
    }
}

          2.     DAL.SqlServer.dll

               2.1     SqlServerDAL.cs

using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Data.SqlClient;

using  Model;

namespace  Data
{
    
// public class SqlServerDAL
     public   class  DAL
    {
        
public   void  Insert(IModel model)
        {
            SqlCommand cmd 
=   new  SqlCommand( " connectionstring " );
            cmd.CommandText 
=   " Insert into test(column1,column2) values(@column1,@column2) " ;
            
// cmd.Parameters
            cmd.ExecuteNonQuery();
        }
    }
}

          3.     业务层/客户端调用代码

     using  Data;

    
public   class  Program
    {
        
static   void  Main( string [] args)
        {
            IModel model 
=   new  Model();
            
new  DAL().Insert(model);
        }
    }
   

四.     代码说明和分析

               3.1     代码不能直接执行,主要是为了表达本文的意图,希望你理解后自己再写具体的代码试试看。

               3.2     需要注意的是1和2分别是两个dll,类的文件名不同,但是类名和空间名称是一样的,所以项目中只能存在一个。

               3.3     需要注意的是,Insert在两个dll里面方面名称、类名、命名空间是一样的,但是方法内部实现并不是一样的!!

               3.4     如果我现在进行数据库切换,把DAL.SqlServer.dll和DAL.Oracle.dll两个之间任意的替换掉业务层调用方是不用更改任何代码的!!因为类名、命名空间、方法都没有变!!

 

小结

     由此可见,对于业务层,由于两者命名空间、类名、方法名一致,在更换dll的时候是无需改动代码的,并且性能也是要优于通过反射来实现数据库切换的,而且具有更强的可扩展性和随意性,可将现有的不跨数据库的代码改改就可以下次复用了,在写其中任何一个针对数据库的dll的时候只要根据标准,就无需考虑数据库兼容的问题了。

     但是需要注意的是,在我们需要强类型(如SqlDataReader、SqlCommand)、直接执行SQL语句的时候就需要和其他程序一样需要仔细设计了,比如对于SqlDataReader,不直接进行返回,或者给方法返回加一个泛型支持,并约束泛型调用类必须也继承IDataReader接口,或者干脆直接返回一个Hashtable或Dictionary;而SQL语句可以对应的建立一个SQL语句的工厂类,传一个结构体过来,然后根据结构体来生成SQL语句,而不要直接写SQL语句来执行。

本文转自博客园农民伯伯的博客,原文链接:换一种思维实现数据库切换,如需转载请自行联系原博主。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
7:数据库设计思维-MySQL
7:数据库设计思维-MySQL
44 0
|
存储 缓存 运维
后端思维之数据库性能优化方案
毫不夸张的说咱们后端工程师,无论在哪家公司,呆在哪个团队,做哪个系统,遇到的第一个让人头疼的问题绝对是数据库性能问题。如果我们有一套成熟的方法论,能让大家快速、准确的去选择出合适的优化方案,我相信能够快速准备解决咱么日常遇到的80%甚至90%的性能问题。   从解决问题的角度出发,我们得先了解到问题的原因;其次我们得有一套思考、判断问题的流程方式,让我们合理的站在哪个层面选择方案;最后从众多的方案里面选择一个适合的方案进行解决问题,找到一个合适的方案的前提是我们自己对各种方案之间的优缺点、场景有足够的了解,没有一个方案是完全可以通吃通用的,软件工程没有银弹。
1669 6
后端思维之数据库性能优化方案
|
存储 缓存 运维
后端思维之数据库性能优化方案(二)
后端思维之数据库性能优化方案(二)
1121 2
后端思维之数据库性能优化方案(二)
|
存储 缓存 算法
后端思维之数据库性能优化方案(一)
后端思维之数据库性能优化方案(一)
1536 0
后端思维之数据库性能优化方案(一)
|
18天前
|
存储 关系型数据库 MySQL
探索MySQL:关系型数据库的基石
MySQL,作为全球最流行的开源关系型数据库管理系统(RDBMS)之一,广泛应用于各种Web应用、企业级应用和数据仓库中
|
17天前
|
缓存 运维 关系型数据库
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
|
16天前
|
关系型数据库 MySQL 网络安全
Mysql 数据库主从复制
在MySQL主从复制环境中,配置了两台虚拟机:主VM拥有IP1,从VM有IP2。主VM的`my.cnf`设置server-id为1,启用二进制日志;从VM设置server-id为2,开启GTID模式。通过`find`命令查找配置文件,编辑`my.cnf`,在主服务器上创建复制用户,记录二进制日志信息,然后锁定表并备份数据。备份文件通过SCP传输到从服务器,恢复数据并配置复制源,启动复制。检查复制状态确认运行正常。最后解锁表,完成主从同步,新用户在从库中自动更新。
990 7
Mysql 数据库主从复制
|
6天前
|
分布式计算 大数据 关系型数据库
MaxCompute产品使用合集之如何实现类似mysql实例中的数据库功能
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。