大型軟體公司.net面試題!一定得看(附答案)
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資料庫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列表示水位測站編碼,每一列表示一個欄位
很明顯第一條資料和第二條資料重複,然資料表中有主鍵和外來鍵的約束,是不允許有重複的資料存在的
10:javascript演算法
已知a,b,現在點滑鼠a會向b遊動,滑鼠停,a會停下來
請實現"跑步演算法"
1、答案
a=a+b;
b=a-b;
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/[email protected]
(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/[email protected]
BEGIN
DBMS_DEFER_SYS.SCHEDULE_PURGE (
next_date => SYSDATE,
interval => ’SYSDATE + 1/24’,
delay_seconds => 0);
END;
在建立好站點cl.world後,以同樣的方法建立站點js. world。
(6)建立各主控站點之間的排程連結
建立各主控站點之間的排程連結需要先在各主控站點間建立資料庫連結,之後為每個資料庫連結定義排程時間。
首先,在處理站點上建立與解釋站點的資料庫連結,這裡需要先建立一個公用資料庫連結,供其他私有資料庫連結來使用。
CONNECT SYSTEM/[email protected]
CREATE PUBLIC DATABASE LINK js.world USING ’js.world’;
CONNECT repadmin/[email protected]
CREATE DATABASE LINK js.world CONNECT TO repadmin
IDENTIFIED BY repadmin;
同樣,在解釋站點上建立與處理站點的資料庫連結
CONNECT SYSTEM/[email protected]
CREATE PUBLIC DATABASE LINK cl.world USING ’cl.world’;
CONNECT repadmin/[email protected]
CREATE DATABASE LINK cl.world CONNECT TO repadmin
IDENTIFIED BY repadmin;
排程連結確定本站點上的事務向其他站點發送的頻度,下面的程式碼為10分鐘一次:
CONNECT repadmin/[email protected]
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/[email protected]
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、答案