1. 程式人生 > >今天總結的一些Java的一些基礎知識

今天總結的一些Java的一些基礎知識

1.Java匯出excel表的HssfWorkBook

.一級快取(sqlSession)

    一級快取是SqlSession自帶的。SqlSession物件被建立,一級快取就存在了。     如果SqlSession物件關閉或呼叫清理方法,會導致快取失效。     快取底層實現就是通過HashMap實現的。     一級快取介質——記憶體

3.二級快取(cacheEnabled)

    二級快取介質——記憶體,硬碟     二級快取SqlSessionFactory進行管理的。SqlSessionFactory物件是程序級別的。可以被多個SqlSession所共享。

跟Web應用中application物件作用範圍類似。

    MyBatis框架自帶了二級快取,是通過HashMap實現的。         二級快取使用,需要在主檔案中進行配置:             ①啟用二級快取

<!-- 啟用二級快取 -->

<setting name="cacheEnabled" value="true"/>

    ②在XxxMapper.xml檔案中配置二級快取策略

<cache eviction="FIFO" flushInterval="60000"readOnly="true" size="512"/>

    eviction:快取策略         FIFO:First In First Out         LRU:Least Recently Used     flushInterval:快取重新整理時間間隔,時間是毫秒,檢查是否存在過期物件     size:快取中儲存的物件個數     readOnly:是否只讀

    ③對於MyBatis自帶的二級快取,實體類可以不用實現可序列化介面。         如果使用的是EhCahce快取元件,有時會將資料快取到硬碟上,需要可序列化支援的。必須實現java.io.Serializable

Hibernate之一級快取和二級快取

1:Hibernate的一級快取:

1.1:使用一級快取的目的是為了減少對資料庫的訪問次數,從而提升hibernate的執行效率;(當執行一次查詢操作的時候,執行第二次查詢操作,先檢查快取中是否有資料,如果有資料就不查詢資料庫,直接從快取中獲取資料);

1.2:Hibernate中的一級快取,也叫做session的快取,它可以在session範圍內減少資料庫的訪問次數,只在session範圍內有效,session關閉,一級快取失敗;

1.3:一級快取的特點,只在session範圍有效,作用時間短,效果不是特別明顯,在短時間內多次操作資料庫,效果比較明顯。

1.4:當呼叫session的save/saveOrUpdate/get/load/list/iterator方法的時候,都會把物件放入session快取中;

1.5:session的快取是由hibernate維護的,使用者不能操作快取內容;如果想操作快取內容,必須通過hibernate提供的evict/clear方法操作

1.6:快取相關的方法(在什麼情況下使用上面方法呢?批量操作情況下使用,如Session.flush();先與資料庫同步,Session.clear();再清空一級快取內容):

session.flush();讓一級快取與資料庫同步;

session.evict();清空一級快取中指定的物件;

session.clear();清空一級快取中所有的物件;

1.7:面試題,不同的session是否會共享快取資料?

  答:不會哦~~~

1.8:list和iterator的區別?

(1)list查詢:

答: 一次性把所有的記錄都查詢出來了;會放入快取,不會從快取中取資料;

(2)iterate(N+1次查詢):

答: N表示所有的記錄總數,即會發送一條語句查詢所有的記錄的主鍵,這是第一條查詢語句,再根據每一個主鍵取資料庫查詢,這是根據第一次查詢的條數進行N次查詢操作;會放入快取,也會從快取中取出資料;

2:Hibernate的懶載入:

2.1:懶載入概念:當用到資料的時候才向資料庫查詢,這就是hibernate的懶載入特性。

使用懶載入的目的,是提高程式執行效率。

2.2:查詢操作:get()方法/load()方法

(1)get()方法,及時載入。及時查詢操作;只要呼叫get方法立刻向資料庫查詢。

(2)load()方法,預設懶載入,即在使用資料的時候,才向資料庫傳送查詢的sql語句。session關閉以後,不可以使用懶載入。

複製程式碼 #懶載入預設為true,即為懶載入,可以改為非懶載入。即lazy="false" #lazy="false" 關閉懶載入 #lazy="true"使用懶載入 #lazy="extra"在真正使用資料的時候才向資料庫傳送查詢的sql語句。集合屬性懶載入的時候提升效率。如果呼叫集合的size()/isEmpty()方法只是統計,不真正查詢資料。

<class name="類名稱" table="資料表名稱" lazy="false">

...... </class>

複製程式碼

  2.3:懶載入異常:

Session關閉後,不能使用懶載入資料,如果session關閉後,使用懶載入資料報錯如: 複製程式碼

org.hibernate.LazyInitializationException: could not initialize proxy - no Session     at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)     at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)     at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)     at com.bie.lesson05.Dept_$$_javassist_1.getDeptName(Dept_$$_javassist_1.java)     at com.bie.lesson05.ManyToManyTest.lazyTest(ManyToManyTest.java:241)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)     at java.lang.reflect.Method.invoke(Unknown Source)     at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)     at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)     at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)     at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)     at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)     at org.junit.runners.ParentRunner.run(ParentRunner.java:363)     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)     at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

複製程式碼

如何解決session關閉後不能使用懶載入載入資料的問題:

方式一:可以先在關閉session之前使用一下資料,這樣關閉以後就可以使用此資料了。如Dept.getDeptName();

方式二(推薦):強迫代理物件初始化操作:Hibernate.initialize(物件);

方式三:關閉懶載入(lazy="false");

方式四(推薦):在使用資料之後再關閉session;

 3:二級快取:

    Hibernate提供的快取

    有一級快取、二級快取。 目的是為了減少對資料庫的訪問次數,提升程式執行效率!

    一級快取:

    基於Session的快取,快取內容只在當前session有效,session關閉,快取內容失效!

    特點:

    作用範圍較小! 快取的事件短。

    快取效果不明顯。

3.1:二級快取概述:

二級快取:

Hibernate提供了基於應用程式級別的快取即為二級快取,可以跨多個session,即不同的session都可以訪問快取資料。 這個快取也叫二級快取。

Hibernate提供的二級快取有預設的實現,且是一種可插配的快取框架!如果使用者想用二級快取,只需要在hibernate.cfg.xml中配置即可; 不想用,直接移除,不影響程式碼。

如果使用者覺得hibernate提供的框架框架不好用,自己可以換其他的快取框架或自己實現快取框架都可以。

3.2:檢視hibernate.properties配置檔案,二級快取如何配置? 複製程式碼

##########################

### Second-level Cache ###

##########################

#hibernate.cache.use_second_level_cache false【二級快取預設不開啟,需要手動開啟】

#hibernate.cache.use_query_cache true      【開啟查詢快取】

  ## choose a cache implementation 【二級快取框架的實現】

  #hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider

#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider

hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider 預設實現

#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider

#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider

#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider

複製程式碼

3.3:二級快取,使用步驟:

1) 開啟二級快取;

2)指定快取框架;

3)指定那些類加入二級快取;

4)測試; 複製程式碼

<!--****************** 【二級快取配置】****************** --> <!-- a.  開啟二級快取 --> <property name="hibernate.cache.use_second_level_cache">true</property> <!-- b. 指定使用哪一個快取框架(預設提供的) --> <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property> <!-- 開啟查詢快取 --> <property name="hibernate.cache.use_query_cache">true</property> <!-- c. 指定哪一些類,需要加入二級快取 --> <class-cache usage="read-write" class="com.bie.lesson11.Dept"/> <class-cache usage="read-only" class="com.bie.lesson11.Employee"/> <!-- 集合快取[集合快取的元素物件,也加加入二級快取] --> <collection-cache usage="read-write" collection="com.bie.lesson11.Dept.emps"/>         

複製程式碼

  3.4:快取策略:

<class-cache usage="read-only"/>     放入二級快取的物件,只讀; <class-cache usage="nonstrict-read-write"/>  非嚴格的讀寫 <class-cache usage="read-write"/>    讀寫; 放入二級快取的物件可以讀、寫; <class-cache usage="transactional"/>   (基於事務的策略)

  Jsp的問題 二,九大內建物件到底是哪九大呢?

    內建物件名          型別     request           HttpServletRequest     response       HttpServletResponse     config         ServletConfig     application    ServletContext     session        HttpSession     exception      Throwable     page           Object(this)     out            JspWriter     pageContext    PageContext

四大作用域 page域:    只能在當前jsp頁面使用                (當前頁面) request域: 只能在同一個請求中使用               (轉發) session域: 只能在同一個會話(session物件)中使用  (私有的) context域: 只能在同一個web應用中使用            (全域性的)

===========================================

1.測試Java網站的併發量:JMeter 和 postMan 2.Java的地址相當於C的指標

===========================================

基本型別的變數如果是臨時變數,只要定義了,就會分配記憶體空間,不管是否被賦值;如果是作為物件的屬性出現,只要該物件不例項化,就不會分配記憶體空間。

一個完整的Java程式執行過程會涉及以下記憶體區域: 1、暫存器:JVM內部虛擬暫存器,存取速度非常快,程式不可控制。 2、 棧:儲存區域性變數的值,包括: 1)用來儲存基本資料型別的值; 2)儲存類的例項,即堆區物件的引用(指標) 3)也可以用來儲存載入方法時的幀 3、堆:用來存放動態產生的資料,比如new出來的物件。注意創建出來的物件只包含屬於各自的成員變數,並不包括成員方法。因為同一個類的物件擁有各自的成員變數,儲存在各自的堆中,但是他們共享該類的方法,並不是每建立一個物件就把成員方法複製一次。

4、常量池:JVM為每個已載入的型別維護一個常量池,常量池就是這個型別用到的常量的一個有序集合。包括直接常量(基本型別,String)和對其他型別、方法、欄位的符號引用(1)。池中的資料和陣列一樣通過索引訪問。由於常量池包含了一個型別所有的對其他型別、方法、欄位的符號引用,所以常量池在Java的動態連結中起了核心作用。常量池存在於堆中。

5、程式碼段:用來存放從硬碟上讀取的源程式程式碼。 6、資料段:用來存放static定義的靜態成員。

注意: 1.一個Java檔案,只要有main入口方法,我們就認為這是一個Java程式,可以單獨編譯執行。 2.無論是普通型別的變數還是引用型別的變數(俗稱例項),都可以作為區域性變數,他們都可以出現在棧中。只不過普通型別的變數在棧中直接儲存它所對應的值,而引用型別的變數儲存的是一個指向堆區的指標,通過這個指標,就可以找到這個例項在堆區對應的物件。因此,普通型別變數只在棧區佔用一塊記憶體,而引用型別變數要在棧區和堆區各佔一塊記憶體。

===========================================

單列模式 1. 懶漢模式 複製程式碼

public class SingletonDemo {     private static SingletonDemo instance;     private SingletonDemo(){

    }     public static SingletonDemo getInstance(){         if(instance==null){             instance=new SingletonDemo();         }         return instance;     }

=========================================

 TCP和UDP的優缺點及區別

TCP的優點: 可靠,穩定 TCP的可靠體現在TCP在傳遞資料之前,會有三次握手來建立連線,而且在資料傳遞時,有確認、視窗、重傳、擁塞控制機制,在資料傳完後,還會斷開連線用來節約系統資源。 TCP的缺點: 慢,效率低,佔用系統資源高,易被攻擊 TCP在傳遞資料之前,要先建連線,這會消耗時間,而且在資料傳遞時,確認機制、重傳機制、擁塞控制機制等都會消耗大量的時間,而且要在每臺裝置上維護所有的傳輸連線,事實上,每個連線都會佔用系統的CPU、記憶體等硬體資源。 而且,因為TCP有確認機制、三次握手機制,這些也導致TCP容易被人利用,實現DOS、DDOS、CC等攻擊。

UDP的優點: 快,比TCP稍安全 UDP沒有TCP的握手、確認、視窗、重傳、擁塞控制等機制,UDP是一個無狀態的傳輸協議,所以它在傳遞資料時非常快。沒有TCP的這些機制,UDP較TCP被攻擊者利用的漏洞就要少一些。但UDP也是無法避免攻擊的,比如:UDP Flood攻擊…… UDP的缺點: 不可靠,不穩定 因為UDP沒有TCP那些可靠的機制,在資料傳遞時,如果網路質量不好,就會很容易丟包。 基於上面的優缺點,那麼: 什麼時候應該使用TCP: 當對網路通訊質量有要求的時候,比如:整個資料要準確無誤的傳遞給對方,這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸檔案的協議,POP、SMTP等郵件傳輸的協議。 在日常生活中,常見使用TCP協議的應用如下: 瀏覽器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ檔案傳輸 ………… 什麼時候應該使用UDP: 當對網路通訊質量要求不高的時候,要求網路通訊速度能儘量的快,這時就可以使用UDP。 比如,日常生活中,常見使用UDP協議的應用如下: QQ語音 QQ視訊 TFTP ……

有些應用場景對可靠性要求不高會用到UPD,比如長視訊,要求速率

小結TCP與UDP的區別:

1.基於連線與無連線; 2.對系統資源的要求(TCP較多,UDP少); 3.UDP程式結構較簡單; 4.流模式與資料報模式 ;

5.TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。

tcp協議和udp協議的差別 TCP UDP 是否連線 面向連線 面向非連線 傳輸可靠性 可靠 不可靠 應用場合 傳輸大量資料 少量資料 速度 慢 快

TCP與UDP區別總結:

1、TCP面向連線(如打電話要先撥號建立連線);UDP是無連線的,即傳送資料之前不需要建立連線

2、TCP提供可靠的服務。也就是說,通過TCP連線傳送的資料,無差錯,不丟失,不重複,且按序到達;UDP盡最大努力交付,即不保證可靠交付

3、TCP面向位元組流,實際上是TCP把資料看成一連串無結構的位元組流;UDP是面向報文的

UDP沒有擁塞控制,因此網路出現擁塞不會使源主機的傳送速率降低(對實時應用很有用,如IP電話,實時視訊會議等)

4、每一條TCP連線只能是點到點的;UDP支援一對一,一對多,多對一和多對多的互動通訊

5、TCP首部開銷20位元組;UDP的首部開銷小,只有8個位元組

6、TCP的邏輯通訊通道是全雙工的可靠通道,UDP則是不可靠通道

 ========================================================

Netty:客戶端和伺服器連線,當有連線的時候,建立一個channel,進行監聽 客戶端迴圈的傳送心跳包,連線傳送訊息,當有訊息的時候,進行判斷,當有訊息的時候,設定一個使用者id,然後把使用者設定為登入狀態,如果訊息是心跳,那麼空閒數就為零,當channel是空閒的,那麼設定空閒數+1,判斷空閒數是否大於三,當大於三斷開channel,並把使用者設定為離線狀態 ========================================================

spring的工作原理

1.springmvc請所有的請求都提交給DispatcherServlet,它會委託應用系統的其他模組負責負責對請求進行真正的處理工作。

2.DispatcherServlet查詢一個或多個HandlerMapping,找到處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理後,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver檢視解析器,找到ModelAndView物件指定的檢視物件

6.檢視物件負責渲染返回給客戶端。

為什麼要使用Spring:

AOP 讓開發人員可以建立非行為性的關注點,稱為橫切關注點,並將它們插入到應用程式程式碼中。使用 AOP後,公共服務(比如日誌、永續性、事務等)就可以分解成方面並應用到域物件上,同時不會增加域物件的物件模型的複雜性。

IOC 允許建立一個可以構造物件的應用環境,然後向這些物件傳遞它們的協作物件。正如單詞 倒置 所表明的,IOC 就像反過來的JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straightconstruction),每一個物件都是用其協作物件構造的。因此是由容器管理協作物件(collaborator)。

Spring即使一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換物件。有了Spring,只要用JavaBean屬性和配置檔案加入依賴性(協作物件)。然後可以很容易地在需要時替換具有類似介面的協作物件。

Spring 框架是一個分層架構,由 7 個定義良好的模組組成。Spring模組構建在核心容器之上,核心容器定義了建立、配置和管理bean 的方式,如圖 1 所示。

組成 Spring 框架的每個模組(或元件)都可以單獨存在,或者與其他一個或多個模組聯合實現。每個模組的功能如下:

核心容器:核心容器提供 Spring框架的基本功能。核心容器的主要元件是BeanFactory,它是工廠模式的實現。BeanFactory使用控制反轉(IOC)模式將應用程式的配置和依賴性規範與實際的應用程式程式碼分開。

Spring 上下文:Spring 上下文是一個配置檔案,向 Spring框架提供上下文資訊。Spring上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和排程功能。

Spring AOP:通過配置管理特性,Spring AOP 模組直接將面向方面的程式設計功能整合到了Spring框架中。所以,可以很容易地使 Spring 框架管理的任何物件支援 AOP。Spring AOP 模組為基於Spring的應用程式中的物件提供了事務管理服務。通過使用 Spring AOP,不用依賴EJB元件,就可以將宣告性事務管理整合到應用程式中。

Spring  DAO:JDBCDAO抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商丟擲的錯誤訊息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常程式碼數量(例如開啟和關閉連線)。SpringDAO的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。

Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM的物件關係工具,其中包括JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和DAO異常層次結構。

Spring Web 模組:Web 上下文模組建立在應用程式上下文模組之上,為基於Web的應用程式提供了上下文。所以,Spring 框架支援與 Jakarta Struts的整合。Web模組還簡化了處理多部分請求以及將請求引數繫結到域物件的工作。

Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程式的 MVC實現。通過策略介面,MVC框架變成為高度可配置的,MVC 容納了大量檢視技術,其中包括JSP、Velocity、Tiles、iText 和 POI。

spring 框架的功能可以用在任何 J2EE伺服器中,大多數功能也適用於不受管理的環境。Spring的核心要點是:支援不繫結到特定 J2EE服務的可重用業務和資料訪問物件。毫無疑問,這樣的物件可以在不同 J2EE 環境 (Web或EJB)、獨立應用程式、測試環境之間重用。 ---------------------