大型软件公司.net面试题!一定得看(附答案)

时间:2022-02-26 14:41:53
 
EQUALS() AND ==

1)比较方式角度:

= =是面向过程的操作符;equals是面向对象的操作符

= =不属于任何类,equals则是任何类(在Java中)的一个方法;

我们可以1)Primitive1 (基本类型)= = Primitive2(基本类型);

         2)Object Reference1(对象引用)= = Object Reference2(对象引用)

         3)Object Reference1 (对象引用) .equals(Object Reference2 (对象引用))

           这三种比较

           但却不能Primitive1 (基本类型).equals( Primitive2(基本类型));

 对于基本类型,没有面向对象中发送消息一说,自然也不会有

方法成员。

 

2)比较目的角度:

1)    如果要比较两个基本类型是否相等,请用= =;

2)    如果要比较两个对象引用是否相等,请用= =;

3)    如果要比较两个对象(逻辑上)是否一致,请用equals;

 

第二节:对两个对象(逻辑上)是否一致的阐释:

   有人会问:在C++中, 比较两个对象相等不是也可以用==吗?我知道您是指运算符重载,但是很遗憾,Java中不支持运算符重载(java中亦有重载过运算符,他们是“+”,“+=”,不过也仅此两个,而且是内置实现的);所以,对象的是否相等的比较这份责任就交由  equals()来实现 。    

这个“逻辑上”其实就取决于人类的看法,实际开发中,就取决于用户的需求;

有人会有看法:“取决于人类的看法”太过宽泛和不严肃,如果某人要两件

风牛马不相及的事物也相等,equals是否也能作出这样的比较呢?我们说可以的

下面这个例子说明了这一点:

 

class Horse {

       String Type;

       int Legs;

  //相等的标准:腿的数目相等

       public boolean equals(Object o){

          if(this.Legs==((Cattle)o).Legs){

             return true;

          }

       return false;

}

public Horse(String Type,int legs){

           this.Type=Type;

        this.Legs=legs;

}



l          equals()==

比較物件內容

比較是否同一物件

equals()

==

 

String str1 = new String(“abc”);

String str2 = new String(“abc”);

String str3 = str1;

String str4 = “abc”;

String str5 = “abc”;

 

 


str1 / str2

str1 / str3

str4 / str5

str1 / str4

Equals

true

true

true

true

==

false

true

true

False

 

l           String str = "abc" String str = new String("abc")在做”==”得到的結果不同。

l     long i = 1; double j = 1; // i == j true(因為primitive data type,值相等即為true)

l           Long a = new Long(3L); Long b = new Long(3L); Double x = new Double(3.0); //a == bfalse(因為reference type,非同一個物件了)//a == xcompile err(ax無繼承關係無法convertible)

l           ==的左右兩邊若為不相容的型別轉換,則會發生compiler errors,但若是equals,當物件不相同時equal()會回傳false,不會造成編譯錯誤(equals Float object and Double object will always return false)

l           compares(equals) a Float object and a Double object which will always return false

l           每個java class都有一個”equals()”method,這個method是使用”==”來比較兩個reference var所存的值(即是否指向一物件)若要比較content是否相同,必須override equals() method,同時也必須override定義於Object class”hashcode()”method,否則java collection API操作這個classobject時會錯。

l           StringDateFile8wrapper classes都已override equals() method

如果hashCode值相同,那object”可能相同(equal);如果hashCode值不相同,那object”一定不相同。

1. new 关键字用法 (1)new 运算符 用于创建对象和调用构造函数。 (2)new 修饰符 用于向基类成员隐藏继承成员。 (3)new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。 2.如何把一个Array复制到ArrayList里 (1) 实现1 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(); list.AddRange(s); (2)实现2 string[] s ={ "111", "22222" }; ArrayList list = new ArrayList(s); 3.DataGrid的Datasouse可以连接什么数据源 l DataTable l DataView l DataSet l DataViewManager l 任何实现IListSource接口的组件 l 任何实现IList接口的组件 4.概述反射和序列化反射 公共语言运行库加载器管理应用程序域。这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。 程序集包含模块,而模块包含类型,类型又包含成员。反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 序列化 序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。 5.概述O/R Mapping 的原理利用反射,配置将对象和数据库表映射。 6. 可访问性级别有哪几种 l public 访问不受限制。 l protected 访问仅限于包含类或从包含类派生的类型。 l internal 访问仅限于当前程序集。 l protected internal 访问仅限于从包含类派生的当前程序集或类型。 l private 访问仅限于包含类型。 7. sealed 修饰符有什么特点 sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override一起使用。 8.列举ADO.NET中的共享类和数据库特定类共享类 DataSet DataTable DataRow DataColumn DataRelation Constraint DataColumnMapping DataTableMapping 特定类 (x)Connection (x)Command (x)CommandBuilder (x)DataAdapter (x)DataReader (x)Parameter (x)Transaction 9.执行下面代码后: String strTemp ="abcdefg 某某某"; Int i=System.Text.Encoding.Default.GetBytes(strTemp).Length; Int j=strTemp.Length; 问: i=? j=? i=(14 ) ;j=(11 ) 中文两个字节 10.C#中,string str = null 与 string str ="",请尽量用文字说明区别。 string str =""初始化对象分配空间 而string str=null初始化对象 11.详述.NET里class和struct的异同结构与类共享几乎所有相同的语法,但结构比类受到的限制更多: 尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。 结构不能声明默认构造函数(没有参数的构造函数)或析构函数。 结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。 结构是值类型 -- 如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识 -- 具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自 valueType,后者继承自 Object。 编译器可以在一个称为装箱的过程中将值类型转换为引用类型。 结构具有以下特点: l 结构是值类型,而类是引用类型。 l 向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。 l 与类不同,结构的实例化可以不使用 new 运算符。 l 结构可以声明构造函数,但它们必须带参数。 l 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。所有结构都直接继承自 System.valueType,后者继承自 System.Object。 l 结构可以实现接口。 l 在结构中初始化实例字段是错误的。 12.什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?应用程序域 应用程序域为安全性、可靠性、版本控制以及卸载程序集提供了隔离边界。应用程序域通常由运行库宿主创建,运行库宿主负责在运行应用程序之前引导公共语言运行库。应用程序域提供了一个更安全、用途更广的处理单元,公共语言运行库可使用该单元提供应用程序之间的隔离。 托管代码 使用基于公共语言运行库的语言编译器开发的代码称为托管代码;托管代码具有许多优点,例如:跨语言集成、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。 装箱和拆箱 装箱和拆箱使值类型能够被视为对象。对值类型装箱将把该值类型打包到 Object 引用类型的一个实例中。这使得值类型可以存储于垃圾回收堆中。拆箱将从对象中提取值类型。 重载 每个类型成员都有一个唯一的签名。方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。 CTS通用类型系统 (common type system) 一种确定公共语言运行库如何定义、使用和管理类型的规范。 CLR公共语言运行库 .NET Framework 提供了一个称为公共语言运行库的运行时环境,它运行代码并提供使开发过程更轻松的服务。 CLS公共语言规范 要和其他对象完全交互,而不管这些对象是以何种语言实现的,对象必须只向调用方公开那些它们必须与之互用的所有语言的通用功能。为此定义了公共语言规范 (CLS),它是许多应用程序所需的一套基本语言功能。 强类型 C# 是强类型语言;因此每个变量和对象都必须具有声明类型。 13.值类型和引用类型的区别? 基于值类型的变量直接包含值。将一个值类型变量赋给另一个值类型变量时,将复制包含的值。这与引用类型变量的赋值不同,引用类型变量的赋值只复制对对象的引用,而不复制对象本身。 所有的值类型均隐式派生自 System.valueType。 与引用类型不同,从值类型不可能派生出新的类型。但与引用类型相同的是,结构也可以实现接口。 与引用类型不同,值类型不可能包含 null 值。然而,可空类型功能允许将 null 赋给值类型。 每种值类型均有一个隐式的默认构造函数来初始化该类型的默认值。 值类型主要由两类组成:结构、枚举 结构分为以下几类:Numeric(数值)类型、整型、浮点型、decimal、bool、用户定义的结构。 引用类型的变量又称为对象,可存储对实际数据的引用。声明引用类型的关键字:class、interface、delegate、内置引用类型: object、string 14.如何理解委托委托类似于 C++ 函数指针,但它是类型安全的。 委托允许将方法作为参数进行传递。 委托可用于定义回调方法。 委托可以链接在一起;例如,可以对一个事件调用多个方法。 方法不需要与委托签名精确匹配。有关更多信息,请参见协变和逆变。 C# 2.0 版引入了匿名方法的概念,此类方法允许将代码块作为参数传递,以代替单独定义的方法。 15.C#中的接口和类有什么异同。异: 不能直接实例化接口。 接口不包含方法的实现。 接口、类和结构可从多个接口继承。但是C# 只支持单继承:类只能从一个基类继承实现。 类定义可在不同的源文件之间进行拆分。 同: 接口、类和结构可从多个接口继承。 接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。 接口可以包含事件、索引器、方法和属性。 一个类可以实现多个接口。 16.ASP.net的身份验证方式有哪些 Windows 身份验证提供程序 提供有关如何将 Windows 身份验证与 Microsoft Internet 信息服务 (IIS) 身份验证结合使用来确保 ASP.NET 应用程序安全的信息。 Forms 身份验证提供程序 提供有关如何使用您自己的代码创建应用程序特定的登录窗体并执行身份验证的信息。使用 Forms 身份验证的一种简便方法是使用 ASP.NET 成员资格和 ASP.NET 登录控件,它们一起提供了一种只需少量或无需代码就可以收集、验证和管理用户凭据的方法。 Passport 身份验证提供程序 提供有关由 Microsoft 提供的集中身份验证服务的信息,该服务为成员站点提供单一登录和核心配置 17.活动目录的作用 Active Directory存储了有关网络对象的信息,并且让管理员和用户能够轻松地查找和使用这些信息。Active Directory使用了一种结构化的数据存储方式,并以此作为基础对目录信息进行合乎逻辑的分层组织。 18.解释一下UDDI、WSDL的意义及其作用 UDDI 统一描述、发现和集成协议(UDDI, Universal Description, Discovery and Integration)是一套基于Web的、分布式的、为Web服务提供的信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web服务注册以使得别的企业能够发现的访问协议的实现标准。UDDI 提供了一组基于标准的规范用于描述和发现服务,还提供了一组基于因特网的实现。 WSDL WSDL描述Web服务的公共接口。这是一个基于XML的关于如何与Web服务通讯和使用的服务描述; l 服务 URL 和命名空间 l 网络服务的类型(可能还包括 SOAP 的函数调用,正像我所说过的,WSDL 足够自如地去描述网络服务的广泛内容) l 有效函数列表 l 每个函数的参数 l 每个参数的类型 l 每个函数的返回值及其数据类型 19.什么是SOAP SOAP(Simple Object Access Protocol )简单对象访问协议是在分散或分布式的环境中交换信息并执行远程过程调用的协议,是一个基于XML的协议。使用SOAP,不用考虑任何特定的传输协议(最常用的还是HTTP协议),可以允许任何类型的对象或代码,在任何平台上,以任何一直语言相互通信。 SOAP 是一种轻量级协议,用于在分散型、分布式环境中交换结构化信息。 SOAP 利用 XML 技术定义一种可扩展的消息处理框架,它提供了一种可通过多种底层协议进行交换的消息结构。 这种框架的设计思想是要独立于任何一种特定的编程模型和其他特定实现的语义。 SOAP 定义了一种方法以便将 XML 消息从 A 点传送到 B 点。 为此,它提供了一种基于 XML 且具有以下特性的消息处理框架:1) 可扩展,2) 可通过多种底层网络协议使用,3) 独立于编程模型。 20.如何部署一个ASP.net页面 VS 2005和VS 2003都有发布机制。2003可以发布然后再复制部署。 VS2005基本上可以直接部署到对应位置。 21.如何理解.net中的垃圾回收机制 .NET Framework 的垃圾回收器管理应用程序的内存分配和释放。每次您使用 new 运算符创建对象时,运行库都从托管堆为该对象分配内存。只要托管堆中有地址空间可用,运行库就会继续为新对象分配空间。但是,内存不是无限大的。最终,垃圾回收器必须执行回收以释放一些内存。垃圾回收器优化引擎根据正在进行的分配情况确定执行回收的最佳时间。当垃圾回收器执行回收时,它检查托管堆中不再被应用程序使用的对象并执行必要的操作来回收它们占用的内存。

1:a=10,b=15,在不用第三方变量的前提下,把a,b的值互换

2:已知数组int[] max={6,5,2,9,7,4,0};用快速排序算法按降序对其进行排列,并返回数组

3:请简述面向对象的多态的特性及意义!

4:session喜欢丢值且占内存,Cookis不安全,请问用什么办法代替这两种原始的方法

5:对数据的并发采用什么办法进行处理较好。

6:已知Oracle数据库有GD和ZS两个数据库,GD数据库v_s表有数据写入时,从v_s表中提取最新数据到ZS数据库的D_E表中。请问用什么办法解决这一问题?如果又碰到不能互访的问题时,又用什么办法解决?

7:已知Oracle数据库a,b
现在在a用户权限下,访问b数据库sql语句为select a.* From b a,请改正这一句Sql的写法

8:当对数据库进行海量级的数据插入时,数据库出现报错,错误原因可能有哪些,以你的经验谈谈你的解决办法

9:算法分析
AH 20060625 12 44 01 CAD001
AH 20060625 12 44 01 CAD001
AH 20060625 13 44 02 CAD001
AH 20060625 14 44 03 CAD001
说明:第二列表示日期,第三列表示温度,第四列表示水位,第五列表示流量,第6列表示水位测站编码,每一列表示一个字段
很明显第一条数据和第二条数据重复,然数据表中有主键和外键的约束,是不允许有重复的数据存在的,请构造算法将重复的数据Del掉

10:javascript算法
已知a,b,现在点鼠标a会向b游动,鼠标停,a会停下来
请实现"跑步算法" 

1、答案

a=a+b;
b=a-b;
b=(a+b)/2;
a=a-b;

还有变态要求,需要代码最短呢。有两个结果:
1) a^=b^(b^=a^b); // 13个字节
2) a=b+(b=a)*0; // 11个字节

2、答案(如果不限定算法,其实可以直接用Array.Sort()方法的)

public class TestQuickSort {

    private int[] array = null;

    private void quickSort(int lowest, int highest) {
        if (array == null || lowest < 0 || lowest >= highest
                || highest >= array.length) {
            return;
        }
        int low = lowest;
        int high = highest;
        int key = low++;
        for (; low <= high;) {
            if (key < high) {
                if (array[key] > array[high]) {
                    array[high] = array[key] + (array[key] = array[high]) * 0;
                    key = high;
                }
                high--;
            }

            if (key > low) {
                if (array[key] < array[low]) {
                    array[low] = array[key] + (array[key] = array[low]) * 0;
                    key = low;
                }
                low++;
            }
        }
        quickSort(lowest, key - 1);
        quickSort(key + 1, highest);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestQuickSort test = new TestQuickSort();
        int[] array = {6,5,2,9,7,4,0};
        test.array = array;
        test.quickSort(0, array.length - 1);
        int length = test.array.length;
        for (int i = 0; i < length; i++) {
            System.out.println(test.array[i]);
        }
    }
}

不要用冒泡排序法很慢,选择排序好些,但题意是快速排序算法

快速排序算法的基本思想:

快速排序的基本思想是基于分治策略的。对于输入的子序列ap..ar,如果规模足够小则直接进行排序,否则分三步处理:

分解(Divide):将输入的序列ap..ar划分成两个非空子序列ap..aq和aq+1..ar,使ap..aq中任一元素的值不大于aq+1..ar中任一元素的值。
递归求解(Conquer):通过递归调用快速排序算法分别对ap..aq和aq+1..ar进行排序。
合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在ap..aq和aq+1..ar都排好序后不需要执行任何计算ap..ar就已排好序。
这个解决流程是符合分治法的基本步骤的。因此,快速排序法是分治法的经典应用实例之一。

算法Quick_Sort的实现:

Pascal实现:
Procedure Quick_Sort(p,r:TPosition;var L:TList); {快速排序}

var

q:TPosition;

begin

if L[p..r]足够小 then Sort(p,r,L) {若L[p..r]足够小则直接对L[p..r]排序}

else

begin

q:=Partition(p,r,L); {将L[p..r]分解为L[p..q]和L[q+1..r]两部分}

Quick_Sort(p,q,L); {递归排序L[p..q]}

Quick_Sort(q+1,r,L); {递归排序L[q+1..r]}

end;

end;

3、答案

面向对象的编程使用了派生继承 以及虚函数机制.
一个本来指向基类的对象指针可以指向其派生类的.并访问从基类继承而来的成员变量和函数.
而虚函数是专门为这个特性设计的,这个函数在每个基类的派生类中都是同一个名字,但函数体却并不一定相同,派生类往往为实现自己的功能而修改这个虚函数.这样用一个指针就能够实现对多种不同的派生类的访问, 并实现其派生类的特定功能(代码 )....

4、答案
用VIEWSTATE
stateserver

5、答案
可以控制连接池的连接数量条件好的话 可以用负载平衡

6、答案

一个中型或大型公司往往由地理上分散的部门所组成,这些部门通常需要进行数据共享。针对这些共享数据,可以将其存储在某个站点上,需要的用户都从这个站点上存取。这种方案的优点是数据的一致性容易保证,但其缺点也是很突出的,那就是该站点的负载大、网络负载大,远程用户的数据响应迟缓。数据复制技术可以有效地解决这个问题,它通过将这些共享数据复制到位于不同地点的多个数据库中,从而实现数据的本地访问,减少了网络负荷,并提高了数据访问的性能,而且通过对数据库中的数据定期同步(通常是每天晚上),从而确保了所有的用户使用同样的、最新的数据。该技术适用于用户数量较大、地理分布较广、而且需要实时地访问相同数据的应用模式。

 

 

数据复制的概念及特点

 

 

1、数据复制的概念及分类

 

 

数据复制,就是将数据库中的数据拷贝到另外一个或多个不同的物理站点上,从而保持源数据库与目标数据库中指定数据的一致性。

 

 

按照数据复制的实时性,数据复制可分为同步数据复制和异步数据复制。同步数据复制是指将本地生产数据以完全同步的方式复制到异地,每一本地IO交易均需等待远程复制的完成方予以释放。异步数据复制则是指将本地生产数据以后台同步的方式复制到异地,每一本地IO交易均正常释放,无需等待远程复制的完成。同步复制实时性强,远端数据与本地数据完全同步。但这种方式受带宽影响较大,数据传输距离较短。异步复制不影响本地交易,传输距离长,但其数据比本地数据略有延迟。在异步复制环境中,对于所有应用最关键的就是要确保数据的一致性。

 

 

按照复制站点的类型,数据复制可分为多主控站点复制、物化视图复制及混合复制。多主控站点复制也称为对等站点复制,其中每个站点都是主控站点,都需要与其他站点进行信息交流,各站点之间是平等的。物化视图复制包含一个主控站点、一个或多个物化视图站点,

物化视图中的内容可以为目标主对象在某个时间点的全部拷贝或部分拷贝,其中目标主对象既可以是主控站点上的表也可以是物化视图站点上的主物化视图。混合复制包含多个主控站点和多个物化视图站点,是主控站点复制和物化视图复制的结合体,适合于复杂的业务情况。

 

 

2、数据复制的特点

 

 

数据复制通过在多个站点上建立备份,能够提高数据的安全性,同时也提高了数据的可用性,这是因为如果一个站点出现了问题,用户可以选择其他站点继续进行操作,应用系统还可继续运行,从而数据复制提供了容错保护机制。

 

 

然而数据复制最基本的功能是提高数据库的性能。它通过将远程数据库中的数据复制到本地,使得应用能够就近访问数据,从而降低网络传输负载,提高效率。而且在数据复制系统中,可以提供多个站点之间的负载平衡,让这几个用户使用这个服务器,另外几个用户可以

使用其他的服务器,以避免某些站点负载过重。

 

 

物化视图还提供了按子集进行复制,这样各站点就可只复制自己需要的数据,也能减轻网络的传输量。

 

 

数据复制的实现方法

 

 

在具体的实现之前,首先要做好设计与规划。这就需要细致分析具体的业务情况,设计出一套能够满足业务需要的方案。通常在设计过程中,需要确定出要建立的数据库站点,各站点的类型,需要复制的数据对象,以及同步方式、冲突解决方案等内容。

 

 

在设计完成之后,就可具体来实现数据复制,实现主要包括以下几步:

 

 

(1)创建复制站点

 

 

(2)创建组对象

 

 

(3)配置冲突解决方案

 

 

下面我们举一个例子来说明各步具体需要完成的工作。在这个例子中我们采用多主控站点复制方式,设有两个主控站点和两个共享数据表。两个主控站点分别为:处理站点(cl.world)和解释站点(js.wo rld);两个数据表为测区( survey)和测线( line)。

 

 

STEP1 创建复制站点

 

 

(1)首先以SYSTEM身份登陆主站点数据库cl.worldCONNECT system/manager@cl.world

 

 

(2)创建用户—复制管理员,并为该用户授权复制管理员负责复制站点的创建和管理,每个复制站点都必须创建复制管理员:

 

 

CREATE USER repadmin IDENTIFIED BY repadmin;

BEGIN

 DBMS_REPCAT_ADMIN.GRANT_ADMIN_ANY_SCHEMA (username => ’repadmin’);

END;

 

 

 

(3)为本站点指定传播者

 

 

传播者负责将本地最新更新的数据传播到其他站点上:

 

 

BEGIN

 DBMS_DEFER_SYS.REGISTER_PROPAGATOR (username => ’repadmin’);

END;

 

 

 

(4)为本站点指定接收者

 

 

接收者负责接收其他站点上的传播者传送过来的数据:

 

 

BEGIN

DBMS_REPCAT_ADMIN.REGISTER_USER_REPGROUP (

 username => ’repadmin’,

 privilege_type => ’receiver’,

 list_of_gnames => NULL);

END;

 

 

 

(5)确定清除时间

 

 

为了使传送过来事务队列不致过大,需要将成功加载的事务从事物队列里清除掉,这里设定每小时清除一次。

 

 

CONNECT repadmin/repadmin@cl.world

BEGIN

 DBMS_DEFER_SYS.SCHEDULE_PURGE (

next_date => SYSDATE,

interval => ’SYSDATE + 1/24’,

delay_seconds => 0);

END;

 

 

 

在建立好站点cl.world后,以同样的方法创建站点js. world。

(6)创建各主控站点之间的调度链接

 

 

创建各主控站点之间的调度链接需要先在各主控站点间建立数据库链接,之后为每个数据库链接定义调度时间。

 

 

首先,在处理站点上建立与解释站点的数据库链接,这里需要先建立一个公用数据库链接,供其他私有数据库链接来使用。

 

 

CONNECT SYSTEM/MANAGER@cl.world

CREATE PUBLIC DATABASE LINK js.world USING ’js.world’;

CONNECT repadmin/repadmin@cl.world

CREATE DATABASE LINK js.world CONNECT TO repadmin

IDENTIFIED BY repadmin;

 

 

 

同样,在解释站点上建立与处理站点的数据库链接

 

 

CONNECT SYSTEM/MANAGER@js.world

CREATE PUBLIC DATABASE LINK cl.world USING ’cl.world’;

CONNECT repadmin/repadmin@js.world

CREATE DATABASE LINK cl.world CONNECT TO repadmin

IDENTIFIED BY repadmin;

 

 

 

调度链接确定本站点上的事务向其他站点发送的频度,下面的代码为10分钟一次:

 

 

CONNECT repadmin/repadmin@cl.world

BEGIN

DBMS_DEFER_SYS.SCHEDULE_PUSH (

destination => ’js.world’,

interval => ’SYSDATE + (1/144)’,

next_date => SYSDATE,

parallelism => 1,

execution_seconds => 1500,

delay_seconds => 1200);

END;

 

 

 

在解释站点上做相同的工作STEP2 创建主控组在复制环境中,Oracle用组来管理复制对象。通过将相关的复制对象放在一个组里,从而方便对大量数据对象的管理。

 

 

这里我们假设用户模式integr ation 在处理站点和解释站点都已存在,而且表测区(survey )和测线(line)也已经创建。

 

 

(1)创建主控组对象

 

 

CONNECT repadmin/repadmin@cl.world

BEGIN

DBMS_REPCAT.CREATE_MASTER_REPGROUP (

gname => ’inte_repg’);

END;

 

 

 

(2)向主控组中添加数据对象,将测区表survey加入到组inte_repg中

 

 

BEGIN

DBMS_REPCAT.CREATE_MASTER_REPOBJECT (

gname => ’inte_repg’,

type => ’TABLE’,

oname => ’survey’,

sname => ’integration’,

use_existing_object => TRUE,

copy_rows => FALSE);

END;

 

 

 

以同样的方法将测线表line 加入到组inte_repg中

 

 

(3)在主控组中添加其他参与复制的站点,数据库之间的同步方式在此指定

 

 

BEGIN

DBMS_REPCAT.ADD_MASTER_DATABASE (

gname => ’inte_repg’,

master => ’js.world’,

use_existing_objects => TRUE,

copy_rows => FALSE,

propagation_mode => ’ASYNCHRONOUS’);

END;

 

 

 

(4)如果可能出现冲突,则需要配置冲突解决方案。冲突解决方案将在后面介绍。

 

 

(5)为每个对象生成复制支持

 

 

BEGIN

DBMS_REPCAT.GENERATE_REPLICATION_SUPPORT (

sname => ’integration’,

oname => ’survey’,

type => ’TABLE’,

min_communication => TRUE);

END;

 

 

 

测线表line也一样

 

 

(6)重新开始复制

 

 

BEGIN

DBMS_REPCAT.RESUME_MASTER_ACTIVITY (

gname => ’inte_repg’);

END;

 

 

 

以同样的方式设置解释站点。设置成功后,数据复制过程就宣告完毕,库中的数据就可进行复制。

 

 

数据复制中冲突的解决方案

 

 

在复制环境中,尽管在数据库和应用程序设计过程中,会尽量避免各站点间冲突的发生,但完全避免冲突的可能性还是比较小的,那么一旦冲突发生,就需要一个按照具体业务规则的冲突解决机制,来使得各站点的数据保持一致。

 

 

首先需要分析哪些对象容易出现冲突。通常来说,静态的数据变化少,冲突出现的可能性也小;而有些数据变化非常大,冲突出现的可能性也大。确定了冲突易发的对象后,需要确定怎样解决冲突,比如在各站点之间建立优先次序,在数据不一致时,以某个站点上的为

准;或以某个站点上最新的修改为准。

 

 

Oracle提供了多中冲突解决方案,具体包括:针对更新冲突的方案、针对唯一性冲突的方案、针对删除冲突的方案。除了这些方案以外,用户还可以自定义冲突解决方法。每种方案都有自己的适用情况,那么我们需要根据具体的业务来选择合适的冲突解决方案。

 

 

结束语

 

 

本文详细介绍了分布式系统Oracle中的数据复制技术,在具体应用中,还有许多比较复杂的问题需要解决,比如主控组中如果包含循环依赖的表或自相关的表时如何处理;如何利用模版机制来创建物化视图站点;如何对数据复制环境进行管理与维护。这些问题需要在实际

应用中逐步探索,深入研究。

7、答案
select a.* from b.b a

8、答案

对于oracle数据库来说,可能出现的问题包括:
1. 回滚区间空间不足  --- 解决方法,增加表空间
2. 数据表空间不足 ---- 增加数据表空间
3. 表空间不足 ---- 增加表空间(oracle数据表有空间限制)
4. 临时表空间不足 --- 因为计算索引使用临时表空间,增加表空间或者暂时不使用索引,数据导入完毕再重新建立索引
5.另外一些原因,主要是垃圾数据造成的,比如外键匹配,主键冲突,单一索引冲突等。

9、答案
DELETE FROM TABLE_NAME
WHERE ROWID!=(SELECT MAX(ROWID) FROM TABLE_NAME D
WHERE TABLE_NAME.COL1=D.COL1 AND TABLE_NAME.COL2=D.COL2);

10、答案