JDK/JRE/JVM的關係是什麼?java
JDK(Java Development Kit)是針對Java開發員的產品,是整個Java的核心,包括了Java運行環境JRE、Java工具和Java基礎類庫。Java Runtime Environment(JRE)是運行JAVA程序所必須的環境的集合,包含JVM標準實現及Java核心類庫。JVM是Java Virtual Machine(Java虛擬機)的縮寫,是整個java實現跨平臺的最核心的部分,可以運行以Java語言寫做的軟件程序。sql
咱們開發的實際狀況是:咱們利用JDK(調用JAVA API)開發了屬於咱們本身的JAVA程序後,經過JDK中的編譯程序(javac)將咱們的文本java文件編譯成JAVA字節碼,在JRE上運行這些JAVA字節碼,JVM解析這些字節碼,映射到CPU指令集或OS的系統調用。數據庫
說出Servlet的生命週期編程
Servlet生命週期共4個階段:緩存
實例化---初始化---服務--銷燬tomcat
實例化:當用戶第一次發送請求當時候,容器判斷是否已經建立過servlet對象,因爲是第一次,因此沒有建立TOMCAT進行建立安全
初始化:建立完畢,調研init方法初始化服務器
第二次請求,判斷已經存在則無需進行實例化喝初始化網絡
服務:初始化完畢,調用service方法,進行doget dopost方法去處理相應當請求併發
銷燬:tomcat關閉,調用destory方法銷燬servlet對象
jdbc訪問數據庫步驟
JDBC編程有6步,分別是
1.加載sql驅動,
2.使用DriverManager獲取數據庫鏈接,
3.使用Connecttion來建立一個Statement對象 Statement對象用來執行SQL語句,
4.執行SQL語句,
5.操做結果集,
6.回收數據庫資源。
反射的做用和實現?
JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法;這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制。
Java反射框架提供如下功能:
①、在運行時判斷任意一個對象所屬的類
②、在運行時構造任意一個類的對象
③、在運行時判斷任意一個類所具備的成員變量和方法(經過反射設置能夠調用 private)
④、在運行時調用任意一個對象的方法
反射最重要的用途就是開發各類通用框架。
不少框架(好比 Spring)都是配置化的(好比經過 XML文件配置JavaBean,Action之類的),爲了保證框架的通用性,他們可能根據配置文件加載不一樣的對象或類,調用不一樣的方法,這個時候就必須用到反射——運行時動態加載須要加載的對象。
如何處理前臺到後臺的亂碼
方法一:修改tomcat配置,在server.xml中找到<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8"/>內容,並將標紅的內容加入便可。不過此種方法只能侷限於用tomcat的項目中,若是後期項目遷移到其餘服務仍是會出現亂碼問題,因此對項目的遷移性會形成很差影響。
方法二: 若是是在頁面中出現亂碼,那我建議在頁面有中文數據的參數前加入encodeURI(),例如:encodeURI('內存利用率')。經過此方法對數據進行一次解碼就能夠解決亂碼問題。
方法三:若是是在java後臺產生亂碼,那能夠經過String id = new String(str.getBytes("ISO8859-1"), "utf-8");此方法解決。
存儲過程的優缺點
優勢
1. 運行速度:對於很簡單的sql,存儲過程沒有什麼優點。對於複雜的業務邏輯,由於在存儲過程建立的時候,數據庫已經對其進行了一次解析和優化。存儲過程一旦執行,在內存中就會保留一份這個存儲過程,這樣下次再執行一樣的存儲過程時,能夠從內存中直接調用,因此執行速度會比普通sql快。
2. 減小網絡傳輸:存儲過程直接就在數據庫服務器上跑,全部的數據訪問都在數據庫服務器內部進行,不須要傳輸數據到其它服務器,因此會減小必定的網絡傳輸。可是在存儲過程當中沒有屢次數據交互,那麼實際上網絡傳輸量和直接sql是同樣的。並且咱們的應用服務器一般與數據庫是在同一內網,大數據的訪問的瓶頸會是硬盤的速度,而不是網速。
3. 可維護性:的存儲過程有些時候比程序更容易維護,這是由於能夠實時更新DB端的存儲過程。 有些bug,直接改存儲過程裏的業務邏輯,就搞定了。
4. 加強安全性:提升代碼安全,防止 SQL注入。這一點sql語句也能夠作到。
5. 可擴展性:應用程序和數據庫操做分開,獨立進行,而不是相互在一塊兒。方便之後的擴展和DBA維護優化。
缺點
1. SQL自己是一種結構化查詢語言,但不是面向對象的的,本質上仍是過程化的語言,面對複雜的業務邏輯,過程化的處理會很吃力。同時SQL擅長的是數據查詢而非業務邏輯的處理,若是若是把業務邏輯全放在存儲過程裏面,違背了這一原則。
2. 若是須要對輸入存儲過程的參數進行更改,或者要更改由其返回的數據,則您仍須要更新程序集中的代碼以添加參數、更新調用,等等,這時候估計會比較繁瑣了。
3. 開發調試複雜,因爲IDE的問題,存儲過程的開發調試要比通常程序困難。
4. 沒辦法應用緩存。雖然有全局臨時表之類的方法能夠作緩存,但一樣加劇了數據庫的負擔。若是緩存併發嚴重,常常要加鎖,那效率實在堪憂。
5. 不支持羣集,數據庫服務器沒法水平擴展,或者數據庫的切割(水平或垂直切割)。數據庫切割以後,存儲過程並不清楚數據存儲在哪一個數據庫中。
左鏈接/右鏈接/內鏈接的區別
數據庫索引的做用及優勢和缺點
索引就像是書的目錄,是與表或視圖關聯的磁盤上結構,能夠加快從表或視圖中檢索行的速度。索引中包含由表或視圖中的一列或多列生成的鍵。這些鍵存儲在一個結構(BTree)中,使SQL能夠快速有效地查找與鍵值關聯的行。
2. 爲何要創建索引,即索引的優勢:
① 創建索引的列能夠保證行的惟一性,生成惟一的rowId
② 創建索引能夠有效縮短數據的檢索時間
③ 創建索引能夠加快表與表之間的鏈接
④ 爲用來排序或者是分組的字段添加索引能夠加快分組和排序順序
3. 索引的缺點:
① 建立索引和維護索引須要時間成本,這個成本隨着數據量的增長而加大
② 建立索引和維護索引須要空間成本,每一條索引都要佔據數據庫的物理存儲空間,數據量越大,佔用空間也越大(數據表佔據的是數據庫的數據空間)
③ 會下降表的增刪改的效率,由於每次增刪改索引須要進行動態維護,致使時間變長
4. 什麼樣的表跟列要創建索引:
① 總的來講就是數據量大的,常常進行查詢操做的表要創建索引
② 表中字段創建索引應該遵循幾個原則:
1) 越小的數據類型一般更好:越小的數據類型一般在磁盤、內存中都須要更少的空間,處理起來更快。
2) 簡單的數據類型更好:整型數據比起字符,處理開銷更小,由於字符串的比較更復雜,處理起來也更耗時。
3) 儘可能避免NULL:應該指定列爲NOT NULL。含有空值的列很難進行查詢優化,由於它們使得索引、索引的統計信息以及比較運算更加複雜。你應該用0、一個特殊的值或者一個空串代替空值。
4) 對非惟一的字段,例如「性別」這種大量重複值的字段,增長索引也沒有什麼意義,因此索引的創建應當更多的選取惟一性更高的字段。
③ 表與錶鏈接用於多表聯合查詢的約束條件的字段應當創建索引
④ 用於排序的字段能夠添加索引,用於分組的字段應當視狀況看是否須要添加索引。
⑤ 添加多列索引的時候,對應的多條件查詢能夠觸發該索引的同時,索引最左側的列的單條件查詢也能夠觸發。
⑥ 若是有些表註定只會進行查詢全部,也就不必添加索引,由於查詢所有隻能進行全量搜索即掃描全表。
5. 索引的原理:
索引的原理大體歸納爲以空間換時間,數據庫在未添加索引的時候進行查詢默認的是進行全量搜索,也就是進行全局掃描,有多少條數據就要進行多少次查詢,而後找到相匹配的數據就把他放到結果集中,直到全表掃描完。而創建索引以後,會將創建索引的KEY值放在一個n叉樹上(BTree)。由於B樹的特色就是適合在磁盤等直接存儲設備上組織動態查找表,每次以索引進行條件查詢時,會去樹上根據key值直接進行搜索,次數約爲log總條數,底數爲頁面存儲數,例如一個100萬數據的表,頁面存儲數爲100,那麼有索引的查詢次數爲3次log1000000100,可是全量搜索爲100萬次搜索,這種方式相似於二分法,可是這個是n分法。
索引對增刪改的影響實際數據修改測試:
一個表有字段A、B、C,同時進行插入10000行記錄測試
在沒有建索引時平均完成時間是2.9秒
在對A字段建索引後平均完成時間是6.7秒
在對A字段和B字段建索引後平均完成時間是10.3秒
在對A字段、B字段和C字段都建索引後平均完成時間是11.7秒
從以上測試結果能夠明顯看出索引對數據修改產生的影響