學習java基礎:java開發常用技術

基礎部分
1. 線程和進程的區別


線程三個基本狀態:就緒、執行、阻塞


線程五個基本操作:創建、就緒、運行、阻塞、終止


進程四種形式:主從式、會話式、消息或郵箱機制、共享存儲區方式


進程是具有一定功能的程序關於某次數據集合上的一次運行活動,是系統進行資源分配和調度的一個獨立單位。一個進程包含多個線程。


線程是進程的一個實體,是CPU調度和分配的基本單元。


2. JSP四大域對象和九大內置對象


四大域對象:PageContext、request、session、servletContext


九大內置對象:request、response、application、config、Exception、page、out、pageContext、session


3. 使用final關鍵詞修飾一個變量的時候是引用不能變還是引用的對象不能變?


Final關鍵詞修飾一個變量是指引用變量不能變。引用變量所指對象的內容是可以變化的。


4. Private、protected、public的區別


private:
繼承成員但沒有訪問權限。(可以通過此類中的protected成員函數和public成員函數訪問。)
protected:
繼承成員,有訪問權限,類外沒有訪問權限,不可將繼承的protected修改爲private.
public:
繼承成員,有訪問權限,類外有訪問權限。


5. 父類和子類都有靜態代碼塊時,創建子類是先執行哪類?


靜態代碼塊在JVM加載類的時候先執行,父類先於子類執行。


6. Junit中before和beforeclass的區別


Before 在每個測試方法之前都會運行一次,只需要聲明public


BeforeClass 在類中只運行一次,必須聲明成public static


7. 單例模式


public class Singleton {  


    private static Singleton sl;  


    private Singleton (){}  


    public static synchronized Singleton getInstance() {  


    if (sl== null) {  


        sl= new Singleton();  


    }  


    return sl;  


    }  


}  


8. Redis數據結構


String-字符串 Hash-字典 list-列表 set-集合 sorted set-有序集合


9. HashMap、HashSet和HashTable的區別


HashMap基於Map接口實現,線程非同步所以不安全。鍵是唯一不可重複的,但是value值可以重複且允許空值存在。


HashTable是基於Dictionary類實現,線程默認同步所以是安全的,鍵值唯一且不爲空,value值不能爲空值。


HashSet是基於set實現的,以對象作爲元素,且拒絕重複對象。內部使用HashMap實現,其實就是HashMap的一個視圖。


10. ArrayList和LinkedList的區別


ArrayList是基於動態數組的數據結構,查詢較快


LinkedList是基於鏈表的數據結構,因爲不需要移動數據,所以增刪較快。


11. 線程中wait和sleep的區別


Wait方法屬於Object類,使線程放棄進入執行,進入線程等待池,只能使用notify或notifyAll方法才能喚醒此線程,線程會等待進入線程池。即使在執行此方法時,線程已進入線程池,依然會放棄執行,讓出線程池,交出鎖。即使線程被激活,也需要等待前方線程執行完畢後纔可進入線程池執行。


Sleep方法屬於Thread類,使線程在指定時間內暫停執行,讓cup暫時執行其他線程,但這個線程的監控狀態依然保持,當執行時間到了以後,該線程恢復到之前狀態,繼續執行,線程不會釋放鎖。


12. Equals和==的區別


==是一個運算符,是邏輯上的判斷,比較的是引用地址。


Equals是String的一個方法,是比較引用地址,在Object類時,Equals和==是一樣的,對於其他類來說如果重新了Equals方法,則比較的兩個對象的數據內容。


13. HashCode和Equals


HashCode和Equals都是在Object類中定義的,是對兩個對象地址的比較,如果重寫了Equals方法就必須重寫HashCode方法。


HashCode方法返回的是對象的散列碼,返回值是int類型的散列碼;Equals返回的是true和false。


如果兩個對象相同,他們的HashCode值必須相同;如果兩個對象的HashCode值相同,他們不一樣相同。


14. 方法重載和重寫的區別


方法重載:在同一個類中,方法名稱相同,參數類型和個數不同,返回值也可以不同。


方法重寫:父子類、接口和實現類之間的關係,子類可以重寫父類方法,但是參數個數、類型、返回值必須相同。


15. Junit中before和beforeclass的區別


Before是初始化方法,在每個程序運行之前都會執行一次。


Beforeclass在類中只運行一次。


16. STAR法則


Situation: 事情是在什麼情況下發生


Task: 你是如何明確你的任務的


Action: 針對這樣的情況分析,你採用了什麼行動方式


Result: 結果怎樣,在這樣的情況下你學習到了什麼


17. Cookie和Session的區別


cookie數據存儲在客戶的瀏覽器上,cookie是不安全的,別人可以分析存放在本地cookie並進行cookie欺騙;


Session存儲在服務器上,Session是安全的;當訪問增多時,Session會佔用服務器性能,可以考慮使用cookie


建議將登陸信息等重要信息保存在Session中,其他需要保留的信息可以存在cookie中。


18. JQuery有哪些選擇器


ID選擇器、類選擇器、層次選擇器、組合選擇器、屬性選擇器、表單選擇器等等


19. 事務的特性和隔離級別


特性:原子性、一致性、隔離性、持久性。


隔離級別:


 ① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。


 ② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。


 ③ Read committed (讀已提交):可避免髒讀的發生。


 ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。


20. POI上傳數據量過大


可分批處理  先行保存部分內容至數據庫,再清空list集合,重新導入內容


21. 前綴編碼


在一個字符集中,任何一個字符的編碼都不是另一個字符編碼的前綴。


22. JVM清理垃圾命令


GC.run


23. 循環隊列引入的目的


消除線性隊列的“假溢出”,充分利用存儲空間。


24. Webservice是什麼?它的引擎是什麼?


WebService是一個平臺獨立的、低耦合的,自包含的、基於可編程的web應用程序,可使用開放的xml標準來描述、發現、發佈、協調和配置這些應用程序,是用戶開發互操作的分佈式系統。最基本的目的就是提供在各個不同平臺的不同應用系統的系統工作能力。


25. Tomcat集羣中怎麼實現共享


1:Tomcat的Session複製。在一臺Tomcat的Session發生變化時,將變更的數據分發給其它的Tomcat服務器。


2: 採用 memcached session manager 共享session。


26. Git和Svn有什麼區別?


1:git是分佈式的版本控制系統,SVN不是。GIT和SVN都有自己的集中式版本庫或服務器,但是GIT更傾向分佈式使用。


2:GIT把內容按數據方式存儲,而SVN是按文件存儲的。


3:GIT可以很容易的發現未被合併的分支,SVN需要手動運行命令來確定代碼是否被合併。


4:GIT沒有一個全局的版本號,SVN有。但GIT內容完整性要優於SVN。


5:GIT在下載後即使在不聯網狀態也可以看到所有數據,但SVN必須要聯網。


6:GIT的提交速度優於SVN,且GIT可以有無限個版本庫,但SVN只有一箇中央數據庫,一旦這個中央庫有問題,則所有代碼都會全部癱瘓。


7:管理一個GIT庫相對於管理一個SVN庫更容易。


27. dubbo服務開發流程,運行流程?zookeeper註冊中心的作用?端口是多少?


服務容器負責啓動,加載,運行服務提供者。


1. 服務提供者在啓動時,向註冊中心(默認端口2181)註冊自己提供的服務。


2. 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。


3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給消費者。


4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。


5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。


28. redis爲什麼可以做緩存?redis都是怎麼用的?都用來存什麼了?redis的存儲結構?Redis集羣搭建?redis的事務;redis丟失問題


使用redis做緩存的原因:


redis是用C語言編寫的,穩定性和性能更好。支持集羣模式和持久化等特性,不會應爲緩存量太多而導致虛擬機崩潰。Redis是獨立部署的,即使網站更新,redis緩存的數據也不會消失。


集羣搭建(redis需要3臺主機,3臺從機,則配置6臺,需要6個端口):


1:安裝ruby環境,上傳接口工程,安裝接口程序,拷貝腳本到指定位置


2:創建6個redis實例,修改配置文件 ,然後啓動所有redis實例(爲簡化啓動步驟,可編寫啓動腳本)。


3:執行創建集羣的命令,連接測試


redis的事務


Redis的事務是一組命令的集合,Redis事務的實現需要用到 MULTI 和 EXEC 兩個命令,事務開始的時候先向Redis服務器發送 MULTI 命令,然後依次發送需要在本次事務中處理的命令,最後再發送 EXEC 命令表示事務命令結束。


redis丟失問題常見原因:


程序bug或人爲誤操作
· 因客戶端緩衝區內存使用過大,導致大量鍵被LRU淘汰
· 主庫故障後自動重啓,可能導致數據丟失
· 網絡分區的問題,可能導致短時間的寫入數據丟失
· 主從複製數據不一致,發生故障切換後,出現數據丟失
· 大量過期鍵,同時被淘汰清理


29. 消息中間件acitveMQ的作用、原理?


作用:acitveMQ就是消息隊列,activemq安裝之後,會有一個broker(經紀人)。


消息的生產者將消息發送到broker中,它不關心誰消費該消息。


消息的消費者去broker中獲取信息,它不關心誰提供消息


30. AJAX的怎樣實現同步或者怎樣實現異步?


$.ajax({
    async:false // 爲false 時 爲同步, 默認 爲true , 爲異步
})


31. fastDFS分佈式文件系統


fastDFS有兩個角色:跟蹤器(tracker)和存儲節點(storage);


存儲數據:


跟蹤器負責記錄圖片地址,和響應java接口訪問。java接口要想儲存圖片地址需向跟蹤器發送請求,然後由跟蹤器查找圖片倉庫地址發給java接口,同時記錄儲存過程,


Java接口配IP是配2個的,因爲有2個跟蹤器,而java接口連接IP時並不是智能的,如果連接第一個跟蹤器沒反應(第一個沒反應不是忙就是掛了),它就會連接第二個跟蹤器,不管連哪個跟蹤器,最終都會返回一個地址給java接口。而兩個跟蹤器之間是有通信的,它們會把信息同步的,這個信息也就是meta信息,也就是管理的帳本。


跟蹤器和存儲節點有通信間隔時間,這個時間由我們決定。而存儲節點之間也是有通信的,如果有一天存儲節點和存儲節點的倉庫都滿了,就擴張倉庫,創建下一組存儲節點和存儲倉庫。


取數據:


取數據的時候可以用java接口取,也可以用頁面裏的<img src=”http//…..jpg/>”取,但是src屬性會在頁面加載後發出2次請求。Src會根據地址去找跟蹤器,而跟蹤器會告訴它這地址圖片在哪個存儲節點身上,跟蹤器這臺機器上搭建是nginx服務器(反向代理服務器)這個服務器是用來解決高併發用的。Nginx服務器會根據你的路徑找到存儲節點身上的圖片。然後再將存儲節點的圖片拿回來,再加載給src,到img標籤裏。


啓動:


先設置IP再修改IP,然後三個命令分別啓動跟蹤器,存儲節點,Nginx服務器


32. Maven-熱部署


熱部署:就是maven管理的項目發佈到測試服務器,省去以往發佈時要不停的啓動、關閉tomcat這些繁瑣 的過程;熱:就是tomcat一直保持開啓狀態,


1、設置tomcat用戶名和密碼,然後啓動tomcat


2、在你所要發佈的項目裏的pom.xml裏設置你要發佈項目的路徑同時把tomcat用戶名和密碼也設置上


3、發送發佈命tomcat7:deploy


4、強硬發佈命令:tomcat7:redeploy


33. Log4j的輸出級別都有哪些


DEBUG Level: 指出細粒度信息事件對調試應用程序是非常有幫助的,就是輸出debug的信息.
INFO level: 表明消息在粗粒度級別上突出強調應用程序的運行過程,就是輸出提示信息.
WARN level: 表明會出現潛在錯誤的情形,就是顯示警告信息.
ERROR level: 指出雖然發生錯誤事件,但仍然不影響系統的繼續運行.就是顯示錯誤信息.
FATAL level: 指出每個嚴重的錯誤事件將會導致應用程序的退出.
ALL level: 是最低等級的,用於打開所有日誌記錄.
OFF level: 是最高等級的,用於關閉所有日誌記錄.


34. zookeeper存在什麼缺陷


本身不是爲高可用性設計,撐不住高流量容易導致系統崩潰。還有對網絡隔離的敏感也導致Zookeeper的脆弱


35. 開啓多線程的三種方式


1) 繼承thread類  重新run函數  對象。start開啓


2) 實現runnnable接口  重寫run函數


3) 實現callable


36. 接口collection和抽象類abstrator class 的區別


1)接口是公開的,不能有私有方法和變量,但是抽象類可以


2)實現一個接口必須實現接口的方法,抽象類可以重寫也可以不重寫


3)接口可以實現多重繼承,抽象類只能實現多個接口


37. override和overload的區別


重寫是指子類繼承父類,重寫父類的方法。重載是多態的一種表現形式,是指在同一類中方法名相同參數列表不同的同命名方法。


38. 匿名內部類


匿名內部類也就是沒有名字的內部類


正因爲沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫


但使用匿名內部類還有個前提條件:必須繼承一個父類或實現一個接口


框架部分
1. SpringMVC接收參數的方式


1:通過@PathVariable獲取路徑中傳遞的參數 在方法參數前


2:通過@ModelAttribute獲取post請求中的form表單數據 在方法參數前


3:通過HttpServletRequest獲取


3:用@RequestParam


2. SpringMVC配置文件


Web.xml:初始化spring容器 加載配置文件 contextConfigLocation


配置前端控制器 加載SpringMVC.Xml 設定startup爲1,啓動時加載 過濾所有請求


統一編碼方式 CharacterEncodingFilter 過濾所有請求


Spring.xml:配置包掃描器 context:component-scan


配置註解驅動 mvc:annotation-driven


配置視圖解析器 InternalResourceViewResolver <bean>


加載靜態資源 mvc:resources


配置多部件解析器 CommonsMultipartResolver 設定默認編碼和文件上傳的最大值


加載Java的其餘配置文件 context:property-placeholder


3. ssm和ssh的區別或者優勢


SSH通常指Struts2做控制器,Spring管理各種組件,Hibernate負責持久化層。


SSM通常指SpringMVC做控制器,Spring管理各層組件,Mybatis負責持久化層。


相同點:1:Spring依賴注入來管理各層組件


2:使用面向切面的AOP編程思想管理事務、日誌、權限等。


不同點:Struts2和SpringMVC控制器控制視圖和交互機制不同。


4. Struts2和SpringMVC的區別


1:SpringMVC開發效率高於Struts2,且SpringMVC以基本實現0配置。


2:SpringMVC實現依賴Servlet,是單例的,參數基於方法進行封裝。


3:SpringMVC是方法級別的攔截,一個方法對應一個request上下文,方法對應URL。方法之間的變量是不共享的,方法是獨立的,可以使用註解方式接收參數。


4:Struts2是類級別的攔截,一個類對應一個request的上下文,配置文件較複雜,架構比較費時費力。雖然每個方法之間也是獨立的,但所有類變量都是共享的,雖然不影響運行,但是編碼、讀程序卻比較麻煩。


5:Struts2實現依賴過濾器,是多例的,參數是基於屬性進行封裝。


6:Struts2需要封裝每一個Request,把每個生命週期變量封裝成一個個的MAP集合,並要保證線程的安全,比較耗費內存。


5. Hibernate和MYbatis的區別


相同點:Hibernate和Mybatis都是通過SessionFactoryBuider由xml文件生成SessionFactory,然後生成Session,由Session開啓執行事務和SQL語句。其中SessionFactoryBuider,SessionFactory,Session的生命週期都是差不多的。都支持JDBC和JTA事務處理。


不同點:


Mybatis:Mybatis可以進行更爲細緻的SQL優化,可以減少查詢字段。


Mybatis相對於Hibernate更容易掌握,門欄較低。


Hibernate:Hibernate的DAO層開發比Mybatis更簡單,因爲Mybatis需要維 護SQL和映射結果。


  Hibernate對對象的維護和緩存要比MyBatis好,對增刪改查的對象的維護要方便。


  Hibernate數據庫移植性很好,MyBatis的數據庫移植性不好,不同的數據庫需要寫不同SQL。


  Hibernate有更好的二級緩存機制,可以使用第三方緩存。MyBatis本身提供的緩存機制不佳。


6. Hibernate的一級緩存和二級緩存


Hibernate的一級緩存指的是Session緩存,因爲Session緩存是內置的,是Hibernate的默認配置;二級緩存指的是SessionFactory的外置緩存,因爲外置緩存是數據庫數據的拷貝,介質可以是內存或硬盤,需要手動開啓。


7. spring的事務管理


Spring的事務管理分爲聲明式和編程式。聲明式事務可以使用tx標籤方式、使用代理方式以及攔截器方式。編程式事務需要在配置中配置Session工廠,配置事務管理器,開啓註解掃描,使用@Service


8. springmvc的註解都有哪些


@Controller  @requestMapping @PathVariable @RequestParam@RequestBody @ResponseBody @RestController @ModelAttribute


9. hibernate的優化


1:數據庫設計時要降低關聯的複雜性,儘量不使用聯合主鍵,適用冗餘數據,不過分追求高範式


2:使用延遲加載


10. hibernate的五個核心類


Configuration,sessionfactory,Session,query接口,transaction接口


11. Spring的優點: 缺點


優點:


方便解耦,簡化開發---Spring就是一個大工廠,可以將所有對象創建和依賴關係維護,交給Spring管理


AOP編程的支持---Spring提供面向切面編程,可以方便的實現對程序進行權限攔截、運行監控等功能


聲明式事務的支持---只需要通過配置就可以完成對事務的管理,而無需手動編程


方便程序的測試---Spring對Junit4支持,可以通過註解方便的測試Spring程序


方便集成各種優秀框架---Spring不排斥各種優秀的開源框架,其內部提供了對各種優秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持


降低JavaEE API的使用難度---Spring 對JavaEE開發中非常難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大降低


 


缺點:


jsp中要寫很多代碼、控制器過於靈活,缺少一個公用控制器


12. spring工作機制和爲什麼要用


工作機制:Spring的核心就是IOC和AOP所以Spring的工作機制簡單的理解也就是IOC和AOP的工作機制。


 原因:藉助於Spring AOP,Spring IOC能夠很方便的使用到非常健壯、靈活的企業級服務,通過使用IoC能夠降低組件之間的耦合度,最終,能夠提高類的重用性,利於測試,而且更利於整個產品或系統集成和配置


13. AOP和IOC概念和在spring中如何應用


Springmvc是spring一部分


IOC:控制反轉,生產對象用。控制權由應用代碼中轉到了外部容器,控制權的轉移,是所謂的反轉。


AOP:面向切面編程,底層使用動態代理,作用:管理事務和安全監控,事務 只需要配置一次就不用再配置。


14. MVC設計思想


Mvc是一個架構設計思想:


用戶發送請求至控制器(Controller),控制層把用戶請求轉發給模型Model層進行數據處理,Model層內包含javabean組件、領域模型、業務層、持久層,Model層處理完數據層響應給控制層,控制層再次把數據發送給視圖View進行視圖編譯,然後由View層把視圖頁面返回給控制層,控制層再響應給用戶。


15. Springmvc框架原理


用戶發送請求給前端控制器DisPatcherserlvlet:前端控制器只負責接受請求,轉發請求,響應結果數據。DispatcherServlet就是一箇中央控制器。
前端控制器需要委託處理器映射器去尋找獲取Handler(Controller)
處理器映射器根據瀏覽器請求去尋找指定屬性的Controller
返回執行Chain(鏈),鏈中具有很多攔截器 ,Handler(Controller)在攔截器中間被返回給前端控制器。
前端控制器拿到Controller以後需要去執行Controller,交給處理器適配器去執行
處理器適配器負責調用Controller裏面的方法,進行執行Controller
Controller返回一個模型視圖(ModelAndView)
處理器適配器把這個ModelandVIew交給前端控制器
前端控制器把模型視圖ModelAndView給視圖解析器(viewResolver)解析出物理視圖
返回給前端控制器


渲染視圖:el+jsp el表達把model數據解析封裝到jsp頁面的過程就叫渲染視圖
返回用戶
16. POJO概念


POJO是mybatis中的返回值的參數類型,它和bean一樣意思。Bean是指類,而POJO把類看成對象。Mybatis是在JDBC上做的封裝,爲了使SQL語句不再是硬編碼和不用再按順序執行,爲了在框架裏獲取sql語句而設定的一種概念,得到的是動態SQL。


17. Freemaker頁面靜態化怎麼實現的,商品下架怎麼刪除,靜態化頁面可以發送異步請求嗎?Freemaker放在那裏,如何訪問


實現過程:


在商品添加服務中發送商品ID消息,接收消息中的商品ID。


從spring上下文中獲取Freemarker的配置文件(configuration)對象。


通過configuration創建模板(template對象),模板的名稱在java配置文件中配置。


創建模板數據:根據商品ID查詢出商品信息,如果沒有數據,拋出異常。


指定輸出文本。文本的路徑在java配置文件中配置,文本的名稱是商品ID,文本的後綴在java配置文件中配置。


調用template的process方法,生成輸出文件。


 


可以發送異步請求,使用Nginx訪問


18. Hibernate對象的三種形態


臨時狀態(transient):剛用new語句創建,還沒有被持久化,不處於Session的緩存中。處於臨時狀態的Java對象稱爲臨時對象。


持久化狀態(persistent):已經被持久化,加入到Session的緩存中。處於持久化狀態的Java對象稱爲持久化對象。


遊離狀態(detached):已經被持久化,但不再處於Session的緩存中。處於遊離狀態的Java對象稱爲遊離對象。


Java對象:開始生命週期——》臨時狀態——》持久化狀態——》遊離狀態——》結束生命週期


19. servlet的生命週期


 1,實例化階段  調用init()方法


 2,服務階段  調用service()方法


 3,銷燬階段  調用destroy()方法


首先客戶發送一個請求,Servlet是調用service()方法對請求進行響應,通過源代碼可見,service()方法中對請求的方式進行了匹配,選擇調用doGet,doPost等這些方法,然後再進入對應的方法中調用邏輯層的方法,實現對客戶的響應。在Servlet接口和GenericServlet中是沒有doGet,doPost等等這些方法的,HttpServlet中定義了方法,但是都是返回error信息,所以,我們每次定義一個Servlet的時候,都必須實現doPost,doGet等這些方法。


20. ORM


對象關係映射,也就是一種程序技術,用於實現面向對象編程語言裏不同類型系統的數據之間的轉換 。從效果上說,它其實是創建了一個可在編程語言裏使用的--“虛擬對象數據庫”。


21. JVM


JVM是java的核心和基礎,在java編譯器和os平臺之間的虛擬處理器。它是一種基於下層的操作系統和硬件平臺並利用軟件方法來實現的抽象的計算機,可以在上面執行java的字節碼程序。java編譯器只需面向JVM,生成JVM能理解的代碼或字節碼文件。Java源文件經編譯器,編譯成字節碼程序,通過JVM將每一條指令翻譯成不同平臺機器碼,通過特定平臺運行。


JVM執行程序的過程 :


I.加載.class文件


II.管理並分配內存


III.執行垃圾收集


22. JDBC


JDBC(java數據庫連接)是一種用於執行SQL語句的Java API,可以爲多種關係數據庫提供統一訪問,它由一組用Java語言編寫的類和接口組成。JDBC提供了一種基準,據此可以構建更高級的工具和接口,使數據庫開發人員能夠編寫數據庫應用程序,同時,JDBC也是個商標名。


23. Struts2框架工作流程及原理


1、客戶端瀏覽器發出HTTP請求.


2、根據web.xml配置,該請求被FilterDispatcher接收


3、根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值注入給Aciton


4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。


5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面


6、返回HTTP響應到客戶端瀏覽器


原理:


1 客戶端初始化一個指向Servlet容器(例如Tomcat)的請求 
2 這個請求經過一系列的過濾器(Filter)(這些過濾器中有一個叫做ActionContextCleanUp的可選過濾器,這個過濾器對於Struts2和其他框架的集成很有幫助,例如:SiteMesh Plugin) 
3 接着FilterDispatcher被調用,FilterDispatcher詢問ActionMapper來決定這個請是否需要調用某個Action 
4 如果ActionMapper決定需要調用某個Action,FilterDispatcher把請求的處理交給ActionProxy 
5 ActionProxy通過Configuration Manager詢問框架的配置文件,找到需要調用的Action類 
6 ActionProxy創建一個ActionInvocation的實例。 
7 ActionInvocation實例使用命名模式來調用,在調用Action的過程前後,涉及到相關攔截器(Intercepter)的調用。 
8 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。返回結果通常是(但不總是,也可 能是另外的一個Action鏈)一個需要被表示的JSP或者FreeMarker的模版。在表示的過程中可以使用Struts2 框架中繼承的標籤。在這個過程中需要涉及到ActionMapper 


數據庫部分
1. 數據庫優化問題


1:表的設計要符合三範式。


2:添加適當存儲過程,觸發器,事務等。


3:添加適當的索引,索引對查詢速度影響很大,必須添加索引。主鍵索引,唯一索引,普通索引,全文索引


4:讀寫分離(主從數據庫,主數據庫進行寫的操作,從數據庫驚醒讀的操作,主數據庫將數據更新到從數據庫)


5:對sql語句的一些優化,(查詢執行速度比較慢的sql語句)


a:查詢中避免使用通配符,儘量使用索引。選擇聯合查詢的聯合次序


b:在子查詢中避免使用in 或 not in 語句,使用where (NOT) exists的效果要好的多;避免使用BY RAND隨機顯示結果。


c:使用聯合(UNION)代替手動創建的臨時表,拆分表格。


d:儘可能的使用NOT NULL(非空),對MySQL的配置進行優化


6:分表分區


分表:把一張大表分成多張表。分區:把一張表裏面的分配到不同的區域存儲,


對mysql服務器硬件的升級操作。


2. 如果數據庫裏邊的大表添加字段  怎麼弄效率最高


alter table ~ add  ~  添加列


3. mysql默認的最大連接數是多少?


mysql的最大連接數默認是100, 最大可以達到16384


4. mysql分頁;limit關鍵字


limit關鍵字:LIMIT 可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)


5. 創建索引庫的優缺點?


優點:通過創建唯一性索引,可以保證數據庫中每一行數據的唯一性,2,可以大大加快數據的檢索速度,這也是創建索引的最主要的原因,3.可以加速表與表之間的連接,特別是在實現數據的參考完整性。


缺點:創建索引和維護索引需要消耗時間,這種時間隨着數據的增加而增加,2.索引佔用物理空間,需要的空間變大,3.當對數據庫中的數據進行增刪改的時候,索引也需要動態的維護,此時降低了維護速度。


6. 集合去重,數據庫去重;(集合去重有contains方法;數據庫去重用group by)


集合去重:


a:轉化爲Set集合,因爲HashSet集合不允許重複值存在。


b:使用雙重循環刪除重複的值或者用null代替


c:用contains方法


數據庫去重:


a:使用嵌套的查詢 得到所有的不重複數據的Id,使用 not in 關鍵字刪除所有ID不在以上範圍中的數據。


b:使用嵌套的查詢 得到所有的不重複數據的Id,將所有數據存儲到一個臨時表中,刪除原表,重新構建原表,將臨時表數據導入原表,刪除臨時表


7. 怎樣建立索引?


普通索引:添加index


Alter table user add index_name(name),括號內爲字段名稱


主鍵索引


Alert table user add primary key(id)


唯一索引:添加unique


Alert table user add unique (creattime)


全文索引:添加fulltext


Alert table user add fulltext(name)


8. mysql存儲過程


Mysql存儲過程就是爲完成特定功能的SQL語句集,經過編譯之後存儲在數據庫中,當需要使用該組SQL語句時,用戶只需要通過指定存儲過程的名字並給定參數就可以調用。


存儲過程是一個可編程的函數,在數據庫中創建並保存。可以有SQL語句和一些特殊的控制結構組成。可以看做是對編程中面向對象的模擬。


9. MySQL與Oracle的區別


1.  Oracle是大型數據庫而Mysql是中小型數據庫,Oracle市場佔有率達40%,Mysql只有20%左右,同時Mysql是開源免費的而Oracle價格非常高。


2. Oracle支持大併發,大訪問量,是OLTP最好的工具。


3. 安裝所用的空間差別也是很大的,Mysql安裝完後才152M而Oracle有3G左右,且使用的時候Oracle佔用特別大的內存空間和其他機器性能。


4.Oracle也Mysql操作上的一些區別


①主鍵 Mysql一般使用自動增長類型,在創建表時只要指定表的主鍵爲auto increment,插入記錄時,不需要再指定該記錄的主鍵值,Mysql將自動增長;Oracle沒有自動增長類型,主鍵一般使用的序列,插入記錄時將序列號的下一個值付給該字段即可;只是ORM框架是隻要是native主鍵生成策略即可。


②單引號的處理 MYSQL裏可以用雙引號包起字符串,ORACLE裏只可以用單引號包起字符串。在插入和修改字符串前必須做單引號的替換:把所有出現的一個單引號替換成兩個單引號。


③翻頁的SQL語句的處理 MYSQL處理翻頁的SQL語句比較簡單,用LIMIT 開始位置, 記錄個數;ORACLE處理翻頁的SQL語句就比較繁瑣了。每個結果集只有一個ROWNUM字段標明它的位置, 並且只能用ROWNUM<100, 不能用ROWNUM>80

④ 長字符串的處理 長字符串的處理ORACLE也有它特殊的地方。INSERT和UPDATE時最大可操作的字符串長度小於等於4000個單字節, 如果要插入更長的字符串, 請考慮字段用CLOB類型,方法借用ORACLE裏自帶的DBMS_LOB程序包。插入修改記錄前一定要做進行非空和長度判斷,不能爲空的字段值和超出長度字段值都應該提出警告,返回上次操作。 ⑤空字符的處理 MYSQL的非空字段也有空的內容,ORACLE裏定義了非空字段就不容許有空的內容。按MYSQL的NOT NULL來定義ORACLE表結構, 導數據的時候會產生錯誤。因此導數據時要對空字符進行判斷,如果爲NULL或空字符,需要把它改成一個空格的字符串。

⑥字符串的模糊比較 MYSQL裏用 字段名 like '%字符串%',ORACLE裏也可以用 字段名 like '%字符串%' 但這種方法不能使用索引, 速度不快。

⑦Oracle實現了ANSII SQL中大部分功能,如,事務的隔離級別、傳播特性等而Mysql在這方面還是比較的弱。

學習java技術,選擇知海匠庫互聯網學院www.zhihaijiangku.com,讓你成爲一名優秀的程序員!知海匠庫是海南生態軟件園唯一授權的互聯網人才實訓基地,大量項目實戰讓學員掌握真實技能,特色項目路演,讓學員瞭解參與項目組搭建到項目完成的整個項目流程,讓你畢業就有項目經驗,從容應對應聘和就業。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章