結構圖:html
搭建步驟:前端
1:導包 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.3.7.RELEASE</version> </dependency> 2:配置hibernateTemplate(applicationContext.xml中) <!-- 配置hibernateTemplate --> <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate"> <property name="sessionFactory" ref="sessionFactory"/> </bean> 3:配置sessionFactory(applicationContext.xml中) <!-- 配置sessionfactory --> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="c3p0"></property> <property name="configLocations" value="classpath:hibernate.cfg.xml"></property> </bean> 4:開啓hibernate事務 <!-- 配置事務 --> <bean id="txManger" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory"/> </bean> 5:啓用事務註解 <!-- hibernate的代理註解事務 transaction-manager:表明的是註解事務 proxy-target-class:默認屬性值爲false,表明不開啓事務,也就是不支持事務註解,原生的jdk代理模式 若是屬性值爲true,則表明開啓事務註解,而且此時使用的事務代理模式爲cglib動態代理 若是屬性值爲true,annotation:默認支持的是隻讀狀態(readonly=true), 若是是寫操做,須要在action類名前面增長註解,屬性設置爲可讀可寫狀態(readonly=false) --> <tx:annotation-driven transaction-manager="txManger" proxy-target-class="true"/> 6:將hibernate.cfg.xml中的jdbc鏈接信息,註釋掉
重構代碼,使用hibernate進行數據查詢:java
1:將原來的jdbc實現類中的註解註釋掉 2:增長NoteDao的接口實現類(使用hibernateTemplate) 3:在寫操做的action頭部,增長註解,使其變爲可讀可寫狀態
代碼以下:nginx
HibernateDaoImpl.java:web
@Repository public class HibernateDaoImpl implements NoteDao{ @Resource private HibernateTemplate hibernateTemplate; @Override public List<Note> queryNoteByuserId(Integer userId) { String hql = "from Note where userId=?"; List<Note> list = (List<Note>) hibernateTemplate.find(hql, userId); return list; } @Override public int deleteNoteById(Integer id) { Note note = hibernateTemplate.get(Note.class, id); if (note != null) { hibernateTemplate.delete(note); //delete裏面是object類型,所以根據id查詢到的note用note傳值進行刪除 return 1; } return 0; } }
DeleteAction.java:spring
增長註解: @Transactional(readOnly=false)//默認是true,爲只讀狀態,false是可讀可寫狀態
從新部署啓動,查看結構和控制檯sql
需求:數據庫
請求流程:緩存
問題流程: /listDetail.do-->filter-->action--->DAO(service)-->hibernate(session關閉)--->result--->listDetail.jsp(note) 解決方法: /listDetail.do-->filter-->action--->DAO(service)-->hibernate(session不關閉)--->result--->listDetail.jsp(note)
如何讓session不關閉:tomcat
將session交給spring來處理---OpenSessionInViewFilter能夠集中管理sessionFactory
須要在web.xml中配置:
須要注意的是:此filter必須在struts2配置文件以前(有加載順序的問題) <!-- 將session交給spring來處理,集中管理session的關閉 --> <filter> <filter-name>nosession</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>nosession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
開發步驟:
1:配置struts.xml中action組件 <!-- 詳情功能action --> <action name="listDetail" class="listDetailAction" method="execute"> <result name="success" type="dispatcher">/WEB-INF/jsp/listDetail.jsp</result> </action> 2:增長listDetail.jsp文件 <h1>筆記詳情</h1> <h3>發佈時間:${note.publishTime }</h3> <h3>收藏人數:${note.likeCount }</h3> <h3>筆記內容:${note.context }</h3> 3:增長listDetailAction.java @Controller @Scope("prototype") public class ListDetailAction { private Integer id;//接收筆記主鍵ID public Note note;//前端傳值 ${note.publishTime} @Resource private NoteDao noteDao; public String execute(){ note = noteDao.queryNoteById(id); return "success"; } public Note getNote() { return note; } public void setNote(Note note) { this.note = note; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } } 4:在NoteDao中,增長查詢方法 /** * 根據筆記主鍵ID,查詢筆記詳情 * @param id * @return */ public Note queryNoteById(Integer id); 5:實現接口方法(先使用get後使用load) @Override public Note queryNoteById(Integer id) { // Note note = hibernateTemplate.get(Note.class, id); Note note = hibernateTemplate.load(Note.class, id); return note; } 6:在web.xml中配置組件,解決nosession問題 <!-- 將session交給spring來處理,集中管理session的關閉 ,須要配置到struts2組件filter以前--> <filter> <filter-name>nosession</filter-name> <filter-class>org.springframework.orm.hibernate4.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>nosession</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> 7:部署,啓動,訪問
需求:
開發步驟:
1:修改Note.java文件,增長Usernote變量,並增長getter和setter方法 @ManyToOne//多對1 @JoinColumn(name="userId")//關聯字段----通常建議將外鍵進行註釋取消 public Usernote usernote; 2:註釋掉Note.java中外鍵字段userId 3:在Usernote.java文件中,增長note列表變量,增長getter和setter方法 @OneToMany//1對多 @JoinColumn(name="userId") public List<Note> notes; 4:修改listDetail.jsp文件,增長C標籤 <h1>筆記詳情</h1> <h3>發佈時間:${note.publishTime }</h3> <h3>發佈人:${note.usernote.username }</h3> <h3>收藏人數:${note.likeCount }</h3> <h3>筆記內容:${note.context }</h3> <h1>其它筆記內容:</h1> <c:forEach items="${note.usernote.notes }" var="note1"> ${note1.context }<br/> </c:forEach> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
一級緩存:
session獨享
二級緩存:
需求增長配置,而且依賴於配置內存文件echcache.xml---內存、磁盤 session共享
目的:
第一次進行數據查詢的時候,此時緩存中是沒有對象數據,則開啓事務,進行sql查詢,第二次進行相同數據查詢的時候,此時緩存中是已經存在以前查詢過的數據,則直接從緩存中獲取,而非查詢數據庫執行sql 爲了提升程序的性能和下降數據庫訪問的壓力瓶頸 <!-- 開啓二級緩存 --> <property name="hibernate.cache.use_sencond_level_cache">true</property> <property name="hibernate.cache.region.factory_class"> org.hibernate.cache.ehcache.EhCacheRegionFactory </property> 實體對象類中,增長緩存註解: @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) 類前 和方法前 都增長 @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) public class Usernote{ @Cache(usage=CacheConcurrencyStrategy.READ_ONLY) public Usernote usernote; ..... }
查詢緩存:
依賴於二級緩存,若是說想使用查詢緩存,則前提條件,必須開啓二級緩存 hibernate.cfg.xml中放在開啓二級緩存後面 <!-- 開啓查詢緩存 --> <property name="hibernate.cache.use_query_cache">true</property> HibernateDaoImpl.java中增長 hibernateTemplate.setCacheQueries(true);//開啓查詢緩存
使用:
1:導包 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>4.2.21.Final</version> </dependency>
最前面增長 <distributable/>
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>ssh_13</display-name> <distributable/> ......
注:
先啓動tomcat-8081和tomcat-8082
再啓動 nginx
nginx配置參考:http://www.nginx.cn/76.html
nginx+tomcat集羣參考資料:
session共享問題解決
nginx設置靜態文件