亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即時聊天系統:5.技術簡介之Hibernate

2019-11-15 00:06:38
字體:
來源:轉載
供稿:網友
【迷你微信】基于MINA、Hibernate、SPRing、Protobuf的即時聊天系統:5.技術簡介之Hibernate

歡迎閱讀我的開源項目《迷你微信》服務器與《迷你微信》客戶端

Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,使得java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/jsp的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任?!俣劝倏?/p>

[TOC]

序言

博主在《迷你微信》項目上對Hibernate的使用是通過注解方式配置進行增刪改查操作、使用c3p0連接池、使用ehcache緩存。

配置hibernate.cfg.xml配置文件

主要是有關和MySQL數據庫連接的配置、Ehcache、C3P0的配置

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><!-- Database connection settings --><property name="connection.driver_class">com.mysql.jdbc.Driver</property><property name="connection.url">jdbc:mysql://127.0.0.1:3306/MiniWechat?useUnicode=true&amp;characterEncoding=UTF-8</property><property name="connection.username">root</property><property name="connection.passWord">root</property><property name="javax.persistence.validation.mode">none</property><!-- SQL dialect --><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!-- Enable Hibernate's automatic session context management --><property name="current_session_context_class">thread</property><!-- C3P0連接池 --><property name="c3p0.acquire_increment">1</property>        <property name="c3p0.idle_test_period">100</property>        <property name="c3p0.max_size">5</property><property name="c3p0.max_statements">0</property>        <property name="c3p0.min_size">2</property>        <property name="c3p0.timeout">90</property>        <property name="c3p0.preferredTestQuery ">SELECT CURRENT_USER</property>        <property name="c3p0.idleConnectionTestPeriod ">18000</property>           <property name="c3p0.maxIdleTime">25000</property>        <property name="c3p0.testConnectionOnCheckout">true</property><!-- Echo all executed SQL to stdout --><property name="show_sql">true</property><!-- Ehcache 緩存配置 -->        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>        <property name="hibernate.cache.use_second_level_cache">true</property>  <property name="hibernate.cache.use_query_cache">true</property><mapping class="model.User"/><mapping class="model.Chatting"/><mapping class="model.Group"/></session-factory></hibernate-configuration>
加載hibernate.cfg.html配置文件并獲取Session
public class HibernateSessionFactory {private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();private static Configuration configuration = new Configuration();public static SessionFactory sessionFactory;private static String configFile = CONFIG_FILE_LOCATION;static {try{configuration.configure(configFile);ServiceRegistry sr = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()).build();sessionFactory = configuration.buildSessionFactory(sr);}catch(Exception e){e.printStackTrace();}}private HibernateSessionFactory() {}public static Session getSession() {Session session = threadLocal.get();if (session == null || !session.isOpen()) {session = (sessionFactory != null) ? sessionFactory.openSession() : null;threadLocal.set(session);}return session;}}
對象的注解配置

主要是類的注解配置、成員變量的注解配置、多對多的注解配置1.在需要在數據庫中建表存儲的類型需要在類名前添加注解

@Entity@Table(name="user")

2.在相關成員變量添加注解

 @Column(name="user_id",columnDefinition = "char(20)  COMMENT '微信號'")

如果是數據庫對應的主鍵需要添加注解: @Id 如果是自增主鍵需要添加主鍵: @GeneratedValue(strategy = GenerationType.AUTO) 3.多對多關聯注解配置 在數據庫中我們需要好友關系、聊天群的成員表,但在項目代碼中我們并沒有定義這樣的對象,這是通過多對多的注解配置實現的 例如: @ManyToMany(targetEntity=User.class) @JoinTable(name = "user_friends", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "friend_id")) public List<User> getFriends() { return friends; } public void setFriends(List<User> friends) { this.friends = friends; }

增刪改查

在項目中為了更好的將有關數據庫的操作和業務邏輯分離,同時也有利于BUG和異常的捕獲,我們將有關數據庫的操作進行了封裝,下面的代碼只展示了有關Hibernate的增刪改查操作的代碼,沒有展示封裝的代碼。

具體的增刪改查代碼

增:

public void add(Object obj){Session session = HibernateSessionFactory.getSession();Transaction trans = session.beginTransaction();session.save(obj);trans.commit();session.close();}

刪:

public  void delete(Object obj){Session session = HibernateSessionFactory.getSession();Transaction trans = session.beginTransaction();session.delete(o);trans.commit();session.close();}

改:

public  void update(Object obj){Session session = HibernateSessionFactory.getSession();Transaction trans = session.beginTransaction();session.update(o);trans.commit();session.close();}

查:

public  void query(String paramName, Object paramValue, Class outputClass){Session session = HibernateSessionFactory.getSession();Criteria criteria = session.createCriteria(outputClass);// 使用緩存criteria.setCacheable(true);criteria.add(Restrictions.eq(paramName, paramValue));List list = criteria.list();session.close();}

注意:1.使用了緩存 后面會更加詳細的介紹2.paramValue的類型需要和查詢對象定義的類型相匹配,否則會出現類型無法轉換的報錯

數據庫操作的封裝

1.將所有的數據庫操作放在同一個類中,并聲明為靜態方法2.對所有的操作進行異常捕獲 避免拋出數據庫、Hibernate相關的異常3.定義枚舉類型的ResultCode 返回操作是否成功4.重要:在項目中 聊天群類型中定義了 聊天成員對象的List,當查詢一個聊天群對象時,Hibernate并沒有將聊天成員對象的List也查詢出來,而是當需要使用的時候再查詢,但前面提到的查詢方法中調用了session.close(),這時無法再用原來的聊天群對象直接get聊天成員對象的List(Hibernate的延遲加載導致)。所以在封裝的數據庫操作類中重載了需要使用到延遲加載的相關方法,即:調用相關方法時傳入session,在查詢等操作時不立即close掉session,待調用者的方法結束時再close。Session是通過sessionFactory.openSession()方法獲取,其實通過這種方式獲取的ession時Hibernate會自動關閉。

連接池

在項目開始時并沒有使用連接池,但出現過一次數據庫無法訪問的異常。經過查閱資料發現了問題所在:Mysql服務器默認的“wait_timeout”是8小時,也就是說一個connection空閑超過8個小時,Mysql將自動斷開該 connection。Hibernate默認的連接池并不知道該connection已經失效,如果這時有 Client請求connection,Hibernate將該失效的Connection提供給Client,將會造成上面的異常。解決辦法:使用C3P0連接池,有關C3P0連接池的配置在hibernate.cfg.xml配置文件中可以查看,需要的jar包可以在Hibernate的安裝包可以找到。其實一開始使用的是C3P0連接池,使用的是Proxool連接池,但使用過程中遇到了連接池銷毀連接時的相關報錯,而且沒有找到很好的解決辦法。所以就改用了C3P0連接池

緩存

EhCache是Hibernate的二級緩存技術之一,可以把查詢出來的數據存儲在內存或者磁盤,節省下次同樣查詢語句再次查詢數據庫,大幅減輕數據庫壓力1.有關EhCache的配置可以在hibernat.cfg.xml中查看2.在需要使用緩存的類添加注解

@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

3.在數據庫的查詢操作中設置使用緩存

// 使用緩存criteria.setCacheable(true);

3.當用Hibernate的方式修改表數據(save,update,delete等等),這時EhCache會自動把緩存中關于此表的所有緩存全部刪除掉(這樣能達到同步)。但對于數據經常修改的表來說,可能就失去緩存的意義了(不能減輕數據庫壓力);所以EhCache一般要使用在比較少執行write操作的表(包括update,insert,delete等)[Hibernate的二級緩存也都是這樣];

注:本篇來自于數據庫調試員:王飛先生歡迎閱讀我的開源項目《迷你微信》服務器與《迷你微信》客戶端


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成毛片在线播放| 久久精品久久久久| 亚洲国产精品专区久久| 亚洲精品女av网站| 亚洲国产古装精品网站| 国产亚洲精品久久久久久牛牛| 久久精品国产欧美亚洲人人爽| 亚洲国产天堂久久国产91| 成人伊人精品色xxxx视频| 国产美女扒开尿口久久久| 51视频国产精品一区二区| 国产精品美女主播| 国产欧美一区二区三区久久| 国产欧美精品一区二区三区-老狼| 国产成人精品av在线| 亚洲xxxxx电影| 国产69精品久久久| 91av成人在线| 国产在线精品自拍| 日韩免费观看在线观看| 亚洲精品永久免费精品| 成人精品一区二区三区电影黑人| 激情久久av一区av二区av三区| 在线亚洲男人天堂| 久久6免费高清热精品| 91视频免费网站| 日韩精品久久久久| 国产美女久久精品香蕉69| 日韩福利视频在线观看| 精品国产一区二区三区久久久狼| 欧美福利小视频| 亚洲国产又黄又爽女人高潮的| 欧美日本国产在线| 九九九久久久久久| 国产一区二区美女视频| 姬川优奈aav一区二区| 伊人久久大香线蕉av一区二区| 亚洲国产精品一区二区久| 亚洲午夜未删减在线观看| 欧美激情伊人电影| 成人免费观看网址| 日韩一二三在线视频播| 国产精品啪视频| 91中文在线视频| 欧美巨乳在线观看| 欧美成人一区二区三区电影| 亚洲图中文字幕| 国产aⅴ夜夜欢一区二区三区| 国产精品视频yy9099| 亚洲日本成人女熟在线观看| 亚洲已满18点击进入在线看片| 奇米4444一区二区三区| 欧美野外wwwxxx| 亚洲欧美日韩一区二区在线| 日韩欧美aⅴ综合网站发布| 国产精品视频1区| 亚洲理论在线a中文字幕| 欧美激情图片区| 日韩精品有码在线观看| 国产日本欧美在线观看| 国产精品丝袜视频| 久久精品夜夜夜夜夜久久| 日韩网站免费观看高清| 国产中文字幕亚洲| 97精品在线观看| 在线精品国产成人综合| 精品久久久一区| 精品国产一区二区三区久久久狼| 亚洲精品视频免费在线观看| 韩国三级日本三级少妇99| 最近日韩中文字幕中文| 国产精品ⅴa在线观看h| 亚洲在线视频观看| 久久久国产影院| 国产精品香蕉国产| 国产精品免费看久久久香蕉| 亚洲美女在线观看| 91九色国产社区在线观看| 欧美激情精品久久久久久| 久久成人国产精品| 亚洲aa在线观看| 欧美成人网在线| 55夜色66夜色国产精品视频| 91免费看片在线| 欧美国产高跟鞋裸体秀xxxhd| 中文字幕亚洲欧美日韩在线不卡| 亚洲精品动漫100p| 欧美日韩成人在线视频| 国产精品色悠悠| 欧美日韩国产精品一区二区三区四区| 欧美香蕉大胸在线视频观看| 日韩av最新在线观看| 欧美一级视频在线观看| 九九久久国产精品| 81精品国产乱码久久久久久| 久久福利网址导航| 欧美猛少妇色xxxxx| 欧美日韩在线影院| 欧美电影在线免费观看网站| 美日韩在线视频| 亚洲理论在线a中文字幕| 国产精品观看在线亚洲人成网| 国产精品国语对白| 91麻豆桃色免费看| 亚洲美女av电影| 亚洲综合日韩在线| 午夜精品视频网站| 欧美性xxxxxx| 国产91网红主播在线观看| 国产精品久久97| 亚洲欧美在线一区| 欧美性猛xxx| 高清亚洲成在人网站天堂| 欧美成人午夜免费视在线看片| 国产欧美精品一区二区三区-老狼| 欧美在线视频免费播放| 2020欧美日韩在线视频| 亚洲精品v欧美精品v日韩精品| 国内精品久久久久影院优| www.久久草.com| 国产精品精品久久久久久| 国内精品视频久久| 亚洲精品电影久久久| 久久久久国产精品免费| 国产精品久久久久久婷婷天堂| 国产精品久久久久久网站| 欧美专区在线播放| 日韩欧美精品免费在线| 中文字幕日韩av| 91精品国产91久久久久久最新| 亚洲另类激情图| 欧美亚洲成人精品| 国产精品久久久久久一区二区| 国产成人一区二区在线| 国内揄拍国内精品少妇国语| 国产欧亚日韩视频| 亚洲999一在线观看www| 成人福利在线视频| 午夜精品一区二区三区视频免费看| 欧美中文字幕在线视频| 一道本无吗dⅴd在线播放一区| 成人黄色影片在线| 日本国产高清不卡| 亚洲天堂男人天堂| 国产精品va在线| 国产精品视频一区二区高潮| 亚洲а∨天堂久久精品喷水| 亚洲日韩中文字幕在线播放| 亚洲人成在线电影| 日韩极品精品视频免费观看| 久久久视频精品| 91精品久久久久久久久| 久久影视电视剧凤归四时歌| 亚洲精品福利在线观看| 久久久免费在线观看| 日本伊人精品一区二区三区介绍| 亚洲色图五月天| 精品视频在线播放免| 日韩成人在线电影网| 都市激情亚洲色图| 欧美日韩亚洲一区二区| 成人午夜激情免费视频| 欧美激情视频播放| 日韩久久午夜影院|