下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
Hibernate5第1 Hibernate概量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來數(shù)據(jù)庫。HibernateJDBCJava的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用。 (ersistence文件中、XML數(shù)據(jù)文件中等。Serializable接口的類。適合于少量的對象進行暫時的持久化,適合于在網(wǎng)絡ORM,即Object-RelationshipMap,對象關(guān)系映射。它是一種解決問題的思路,是象的方式將這些對象組織起來,以實現(xiàn)系統(tǒng)業(yè)務邏輯。或者說,ORM就是內(nèi)存中的對象與ORM實現(xiàn)框架的特點:開源的,實現(xiàn)了JDBC的封裝現(xiàn)了簡單的API,輕量級解決方案,持久化對象是一個POJO類。最有名的ORM框架就是Hibernate。JPAJPA,JavaPersistenceAPIJavaEE5ORM接口。它是一種規(guī)范,一套接口,但不是實現(xiàn)。用于實現(xiàn)這一規(guī)范的ORM很多,其中Hibernate就是之一。JPA、ORMHibernateJPA、ORMHibernate間的關(guān)系是,ORM是一種思想。JPA則是這種思想的具體的表現(xiàn)形式,是以Java語范表現(xiàn)出來的一種形式,是一套標準接口。Hibernate則是這套接HibernateHibernateJBOSS旗下的產(chǎn)品,2006JBOSSRedHat收購,變?yōu)榱思t帽公司Hibernate框架HibernateJar 的 Jar第2 Hibernate基本技Hibernate工作原第一個Hibernate定義持久化對象Hibernate中主要涉及兩個配置文件:主配置文件與映射文件。這兩個配置文件的約束文件在HibernateJar文件hibernate-core-5.0.1.Final.jar中的or.hibernate包中:DB主配置文件中的數(shù)據(jù)庫連接相關(guān)屬性值可在hibernate框架解壓目錄下的配置數(shù)據(jù)配置自動配置控制SQL映射主配置文件整體配置情CURDCURD象具有id,但該id在DB中不存在,則會拋出異常。對于增、刪、改的底層SQL執(zhí)行順Configurationorg.hibernate.cfg.Configurationnew連接配置、Hibernate配置等配置信息。一般情況下不用設置該屬性文件,其設置已經(jīng)放到了主配置文件中。若要設置,應將其放于src下。該文件的模板存放于Hibernate框架解壓下的project/etc下。無參configure()Configuration對象。所以,cfg是一個包含配置信息及映射信息的Configuration對象。帶參configure()Hibernatehibernate.cfg.xmlsrc類路徑下。但也可以更換路徑與文件名。此時,需要使用帶參的configuraion()方法。SessionFactory.SessionFactory接口的實基于其是線程安全的重量級對象,其創(chuàng)建與銷毀時系統(tǒng)開銷大,又是單例的特點,不用進行close()關(guān)閉。Sessionorg.hibernate.classic.Session接口是應用程序與Hibernate連接的API,是Hibernate向應用程序提供的DB的最主要接口。它提供了基本的保存、更新、刪除與查詢方法。由SessionFactory對象創(chuàng)建。Sessions=在Web應用中,多個用戶對同一應用,Hibernate會為每個用戶創(chuàng)建一個Session對象。所以是多例的。Sessionfinal成員變量,對于同一個用戶的操作,可能會產(chǎn)生多個事務,這多個事務若同時對同一個Session的同一個成員變量進行,就會引起并發(fā)問題。所以session是線程不安全的。Session對象的使用原Session。使用完畢,立即關(guān)閉。Session不要作為某個類的成員變量出現(xiàn),因為這樣會出現(xiàn)多個實例對象對同一個session的共享,使其更不安全。A、openSession()B、getCurrentSession()C、當前Session上下SessionSessionFactorygetCurrentSession()方法。不過,使用該方法獲取Session對象,需要在主配置文件中對Session所處的上下文環(huán)境,即事務環(huán)境進行。表示當前Session前Session所處的環(huán)境為Spring事務環(huán)境。D、為什么getCurrentSession()方式獲取到的是同一個對象,然后從getCurrentSession()Session,在進行事務提交或回滾后,會自動關(guān)閉,commit()rollback()finally{}之前執(zhí)行。也就是說,在執(zhí)行finally{}之前,session已經(jīng)關(guān)閉。若再手工關(guān)閉,將拋出異常。F、總結(jié):兩種獲取Session對象方式的區(qū)SessionopenSession()getCurrentSession()方式。Session對象。查詢對事務Session中的常用save()/persist():添加對象update():修改對象createQuery()/createSQLQuery():創(chuàng)建查詢對象Transaction 或--單例、多例與線程安全其是單例的。即無論多少用戶同一個業(yè)務,如LoginServlet,Web容器只會創(chuàng)建一個該Servlet實例。而該實例是允許多用戶的。Servlet中包含成員變量,則每個用戶對于成員變量的修改,均會影響到其他用戶所每個用戶只能自己的Session。所以,對于Session來說,就不存在并發(fā)的情況,也Struts2其是多例的。對于同一個業(yè)務,例如LoginAction,系統(tǒng)會為每一個用戶創(chuàng)建一個只能自己的Action。所以,對于Action來說,就不存在并發(fā)的情況,也就不存HibernateHibernate對于<session-factory/>,可以包含多個<property>元素,用于配置hibernate與HibernateDB連接四要素namekey的寫法,connection.*hibernate.connection.*的效果是完全相同的。是為了兼容以前的版本。url取值的urljdbc:mysql://localhost:3306/test。但,localhost:3306不寫也是正確的,jdbc:mysql:///test。DBproperties中,再將該屬性文件和加載一個屬性文件perties。hibernate.cfg.xml文件的<property/>中設置的屬性幾乎都可以在這個文件中設置。Hibernatehibernate.cfg.xml文件從屬性文件中DB連接四要素。這個四要素可以直接放到perties文件中,Hibernate即會自動。方言的設置方言的設置信息可以從 Jar文件hibernate-core-5.0.1.Final.jar中的 create-dropsessionFactory一旦關(guān)閉,表就自C3P0數(shù)據(jù)庫連接池配Hibernate5默認使用的是其自己開發(fā)的內(nèi)置(built-in)連接池。該連接池只是讓調(diào)試代碼時使用,在真正產(chǎn)品中不能使用??梢詮目刂婆_的Hibernate啟動信息中查看到。注意,若不指定第數(shù)據(jù)源,將使用Hibernate內(nèi)置的數(shù)據(jù)源。該數(shù)據(jù)源無法自動將ConnectionSessionFactory的屬性,一直被當前程序占用,SessionFactory在程序運行結(jié)束后無法自動關(guān)閉。而這將導致整個程序無法結(jié)束。其表現(xiàn)為Eclipse的Terminate按鈕一直顯示為紅色運行狀態(tài)。HibernateKeyHibernate框架解壓的project/etc 映射文件詳<hibernate-map要是package屬性,用于指定其所包含的<class/>類所在的包。此處的name屬性只需是類名即可;否則,需要是含包名的完整類名。<id/>與它們都是<class/>的子。用于指定PO類的id屬性與表的主健間的映射關(guān)系。到類型。這里的類型取值支持兩類:Java類型與Hibernate類型???。但若是對象類型,則需要寫上全類名,如java.lang.String。+?Hibernate中的所有類型。進制位。用0代表false,1代表true。sql-type屬性:當然映射文件中字段類型還支持一種類型,即數(shù)據(jù)庫中數(shù)據(jù)類型。但這為所使用DBMS的數(shù)據(jù)類型。 該策略是Hibernate自己在主鍵的值。當準備在數(shù)據(jù)庫表中插入一條新記錄時,首主鍵值,這就是increment生成策略。long、short、int及其封裝類的類型。這identity生成策DB來說已經(jīng)執(zhí)行。其測試情況是,不會產(chǎn)生任何有關(guān)id生成值的語句。因為其使用的是MySql自身的auto_increment來為id賦值。sequence生成策(sequencelong、short、int及其封裝類的類MySql數(shù)據(jù)庫,原本是不支持序列的。但稍作修改后,MySql也支持該生成策略。其測試情況是:在第一次執(zhí)行時,會輸出以下查詢語句,并報錯。hibernae_sequencenext_val,該值將作為要插入數(shù)據(jù)的主鍵值。當然,該查詢語句中的forupdate表示,對該表的操作使用了樂觀鎖。法進行自增運算。這就是報錯的原因:沒有初始值。手工為其賦初值1即可再運行了。使用這種標識符屬性生成策略可以根據(jù)不同的數(shù)據(jù)庫采用不同的生成策略,如Oracleuuid生成策uuid生成策略采用UUID(UniversallyUniqueIdentifier,通用唯一識別碼)算法來生成一32位長度的字符串。使用這種生成策略,要求屬性的類型必須為String類型。32位長的字符串,所以占JRESystemLibraryrt.jarjava.util包,即可看到UUID這個類。Step1:拷貝primary項目,重命名為uuidStringString。此生成策略,主要應用于業(yè)務相關(guān)主鍵。例如學號、號做主鍵。Hibernate的對象用于存放對象的介質(zhì)有三個:普通內(nèi)存(與Hibernate無關(guān)、Session緩存、數(shù)據(jù)庫。持久態(tài):persistent狀態(tài),在內(nèi)存中存在,DBSession第3 單表查Hibernate是DAO層技術(shù),對數(shù)據(jù)的使用,查詢是最為重要的。Hibernate的查詢技術(shù)非常強大,支持原始SQL語句查詢,支持QBC查詢及Hibernate特有的HQL查詢。SQL語句使用的是表名與字段名。HQL中直接使用字段名也是可以通過的。但若QueryHibernate進行HQL查詢的接口,支持動態(tài)綁定參數(shù)的功能。使用SessionQueryquery=SQLQueryHibernateSQLQuery接口的子接口。使用Session對象的createSQLQuery()方法可獲取SQLQuery對象。SQLQuerysqlQuery=ObjectListObject。使用SQLQuery的addEntity(Xxx.class)方法,可以將其結(jié)果泛型設定為指定類型。Criteriacriteria=分類查查詢測試前的準備工定義查詢的實定義主配置文定義Hibernate工具定義測試類的準備測試SQLHQLQBCSQLHQLQBCSQLsetXxx()綁定參數(shù):SetXxx(intposition,Objectvalue)。方法名中的Xxx表示該位置參數(shù)的類型。position表示第幾個占位符,從0開始計數(shù)。方式二:使用別名占位,setXxx()綁定參數(shù):setXxx(Stringname,Objectvalue)。別名名position表示第幾個占位符,從0開始計數(shù)。方式四:使用別名占位,setParamter()綁定參數(shù):SetParameter(Stringname,Objectvalue)。別名名規(guī)則為,冒號后跟別名,別名可是任意名稱。HQLQBC限制,約束。Restrictions具有很多靜態(tài)方法可用于表示關(guān)系比較。select*from…where…limitstartIndex,其中,startIndex為開始索引,設置從總查詢結(jié)果集的第幾條記錄作為本查詢結(jié)果子集0pageSize為該頁所包含的記錄數(shù)。SQLHQLQBCCriteriasetFirstResult()setMaxResults()Query接口CriteriaQuery接口無關(guān),所以這兩組完全相同的方法也是沒有關(guān)系SQLHQLQBCSQLHQLQBCSQL而count(name)則表示字段name的非空記錄數(shù)。HQLQBCSQL比,再用查詢出的值初始化創(chuàng)建的Student對象。HQLQBCSQL語句可以發(fā)現(xiàn),Hibernate為每個投映屬性指定了一個別名,而這個別名與Student類的屬性值無關(guān)。所以生成的對象屬性值均為空。SQL及人數(shù)多于1人 段HQLQBCQuery的list()與 Querylist()查Query的 te()查它們的區(qū)Querylist()ite()進行查詢,查看其控制臺的SQL語句的輸出情況,可A、使用list(),會將所有符合條件的記錄查詢出來;而使用ite(),則首先會查詢出所有符合條件的記錄的id,然后再根據(jù)這些id逐個查詢出記錄的具體內(nèi)容。查詢語句;而使用ite(),則會使用緩存機制,只有第一次會執(zhí)行SQL查詢,再往后的查詢會直接從緩存中。(4)N1使用Query的 所謂N+1用list(),則即可查詢出所有。而若使用i 的id,然后再逐個id進行select查詢,即需要經(jīng)過N+1次才能查詢出有效結(jié)果。這就是N1(5)N1問題的避若想使用Hibernate緩存,即使用ite()方法,還想避免N1問題,就要保證在執(zhí)行ite()時,緩存中有數(shù)據(jù)。這樣即可以利用緩存,又可以避免N+1問題。所以,可以在第一次查詢時使用list(),而以后的查詢則使用ite()。 命名查詢代碼從映射文件中將被命名的HQL,通過名稱讀出執(zhí)行。索優(yōu)化,則只需修改配置文件中的HQL后,重啟服務器即可,無需再編譯項目。 Java代碼中通過Session的getNamedQuery()方法可以將映射文件中指定的HQL出第4 關(guān)聯(lián)關(guān)系映的關(guān)系就屬于一對多關(guān)聯(lián)關(guān)系,外鍵字段一般情況下是被定義在City表中的?;靖舃a、bba的級聯(lián)對象。對象時,將級聯(lián)到其他DB中的相關(guān)聯(lián)的表。也會對所有關(guān)聯(lián)的持久化對象執(zhí)行l(wèi)ock()操作。關(guān)聯(lián)關(guān)系關(guān)聯(lián)關(guān)系的,也稱為外鍵,即為外鍵字段賦值。Hibernate默認情況下,關(guān)聯(lián)的雙方都具有權(quán)。即在代碼中均可通過調(diào)用自己關(guān)聯(lián)屬性的set方法來建立關(guān)聯(lián)關(guān)系。己的setCountry()方法來建立關(guān)聯(lián)關(guān)系。段賦值的方式,一方與多方,其底層執(zhí)行是不同的。country對象為ministercountryIdupdate語句來完成的。底層為什么是通過update來完成的呢?country要主動關(guān)聯(lián)ministers,則需要在語句來修改這個ministercountryId若關(guān)聯(lián)關(guān)系由多方,即Ministerminister.setCountry(country)方法,其實質(zhì)為什么這里又是通過inster語句完成關(guān)聯(lián)關(guān)系的呢?minister要主動關(guān)聯(lián)country,那么在minister出現(xiàn)之前就需要先在DB的表中插入完畢將要被關(guān)聯(lián)country后,再插入ministerInsert這個主關(guān)聯(lián)對象ministercountryIdDB。當一方具有關(guān)聯(lián)關(guān)系的權(quán),并且執(zhí)行save(一方對象)時,會產(chǎn)生一條update預處理語句,用于外鍵值。那么,為什么這個update為預處理語句,而不是立即執(zhí)行的呢?因為該語句所要update的這條多方表中記錄還未入,即還不存在。只有當這個多方對象也insert完畢后,即在多方表中出現(xiàn)這條記錄時,才會預處理語句update的執(zhí)因為該語句所要insert的這條多方數(shù)據(jù),其所關(guān)聯(lián)的一方對象還未入,即還不存在。所關(guān)系映能會出現(xiàn)循環(huán)問題,會拋出棧溢出錯誤StackOverflowError。1:n-單向關(guān)舉例 <one-to-many>與<key>Ministercountry_id的外鍵。注意,class指定類Minister的關(guān)系為1對多代碼運行運行條也不做save(minister)。運行結(jié)過程分代碼運行運行條
updatecountryinsert處于瞬時態(tài)。所以報錯:了沒有保存的瞬時態(tài)實例。聯(lián)屬性映射中增加級聯(lián)操作cascade=“save-update”。運行結(jié)過程分ministerinsertcountry的條件完成,故執(zhí)行預處理的update。代碼運行運行條在country運行結(jié)過程分當執(zhí)countryinsert,發(fā)現(xiàn)inversetrue,故將外鍵權(quán)交給多方,即minister。完成country的insert。需要為外鍵賦值。但由于是單向關(guān)聯(lián),MinisterCountry,1:n-雙向關(guān)舉例 CountrytoString()方法中對其關(guān)聯(lián)屬性代碼運行運行條countryinverse=“true”與級聯(lián)操作cascade=”save-update”。運行結(jié)過程分countryinsertinverse為true,故將外鍵權(quán)交給多方,即minister。完成country的insert。countryinsert完成后,進行級聯(lián)minister具有外鍵權(quán),所以在插入時直接將外鍵值寫入DB。代碼運行運行條countryinverse=“true”與級聯(lián)運行結(jié)過程分當執(zhí)行minister的insert,發(fā)現(xiàn)外鍵權(quán)交ministerinsert語句變?yōu)轭A處理語句對Country的insert。countryinsertNULL,定義實體定義映射定義測試n:1-單向關(guān)舉例 代碼運行分析運行條運行結(jié)過程分ministerinsert,發(fā)現(xiàn)外只可能是自鍵值與普通數(shù)據(jù)一起插入DB。而此時尚無外鍵關(guān)Country,故先ministerinsert語句執(zhí)行的是其級聯(lián)的對Country的insert。countryinsertn:m-單向關(guān)舉例 代碼運行分析運行條運行結(jié)過程分n:m-雙向關(guān)舉例 設置好了關(guān)聯(lián)關(guān)系,對哪一方進行save()操作均可完成對兩方的保存。代碼運行分析運行條運行結(jié)過程分級聯(lián)刪代碼運行分析運行條運行結(jié)過程分cascade=“delete-關(guān)系的“childrow”則稱為“孤兒”。DB中,若主表中的某記錄被從表關(guān)聯(lián),直接刪除主表中的該記錄,則會報出錯誤。其中就用到了“parentrow”的概念。中就用到了“childrow”的概念。代碼運行分析運行條運行結(jié)DBt_minister表中被指定為orphanminister過程分原因是Hibernae啟用了檢索優(yōu)化機制(后面講解。第5 多表連接查 基本理論中的多表連接分nmRS的笛卡兒積是一個(n+m)字段的集合,記為R×SRk1條記錄,Sk2條記錄,則R×S將有(k1×k2)條記錄。笛卡兒積查詢:select*fromRselect*fromR,Swhereselect*fromRinnerjoinSoninnerselect*fromRjoinSon條件連接:select*fromRSwhere內(nèi)連接:select*fromRinnerjoinSonselect*fromRleftouterjoinSonR.B=S.Bouter可省略select*fromRleftjoinSonselect*fromRrightouterjoinSonR.B=S.Bselect*fromRrightjoinSon 左外連HQL左外連接的查詢結(jié)果為List,其泛型為Object[]。每個List元素,即每個Object[],均包含兩個數(shù)組元素:數(shù)組的第一個元素為查詢出的Country對象。數(shù)組的第二個元素為該CountryMinisterCountry對象的集合屬性中包含多個Minister對象,則會生成多個Object[]元素。ListCountry對象所包含的集合元素的和。即,若查詢Country3MinisterList21366個對象分List012345CountrytoString()ministers進行輸出,但在MinistertoString()country進行輸出了。因為雙方均進行關(guān)聯(lián)屬性輸出,在這里會拋出StackOverflowError錯誤。迫切左外連接HQL迫切左外連接的查詢結(jié)果為List,但其泛型為Country。即系統(tǒng)已將查詢數(shù)據(jù)進行了自ListCountry對象所包含的集合元素的和,而非Country對象的個數(shù),即List元素會出現(xiàn)重復現(xiàn)象。HQL實現(xiàn)(去重QBC第6 Hibernate檢索優(yōu)將select的執(zhí)行進行了最大可能的“延遲”。3.3Hibernate將無法實現(xiàn)延遲加載??紤]到對老版本代碼的兼容問題,實體類最好不要使用final修飾。有當代碼中真正要除了對象的主鍵id屬性以外的其它屬性時,即真正要對象的詳情時,才會真正執(zhí)行select語句,即此時才會將對象真正加載到內(nèi)存。get()load()idselectnamestudent對象的load()idDB中獲取,直接從load()參數(shù)即可獲得。所以,對id屬性的,不會select的執(zhí)行。 下的javassist-3.18.1-GA.jar是Java字節(jié)碼操作助手,可完成字節(jié)碼增強。nameDBselect,然后namehandlerinitializedfalsetrue。load()get()與load()lazyfetch各具有若干值,它們不同值的組合,表示不同的對象加載策略。根據(jù)這兩 fetchselect查詢,此時其取值該加載策略,lazyselect語句進行查詢。該策略只會生成一條select語句,會將主表與從表進行迫切左外連接(左外連接:主表中的運行條運行結(jié)過程分”運行條運行結(jié)CountryidMinister對象。過程分”運行條運行結(jié)過程分了ministers.size()的語句運行。這就是對關(guān)聯(lián)對象的延遲加載。”運行條運行結(jié)過程分始化。注意另一個變量cachedSize的值,現(xiàn)在為-1。ministers.size()語句的執(zhí)行對minister總數(shù)的聚合函數(shù)的查詢select,但并未對country的ministers屬性進行初始化。但其執(zhí)行效果與select相同。所進行的延遲加載優(yōu)化配置。鑒于此fetch、lazy設置在多方映射文件的關(guān)聯(lián)屬性中,即于多方Minister的映射文件中<many-to-one/>的屬性設置略有不同:運行條運行結(jié)過程分到cname已經(jīng)有值了?!边\行條運行結(jié)對Minister對象執(zhí)行g(shù)et()后,會執(zhí)行兩條select語句:一個是查詢出指定過程分到cname已經(jīng)有值了。情況3:fetch=“select” ”DBtarget。在代碼中真正使用對象的詳情數(shù)據(jù)時,運行條運行結(jié)過程分情況4:fetch=“select” ”運行條運行結(jié) ame()時才執(zhí)行下一條select語句,查詢Country對象。過程分由于Country使用了延遲加載,所以只有當執(zhí)行到了Countrycountry= 過沒有加載到country中。 該策略要求對實體類“編譯時進行字節(jié)碼增強”,否則其與lazy=” 第7 Hibernate緩存機Cache緩存范圍分事務范圍緩存,即一級緩存,是單Session緩存。其只能被當前事務,每個事務都SessionFactory緩存。其可以被應用程序內(nèi)的所有事SessionFactory緩存。在集群環(huán)境中,緩存被一個機器或多個機器一級緩Session緩存,其實就是內(nèi)存中的一塊空間,在這個內(nèi)存空間存放了相互關(guān)聯(lián)的Java對象。 就一定要使用,更確切地說,就一定在使用Session緩存。體對象的情況下,HibernateSQLDBHibernate的使用一級緩存管理相關(guān)方contains(Objecto):判斷指定對象是否在Session一級緩存的存在性證對查出的兩個對象的屬性值進行修改,Hibernate只發(fā)出了一條update語句。DBsave()一個對象,快DB中數(shù)據(jù)是一致的,不能由代碼對副本中內(nèi)容進行修改。其作用主要是為了在處理數(shù)據(jù)更新時,將session中數(shù)據(jù)與快照中數(shù)據(jù)進行對比(即與DB中數(shù)據(jù)進行對比,因為快照中數(shù)據(jù)與DB中數(shù)據(jù)始終是一致的update語句。存,當然快照中也有該數(shù)據(jù)的副本。session緩存中數(shù)據(jù)是可以修改的,但快照中數(shù)據(jù)是不能修改的,始終保持與DB中數(shù)據(jù)是一致的。默認情況下,當事務在提交時,會首先對比其其Session的刷新與Session的刷新是指,Session緩存中數(shù)據(jù)的更新。SessionSession緩存中的數(shù)據(jù)同步更新到DB中。執(zhí)行同步的時間點只有一個:事務的提交。執(zhí)行delete語句。update語句是否馬上執(zhí)行,還要看修改后的數(shù)據(jù)是否與快照中數(shù)據(jù)一致。若一致,即數(shù)據(jù)updateupdate語句。DB中的。修改緩存刷新模式(了解Query二級緩SessionFactorySQL語句,映射元數(shù)據(jù)是映射義SQL語句,因此SessionFactory不需要進行內(nèi)置緩存與映射文件的同步。SessionFactory的外置緩存是一個可配置的插件。在默認情況下,SessionFactory不會啟SessionFactory的外置緩存也被稱為Hibernate的二級緩存。EHCache、Memcached、OSCache、SwarmCache、JBossCache等。這些插件的功能各有Hibernate緩存執(zhí)當Hibernate根據(jù)ID數(shù)據(jù)對象時,首先會從一級緩存Session中查找。若查不到且配置了二級緩存,則會從二級緩存中查找;若還查不到,就會查詢數(shù)據(jù)庫,把結(jié)果按照ID二級緩存的并發(fā)策事務型(transactional:級別最高,對于經(jīng)常被讀但很少被改的數(shù)據(jù),可以采用此策略。因為它可以防止臟讀與不可重復讀的并發(fā)問題。發(fā)生異常的時候,緩存。writeEHCache中,非嚴格讀寫型(write:不保證緩存與數(shù)據(jù)庫中數(shù)據(jù)的一致性。對于only第插件EHCache用要導入EHCache的jar包。該Jar包可以在Hibernate框架的lib\optional\ehcache Step2:修改主配置該配置在hibernate框架解壓 Step3:添解壓EHCache的Jar包ehcache-core-2.4.3.jar,將其中的一個配置文 下,并更名為ehcache.xml 中。其值一般為java.io.tmpdir,表示當前系統(tǒng)的默認文件臨時 期,此時會忽略timeToIdleSeconds與timeToLiveSeconds屬性。默認值為false。最近一次被后,若處于空閑狀態(tài)的時間超過了timeToIdleSeconds設定的值,這個timeToLiveSeconds設定的值,這個對象timeToLiveSecondstimeToIdleSeconds,才有意義。將溢出的對象寫到<diskStore>元素指定的硬盤緩存中。n:如果內(nèi)存緩存區(qū)超過限制,選擇移向硬盤緩存區(qū)中的對象Step4:指定緩存內(nèi)合合 無論使用哪種指定方式,usageread-write,為了保證讀到的數(shù)據(jù)是最新的數(shù)據(jù),將無法從二級緩存中直接獲取數(shù)據(jù)。所以,以下舉例,均使用usage的值為1:nCountryMinister關(guān)聯(lián)關(guān)系為例:測試過程及原可以輸出集合大小或集合詳情。此時會做對集合詳情的select查詢。Countryselect查詢。是從二級緩存中了存放其中的集合中元素的id,逐個id進行了詳情查詢。QueryQuery查詢結(jié)果會存放于緩存 查詢不會從緩存中數(shù)Query查詢結(jié)果雖然存放在一、二級緩存中的。但默認情況下,再使用Query進行查詢時,是不會從一、二級緩存中直接數(shù)據(jù)的。使用Query緩存的步A、開啟Query緩存總開在HibernateQueryB、為每Query查詢打開子Query接口有一個方法setCacheable(),用于為當前Query對象打開Query查詢的子開關(guān)。在Query對象后設置開關(guān):query.setCacheable(true)。setCacheable()方法打開子開關(guān)。第一次查詢后會將結(jié)果放于一、二級緩存。以后的只要是開啟Query查詢的Query對象要第一次的查詢結(jié)果,均是從二級C、要求查詢語句完全相查詢語句意思相同,或查詢結(jié)果存在包含關(guān)系,也不會從Query緩存中。DBSession緩存中的數(shù)據(jù)后,同方法,可以繞過一級緩存直接修改DB中的數(shù)據(jù)。繞過一級緩存的判斷依該修改是否繞過二級緩存是直接,起決定作用:該值被修改,則執(zhí)行select語句,從DB中進行查詢。否則,直接從二級緩存中數(shù)據(jù),不再執(zhí)行select語句。修改時間不是數(shù)據(jù),需要從DB中再次查詢更新。updateTimeStampsession后,又進行了一次查詢。其實,只要執(zhí)行executeUpdate()方法,都會進行update操作,都通過SessionFactory的getCache()方法:Cachecache=會刪除二級緩存中所有Account類型的對象。合屬性名。如刪除com.abc.Country實體中的ministers集合evictEtity(Strings)evict()的作用相同,只不過這里的參數(shù)為字符串類型的完整性類第8 事務相關(guān)內(nèi)事務四大特性(簡稱原子性一致性性持久性讀并寫并臟A事務了B事務未提交的數(shù)據(jù)所以,可能發(fā)生臟讀的現(xiàn)象:A事務修改了某數(shù)據(jù),但還未提交。此時,B事務了該數(shù)據(jù)。但此時A事務又發(fā)生了回滾。那么,B事務到的就是個“不存在”的臟數(shù)據(jù)。不可重復了已提交的事務。A事務先了一個數(shù)據(jù),而后B事務修改(update或delete)幻AA事務再做相同檢索,其檢索結(jié)果就會與第一次的不同。事務的級 MySql默認的事務級別為可重復讀,即防止了臟讀與不可重復讀,但可能會存在幻讀。通過select@@global.tx_isolation;可以查詢MySql默認的事務級別。 第一類丟失更而B事務又做回滾。此時,A事務提交的更新數(shù)據(jù)丟失。第二類丟失更也稱為提交丟失更新。A、B事務同時某數(shù)據(jù),并均做修改。A事務先做了提交樂觀鎖(Optimisticlock):每次數(shù)據(jù)時,都會樂觀的認為其它事務此時肯定不會同時樂觀A、B事務從DB中數(shù)據(jù)時同時會讀出一個數(shù)據(jù)版本號。當A事務將修改過的數(shù)據(jù)DBDB中數(shù)據(jù)沒有發(fā)生變化,B事務可以將DBDB中的版本號,則說明其它事務已悲觀在SQL語句中,若要為本次操作(事務)添加排他鎖,則可在正常的SQL語句最后添加上forupdate即可。例如: select*fromstudentwhereage<20forupdateSQL語句中,若要為本次
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026上半年安徽事業(yè)單位聯(lián)考合肥市巢湖市招聘22人備考題庫有答案詳解
- 宮外孕患者隱私保護護理查房
- 新型冠狀試題及答案
- 湖南省體育系列職稱評價辦法
- 腸梗阻的影像學鑒別與手術(shù)指征把握
- 衛(wèi)生院救護車輛管理制度
- 木棧道衛(wèi)生管理制度
- 衛(wèi)生院分區(qū)就診管理制度
- 衛(wèi)生院會計績效工資制度
- 人員培衛(wèi)生管理制度
- 2026屆南通市高二數(shù)學第一學期期末統(tǒng)考試題含解析
- 寫字樓保潔培訓課件
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責任公司社會成熟人才招聘備考題庫有完整答案詳解
- 計量宣貫培訓制度
- 2026中國電信四川公用信息產(chǎn)業(yè)有限責任公司社會成熟人才招聘備考題庫有答案詳解
- 2026.05.01施行的中華人民共和國漁業(yè)法(2025修訂)課件
- 原始股認購協(xié)議書
- 嚴肅財經(jīng)紀律培訓班課件
- 上海市復旦大學附中2026屆數(shù)學高一上期末質(zhì)量檢測試題含解析
- 企業(yè)員工食堂營養(yǎng)搭配方案
- 2025年國家公務員國家能源局面試題及答案
評論
0/150
提交評論