給一張表加了索引,但是查詢的時候卻發現索引沒起作用怎麼回事?
1) 沒有查詢條件,或者查詢條件沒有建立索引
2) 在查詢條件上沒有使用引導列
3) 查詢的數量是大表的大部分,應該是30%以上。
4) 索引本身失效
5) 查詢條件使用函數在索引列上(見12)
6) 對小表查詢
7) 提示不使用索引
8) 統計數據不真實
9) CBO計算走索引花費過大的情況。其實也包含了上面的情況,這裏指的是表佔有的block要比索引小。
10)隱式轉換導致索引失效.這一點應當引起重視.也是開發中經常會犯的錯誤. 由於表的字段tu_mdn定義爲varchar2(20),
但在查詢時把該字段作爲number類型以where條件傳給Oracle,這樣會導致索引失效.
錯誤的例子:select * from test where tu_mdn=13333333333;
正確的例子:select * from test where tu_mdn='13333333333';
11)對索引列進行運算導致索引失效,我所指的對索引列進行運算包括(+,-,*,/,! 等)
錯誤的例子:select * from test where id-1=9;
正確的例子:select * from test where id=10;
12)使用Oracle內部函數導致索引失效.對於這樣情況應當創建基於函數的索引.
錯誤的例子:select * from test where round(id)=10;
說明,此時id的索引已經不起作用了 正確的例子:首先建立函數索引,
create index test_id_fbi_idx on test(round(id));
然後 select * from test where round(id)=10; 這時函數索引起作用了 1,<> 2,單獨的>,<,(有時會用到,有時不會)
3,like "%_" 百分號在前.
4,表沒分析.
5,單獨引用複合索引裏非第一位置的索引列.
6,字符型字段爲數字時在where條件裏不添加引號.
7,對索引列進行運算.需要建立函數索引.
8,not in ,not exist.
9,當變量採用的是times變量,而表的字段採用的是date變量時.或相反情況。
10, 索引失效。
11,基於cost成本分析(oracle因爲走全表成本會更小):查詢小表,或者返回值大概在10%以上
12,有時都考慮到了 但就是不走索引,drop了從建試試在
13,B-tree索引 is null不會走,is not null會走,位圖索引 is null,is not null 都會走
14,聯合索引 is not null 只要在建立的索引列(不分先後)都會走,
in null時 必須要和建立索引第一列一起使用,當建立索引第一位置條件是is null 時,
其他建立索引的列可以是is null(但必須在所有列 都滿足is null的時候),
或者=一個值;當建立索引的第一位置是=一個值時,其他索引列可以是任何情況(包括is null =一個值),
以上兩種情況索引都會走。其他情況不會走。
數據庫連接池滿了,怎麼辦?
<!--[if !supportLists]-->1. <!--[endif]-->更改連接池最大連接數的配置
<!--[if !supportLists]-->2. <!--[endif]-->優化SQL或者數據庫的表結構以及程序編碼的優化,考慮連接是否在程序中釋放
<!--[if !supportLists]-->3. <!--[endif]-->重啓服務或adb相關進程
hibernate session如何保證線程安全?
SessionFactory負責創建Session,SessionFactory是線程安全的,多個併發線程可以同時訪問一個 SessionFactory 並從中獲取Session實例。
而Session並非線程安全,也就是說,如果多個線程同時使用一個Session實例進行數據存取,
則將會導致 Session 數據存取邏輯混亂.因此創建的Session實例必須在本地存取上運行,
使之總與當前的線程相關。這裏就需要用到ThreadLocal,在很多種Session 管理方案中都用到了它. (用戶一直點擊保存按鈕導致線程不安全)
ThreadLoca(共享對象訪問多線程)l 是Java中一種較爲特殊的線程綁定機制,通過ThreadLocal存取的數據
hash 算法的原理
通過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數
數據連接池的原理
連接池意味着當應用程序需要調用一個數據庫連接的時,數據庫相關的接口通過返回一個通過重用數據庫連接來代替重新創建一個數據庫連接。通過這種方式,應用程序可以減少對數據庫連接操作,尤其在多層環境中多個客戶端可以通過共享少量的物理數據庫連接來滿足系統需求。通過連接池技術Java應用程序不僅可以提高系統性能同時也爲系統提高了可測量性。
策略模式和狀態模式有什麼區別,適用什麼場景
一個策略是一個計劃或方案,通過執行這個計劃或方案,我們可以在給定的輸入條件下達到一個特定的目標。策略是一組方案,他們可以相互替換;選擇一個策略,獲得策略的輸出。策略模式用於隨不同外部環境採取不同行爲的場合。
而狀態模式不同,對一個狀態特別重要的對象,通過狀態機來建模一個對象的狀態;狀態模式處理的核心問題是狀態的遷移,因爲在對象存在很多狀態情況下,對各個business flow,各個狀態之間跳轉和遷移過程都是及其複雜的。例如一個工作流,審批一個文件,存在新建、提交、已修改、HR部門審批中、老闆審批中、HR審批失敗、老闆審批失敗等狀態,涉及多個角色交互,涉及很多事件,這種情況下用狀態模式(狀態機)來建模更加合適。
發生hash衝突怎麼解決
a)開放地址法
開放地執法有一個公式:Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1)
b)再哈希法
當發生衝突時,使用第二個、第三個、哈希函數計算地址,直到無衝突時。缺點:計算時間增加。
比如上面第一次按照姓首字母進行哈希,如果產生衝突可以按照姓字母首字母第二位進行哈希,再衝突,第三位,直到不衝突爲止
c)鏈地址法
將所有關鍵字爲同義詞的記錄存儲在同一線性鏈表中。
d)建立一個公共溢出區
假設哈希函數的值域爲[0,m-1],則設向量HashTable[0..m-1]爲基本表,另外設立存儲空間向量OverTable[0..v]用以存儲發生衝突的記錄。
Java object類中有哪些方法?歸類總結一下
Object()默認構造方法
clone()創建並返回此對象的一個副本。
equals(Object obj)指示某個其他對象是否與此對象“相等”。
finalize()當垃圾回收器確定不存在對該對象的更多引用時,由對象的垃圾回收器調用此方法。
getClass()返回一個對象的運行時類。
hashCode()返回該對象的哈希碼值。
notify()喚醒在此對象監視器上等待的單個線程。
notifyAll()喚醒在此對象監視器上等待的所有線程。
toString()返回該對象的字符串表示。
wait()導致當前的線程等待,直到其他線程調用此對象的 notify() 方法或 notifyAll() 方法。
多重繼承優缺點
多重繼承的優點很明顯:簡單,清晰,更有利於複用。不會因爲基類一個小小的改變而大張旗鼓去改代碼。
缺點:兩個基類中有同名方法的時候,你不得不在子類的調用中指明此方法出自那個基類
在Java中,構造方法必須滿足什麼樣的規則,構造方法能夠被static, final, synchronized, abstract和native修飾嗎?請說明你的理解。
構造方法一般需要滿足以下幾條規則:
(1)方法名必須與類名保持一致。
(2)不要聲明返回類型。
(3)不能被static, final, synchronized, abstract和native修飾。構造方法不能被子類繼
承,所以用final和abstract修飾沒有任何意義。構造方法用於初始化一個新建對象,所以用static修飾沒有意義。多個線程不會同時創建內存地址相同的對象,因此使用 synchronized修飾也是沒有必要的。此外,Java語言目前還不支持native類型的構造方法。
this語句來調用其他構造方法時,必須遵守以下規則:
(1)假如在一個構造方法中使用了this語句,那麼它必須作爲構造方法的第一條語句(不考慮註釋語句)。
(2)只能在一個構造方法中使用this語句來調用類的其他構造方法,而不能在實例方法中用this語句來調用類的其他構造方法。
(3)只能用this語句來調用其他構造方法,而不能通過方法名來直接調用構造方法。
同樣,使用super語句調用父類的構造方法時,也必須遵守以下語法規則:
(1)在子類的構造方法中,不能直接通過父類方法名來調用父類的構造方法,而是使用super語句。
(2)假如子類的構造方法中有super語句,它必須作爲構造方法的第一條語句。
Spring的事務隔離
1、ISOLATION_DEFAULT 這是一個PlatfromTransactionManager默認的隔離級別,使用數據庫默認的事務隔離級別.另外四個與JDBC的隔離級別相對應
2、ISOLATION_SERIALIZABLE 這是花費最高代價但是最可靠的事務隔離級別。事務被處理爲順序執行。除了防止髒讀,不可重複讀外,還避免了幻像讀,最嚴格的Spring事務隔離級別,事務串行執行,資源消耗最大;
3、ISOLATION_REPEATABLE_READ 這種事務隔離級別可以防止髒讀,不可重複讀。但是可能出現幻像讀。它除了保證一個事務不能讀取另一個事務未提交的數據外,還保證了避免下面的情況產生(不可重複讀),但是帶來了更多的性能損失。
4、ISOLATION_READ_COMMITTED 保證一個事務修改的數據提交後才能被另外一個事務讀取。另外一個事務不能讀取該事務未提交的數據。這種事務隔離級別可以避免髒讀出現,但是可能會出現不可重複讀和幻像讀。該級別適用於大多數系統。
5、ISOLATION_READ_UNCOMMITTED 這是事務最低的隔離級別,它充許別外一個事務可以看到這個事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀
1: Dirty reads--讀髒數據。也就是說,比如事務A的未提交(還依然緩存)的數據被事務B讀走,如果事務A失敗回滾,會導致事務B所讀取的的數據是錯誤的。
2: non-repeatable reads--數據不可重複讀。比如事務A中兩處讀取數據-total-的值。在第一讀的時候,total是100,然後事務B就把total的數據改成200,事務A再讀一次,結果就發現,total竟然就變成200了,造成事務A數據混亂。
3: phantom reads--幻象讀數據,這個和non-repeatable reads相似,也是同一個事務中多次讀不一致的問題。但是non-repeatable reads的不一致是因爲他所要取的數據集被改變了(比如total的數據),但是phantom reads所要讀的數據的不一致卻不是他所要讀的數據集改變,而是他的條件數據集改變。比如Select account.id where account.name="ppgogo*",第一次讀去了6個符合條件的id,第二次讀取的時候,由於事務b把一個帳號的名字由"dd"改成"ppgogo1",結果取出來了7個數據。
Spring的事務傳播
key屬性確定代理應該給哪個方法增加事務行爲。這樣的屬性最重要的部份是傳播行爲。有以下選項可供使用:
PROPAGATION_REQUIRED--支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。
PROPAGATION_SUPPORTS--支持當前事務,如果當前沒有事務,就以非事務方式執行。
PROPAGATION_MANDATORY--支持當前事務,如果當前沒有事務,就拋出異常。
PROPAGATION_REQUIRES_NEW--新建事務,如果當前存在事務,把當前事務掛起。
PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。
PROPAGATION_NEVER--以非事務方式執行,如果當前存在事務,則拋出異常。
ETL是什麼
ETL即數據抽取(Extract)、轉換(Transform)、裝載(Load)的過程。(數據倉庫知識)
Hibernate 的樂觀鎖,悲觀鎖
Hibernate悲觀鎖:在數據有加載的時候就給其進行加鎖,直到該鎖被釋放掉,其他用戶纔可以進行修改,優點:數據的一致性保持得很好,缺點:不適合多個用戶併發訪問。當一個鎖住的資源不被釋放掉的時候,這個資源永遠不會被其他用戶進行修改,容易造成無限期的等待。
Hibernate樂觀鎖:就是在對數據進行修改的時候,對數據纔去版本或者時間戳等方式來比較,數據是否一致性來實現加鎖。優點比較好。
抽象工廠模式和工廠模式區別
工廠方法模式一般注重的是這個方法是怎麼創建的,開發當中的大部分可能是圍繞着這個方法的創建上,部分側重點應該是縱向上。而抽象工廠模式注重的是創建哪些的產品,很好的去劃分這些產品,部分側重點應該是在橫向上
介紹Java中的深度克隆和淺度克隆
⑴淺複製(淺克隆)
被複制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺複製僅僅複製所考慮的對象,而不復制它所引用的對象。
⑵深複製(深克隆)
被複制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被複制過的新對象,而不再是原有的那些被引用的對象。換言之,深複製把要複製的對象所引用的對象都複製了一遍。
SQL中的左右連接
右接連 right join 或 right outer join;左連接 left join 或者 left outer join(主要是查詢判斷以那個表爲準)
JMS的運行機制,同步和異步消息
J2EE爲我們提供了JMS和消息驅動Bean(Message-Driven Bean),用來實現應用程序各個部件之間的異步消息傳遞。
1.發佈/訂閱(publish/subscribe)
發佈/訂閱消息系統支持一個事件驅動模型,消息產生者和使用者都參與消息的傳遞。產生者發佈事件,而使用者訂閱感興趣的事件,並使用事件。產生者將消息和一個特定的主題(Topic)連在一起,消息系統根據使用者註冊的興趣,將消息傳給使用者。
2.點對點(Peer to peer)
在點對點的消息系統中,消息分發給一個單獨的使用者。它維持一個"進入"消息隊列。消息應用程序發送消息到一個特定的隊列,而客戶端從一個隊列中得到消息。
Java中HashMap,HashSet,TreeMap,LinkedHashMap的區別。
HashMap和Hashtable實現類:
HashMap與HashTable的區別:
1、 同步性:Hashtable是同步的,這個類中的一些方法保證了Hashtable中的對象是線程安全的。而HashMap則是異步的,因此HashMap中的對象並不是線程安全的。因爲同步的要求會影響執行的效率,所以如果你不需要線程安全的集合那麼使用HashMap是一個很好的選擇,這樣可以避免由於同步帶來的不必要的性能開銷,從而提高效率。
2、 值:HashMap可以讓你將空值作爲一個表的條目的key或value,但是Hashtable是不能放入空值的。HashMap最多隻有一個key值爲null,但可以有無數多個value值爲null。
注意:
1、用作key的對象必須實現hashCode和equals方法。
2、不能保證其中的鍵值對的順序
3、儘量不要使用可變對象作爲它們的key值。
TreeMap:
Map接口派生了一個SortMap子接口,SortMap的實現類爲TreeMap。TreeMap也是基於紅黑樹對所有的key進行排序,有兩種排序方式:自然排序和定製排序。Treemap的key以TreeSet的形式存儲,對key的要求與TreeSet對元素的要求基本一致。
HashSet:
Set不允許重複
允許 null,重複的null只算一個
判斷是否存在一個數據(是否重複),先判斷其hashCode是否存在,若存在再逐個判斷hashCode相同的數據是否相等
判斷是否相等,除了hashCode相等外,還要判斷對象引用相等(==),或者 equals
如果一個對象的hashCode變動了,會造成找不到這個對象,也就出現了內存泄漏的危險。
LinkedHashMap:
它的父類是HashMap,使用雙向鏈表來維護鍵值對的次序,迭代順序與鍵值對的插入順序保持一致。LinkedHashMap需要維護元素的插入順序,so性能略低於HashMap,但在迭代訪問元素時有很好的性能,因爲它是以鏈表來維護內部順序。
寫一個Singleton出來
Struts2和Struts1的區別
說說你對Spring的理解?
在Hibernate中的Lazy有什麼作用?它的優點是什麼?缺點是什麼?(http://www.importnew.com/2281.html Hibernate面試問題集錦)
說說你在做項目的時候,用SSH整合常見的問題有哪些?
請說出ajax底層是如何實現的?主要是靠什麼對象來操作?它的執行過程是什麼? onreadystatechange指定的回調函數一共調用幾次?
而每一次調用所返回的狀態碼是什麼意思?
如何一次查詢一個對象中包含的另一個對象的信息?(要求:1.不要設置lazy爲false,2.不要設置fetch (抓取策略)爲join)
提示:當需要查詢一個對象的時候,如果這個對象中有另外一個對象的引用,默認情況下,由於hibernate支持延遲加載,所以包含的這
個對象信息是不會查詢出來,而要等到你需要真正用到的時候纔會發出SQL語句,去數據庫中查詢.
在Hibernate中如何使用存儲過程?
介紹一下Java語言中線程同步?
談談Java解析XML的幾種技術,以及區別。
重寫equal方法時爲何通常也會重寫hashCode,兩者存在什麼樣的關係,equal則hashCode相同?反過來成立嗎,爲什麼?
HTTP請求的GET與POST方式的區別
SSH2的優缺點
Iterator與ListIterator有什麼區別?
接口和抽象類的區別
類的特性
set的特性
set和list的區別
list的特性
list和map的區別
js怎樣把一個頁面上的數據傳到一個彈出的對話框上
xml的解釋方法
什麼是json
什麼是回調函數
你用過什麼Ajax框架
會不會用Extjs
用什麼辦法計算一個數組的長度
計算數組的長度是用length屬性還是length()方法
冒泡排序和哈稀排序的時間複雜度
java裏面HashMap裏的哈稀排序是怎麼實現的
怎樣控制table中奇數行和偶數行顏色不同
mysql數據庫的引擎有哪些
socket用到的兩種協議
介紹一下jbpm
jbpm是如何工作的
簡述jbpm用到的數據表
類與對象的區別
網絡傳輸裏面的七層或四層架?