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

首頁 > 數據庫 > 文庫 > 正文

利用Hibernate儲存大對象到達夢數據庫

2024-09-07 22:12:19
字體:
來源:轉載
供稿:網友

  使用達夢數據庫的大字段前不得不說一下數據庫大字段的性能問題:在數據庫中,經常需要用到大字段類型,如Oracle中long、blob、clob,SQLServer中的text、image,MySql中的text、longtext、clob、blob以及達夢數據庫中的clob、blob類型。存儲的信息大概主要是兩類,一類是長文本,如大段的文字,普通的varchar最長只能存儲4K的數據,已經不能滿足要求;另一類是存儲二進制信息,如上傳的文件等。不過通常情況下,大字段不意味著保存很大的文件,例如很長的文章,圖標,小圖片等等。數據過大保存在數據庫有諸多的問題:

  1.速度慢:影響一張表的查詢速度的,除了行數,還包括表所占的物理空間的大小。此表在數據量較小時,在查詢方面感覺不到明顯的差異。但是如果某個字段所存儲的數據都是大段文本或較大的文件時,會導致表的物理空間迅速變大,該字段所占用的空間有可能達到整表所占空間的90%以上。在此基礎上,如果行數再增加到數十萬、上百萬級時,整個表所占的空間將達到一個驚人的數字,查詢的速度亦會受到非常大的影響。

  2.操作不方便:必須把數據庫打開一個流,構造一個Buffer,然后再輸出一個ServletOutputStream。占用數據庫連接,加重數據庫訪問負載不說,如果用戶突然中斷下載,還需要處理數據庫關閉動作,容易造成性能問題。如果把整個數據讀入內存再輸出,則內存占用非??捎^。如果是硬盤文件,只要返回一個URL 就可以了。即使你不希望用戶直接訪問到文件,你也可以構造一個IOStream來輸出文件,既不會占用數據庫資源,傳輸速度也快。

  3.性能有問題:特別的情況是,如果并發很多用戶來下載大文件的時候,應用服務器要占用非常多的內存來緩存文件內容,假設并發10個用戶,下載10MB的文件,JVM的峰值就至少需要100MB內存來支撐,很容易造成JVM崩潰。

  所以說數據庫大字段并不適合存儲過大的數據,數據過大可能會影響到數據庫存儲的性能。

  下面言歸正傳,使用Hibernate操作達夢數據庫中的大字段應該有如下幾步:

  1 首先需要一張表存儲大字段數據:包括內容,類型;

  2 必須得到一個代表上傳文件的數據流;

  3 進行保存操作

  好了我們先建一張表,里面包括達夢數據庫的2個大字段類型(CLOB、BLOB)字段:

  --創建表
  create table TESTLOB(
   ID int primary key,
   TITLE varchar(50),
   CLOBNAME varchar(50),
   CLOBCONTENT clob,
   BLOBNAME varchar(50),
   BLOBCONTENT blob
  );
 
  在建立一個序列用于處理表的流水ID:

  --創建序列
  create SEQUENCE "TESTLOB"."SEQ_TESTLOB_ID"
  INCREMENT BY 1 START WITH 1 MAXVALUE 100000 MINVALUE 1
  NOCYCLE

  然后編寫關于這2個大字段的Java對象文件TestLob.java,分別定義類型為CLOB和BLOB屬性字段為String和byte[]類型,其中由于CLOB是處理大文本類型所以它對應了Java中的String類型,BLOB是處理一些以二進制流形勢存儲的沒有嚴ge定義的大文件所以讓它使用byte[]類型,然后分別定義這2個屬性的Getter和Setter方法,相關代碼如下:

  package com.dm.lobtest.vo;

  public class TestLob {
   private int id;
   private String title;        //記錄標題
   private String clobName;     //clob文件名稱
   private String clobContent;  //clob文件
   private byte[] blobContent;  //blob文件
   private String blobName;     //blob文件名稱
  
   public byte[] getBlobContent() {
    return blobContent;
   }
   public void setBlobContent(byte[] blobContent) {
    this.blobContent = blobContent;
   }
 
   public String getClobContent() {
    return clobContent;
   }
   public void setClobContent(String clobContent) {
    this.clobContent = clobContent;
   }
   public int getId() {
    return id;
   }
   public void setId(int id) {
    this.id = id;
   }
   public String getTitle() {
    return title;
   }
   public void setTitle(String title) {
    this.title = title;
   }
   public String getBlobName() {
    return blobName;
   }
   public void setBlobName(String blobName) {
    this.blobName = blobName;
   }
   public String getClobName() {
    return clobName;
   }
   public void setClobName(String clobName) {
    this.clobName = clobName;
   }

   } 

  將對象的映射文件中主健字段元素的內置Generator指定為sequence,并與達夢數據庫重的內置序列(sequence)關聯,最后指定CLOB類型的屬性為"string"類型,BLOB類型的屬性為"binary"類型:

  <?xml version="1.0" encoding="GB2312"?>
  <!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  <hibernate-mapping>

   <class name="com.dm.lobtest.vo.TestLob" table="TESTLOB">
        <id name="id" column="ID" type="int">
     <generator class="sequence">
      <param name="sequence">SEQ_TESTLOB_ID</param>
     </generator>
    </id> 
    <property name="title" column="TITLE" type="string" />
    <property name="clobName" column="CLOBNAME" type="string" />
    <property name="blobName" column="BLOBNAME" type="string" />
    <property name="clobContent" column="CLOBCONTENT" type="string" />
    <property name="blobContent" column="BLOBCONTENT" type="binary" />   
  </class>

  </hibernate-mapping>
 
  完成以上這些操作后我們可以開始編寫上傳文件頁面和處理上傳文件的業務邏輯了,

  定義上傳文件頁面:

  <form name="myTestLobFrm" method="post" enctype="multipart/form-data" action="/LobTest/testlob.do?method=save">
   <table align="center">
    <tr>
     <td colspan="2">
      <b>達夢數據庫CLOB和BLOB數據類型在Hibernate下使用的示例</b>
     </td>
    </tr>
    <tr>
     <td>標題:</td>
     <td>
      <input type="text" name="title" size="81">
     </td>
    </tr>
    <tr>
     <td>文件內容:</td>
     <td>
      <textarea rows="20" cols="80" name="clobTest" ></textarea>
     </td>
     </tr>
    <tr>
     <td>附件:</td>
     <td>
      <input type="file" name="blobTest" size="71">
     </td>
    </tr>
    <tr>
     <td colspan="2" align="center">
      <input type="submit" value=" 確  認 ">
     </td>
    </tr>
    <tr>
     <td colspan="2" align="center"> <font id="info" color="red"><%=message %></font></td>
    </tr>
   </table>
  </form>
 
  處理業務邏輯類:

  public class TestLobAction extends DispatchAction{

  public ActionForward save(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws   Exception {
  try{
     //設置文件標題
     String title = request.getParameter("title");
     TestLob testLob = new TestLob();
     testLob.setTitle(title);
   
     //處理blob字段
     Hashtable files = form.getMultipartRequestHandler().getFileElements();
     FormFile blobTestFile = (FormFile) files.get("blobTest");//得到文件
     String blobName = blobTestFile.getFileName();            //得到文件名
     testLob.setBlobName(blobName);                           //設置文件
     byte[] blobContent=blobTestFile.getFileData();           //得到文件內容
     testLob.setBlobContent(blobContent);                     //設置文件內容
   
     //處理clob字段
     String clobName = title;      //文件名就是標題名
     String clobContent = request.getParameter("clobTest");   //得到文件
     testLob.setClobName(clobName);                           //設置文件名
     testLob.setClobContent(clobContent);                     //設置文件
   
     TestLobService testLobService = TestLobService.getInstance();
     if(testLobService.createTestLob(testLob)==0){
      request.setAttribute("message", "上傳失敗");
      return list(mapping,form,request,response);
     }
    }catch(Exception e){
     throw new BaseException();
    }
    request.setAttribute("message", "上傳成功");
    return list(mapping,form,request,response);
  }
   }
 
  因為clob字段對應的是String類型,所以可以直接將表單中得到的數據設置到對象的屬性中去,而blob類型處理的是二進制類型的文件,我們需要將得到的文件以流的形式存入到對象的屬性中,這里我使用了struts的FormFile組件來進行文件的上傳,將得到的數據流設置到對象的屬性中。

  完成以上操作后我們就可以將設置好的對象用以下面的方法保存數據到數據庫中:

  首先定義一個Hibernate的Session管理類:HibernateUtil.java,它是使用ThreadLocal類建立的一個Session管理的輔助類。

  package com.dm.lobtest.util;

  import org.hibernate.HibernateException;
  import org.hibernate.Session;
  import org.hibernate.SessionFactory;

  public class HibernateUtil {
        private static SessionFactory sessionFactory = null;

        public static final ThreadLocal session = new ThreadLocal();

        public static Session currentSession() throws HibernateException {
                if (sessionFactory == null) {
                        if (getSystemSessionFactory() == false) {
                                throw new HibernateException(
                                                "Exception geting SessionFactory ! ");
                        }
                }
                Session s = (Session) session.get();
                // 如果該線程還不存在,打開一個新的Session
                if (s == null) {
                        s = sessionFactory.openSession();
                        session.set(s);
                }
                return s;
        }

        public static void closeSession() throws HibernateException {
                Session s = (Session) session.get();
                session.set(null);
                if (s != null)
                        s.close();
        }
  }
 
  最后利用Hibernate的運作中心--Session接口的save()方法保存對象并提交相關的Session實例:

  public int createTestLob(TestLob testLob){
   Session session = null;
   try{
      session = HibernateUtil.currentSession();
      Transaction tr = session.beginTransaction();
      session.save(testLob);
      tr.commit();
      return 1;
   }catch(Exception e){
    e.printStackTrace();
    return 0;
   }finally {
            try {
                if (session != null) {
                    HibernateUtil.closeSession();
                }
             }catch (Exception ex) {}
         }
  }

  現在我們已經利用Hibernate完成了多個不同的大數據類型存儲到達夢數據庫中的全過程。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99精品久久久久久琪琪| 久久久av电影| 国产亚洲激情在线| 亚洲欧美中文在线视频| 日韩在线视频播放| 欧美贵妇videos办公室| 亚洲天堂免费在线| 一区二区在线视频| 亚洲成人激情在线观看| 久久亚洲精品国产亚洲老地址| 欧美日韩人人澡狠狠躁视频| 欧美成人性色生活仑片| 一色桃子一区二区| 亚洲欧美制服综合另类| 日韩欧美主播在线| 亚洲欧美成人精品| 青青草99啪国产免费| 国产免费一区二区三区在线能观看| 国产精品偷伦视频免费观看国产| 日韩视频免费在线观看| 一级做a爰片久久毛片美女图片| 日韩精品在线免费观看| 成人黄色av网| 91日韩在线播放| 国产婷婷97碰碰久久人人蜜臀| 精品国产一区二区三区久久久| 中文字幕亚洲一区二区三区| 国产精品手机播放| 国产中文欧美精品| 久久综合色影院| 国产精品老女人视频| 久久久久久久久久久国产| 91免费综合在线| 国产亚洲一级高清| 136fldh精品导航福利| 庆余年2免费日韩剧观看大牛| 成人av在线亚洲| 一道本无吗dⅴd在线播放一区| 中文字幕精品av| 精品久久久视频| 欧美国产精品va在线观看| 在线观看久久av| 日韩中文字幕不卡视频| www.日韩欧美| 欧美日韩国产丝袜美女| 日韩成人在线免费观看| 欧洲亚洲免费视频| 日韩av成人在线观看| 一本色道久久88综合亚洲精品ⅰ| 2019中文字幕在线免费观看| 成人黄色在线播放| 国产精品久久999| 日本久久久久亚洲中字幕| 亚洲自拍小视频免费观看| 国产一区二区动漫| 伊人久久五月天| 国产亚洲美女精品久久久| 91精品免费久久久久久久久| 亚洲一区中文字幕在线观看| 青草青草久热精品视频在线观看| 久久天天躁夜夜躁狠狠躁2022| 亚洲激情第一页| 日韩av网站在线| 91精品视频在线播放| 国产精品久久久久高潮| 国产女精品视频网站免费| 91久久久久久| 欧美激情高清视频| 黄网站色欧美视频| 国产91精品久| 久久九九全国免费精品观看| 亚洲天堂影视av| 成人美女免费网站视频| 国产精品久久久亚洲| 亚洲精品国产精品国自产观看浪潮| 狠狠做深爱婷婷久久综合一区| 国产一区二区色| 欧美成人精品一区二区| 91情侣偷在线精品国产| 欧美日产国产成人免费图片| 国产盗摄xxxx视频xxx69| 色综合老司机第九色激情| 亚洲精品乱码久久久久久按摩观| 北条麻妃99精品青青久久| 欧美一级黑人aaaaaaa做受| 亚洲女人天堂网| 成人免费视频网址| 播播国产欧美激情| 亚洲欧美成人精品| 国产九九精品视频| 日韩精品一区二区视频| 久久99精品视频一区97| 中文字幕亚洲一区| 久久国产精品久久久| 亚洲成人精品视频| 国产一区视频在线| 国产亚洲精品久久久久动| 国产欧美在线播放| 亚洲精品一区二区久| 国产精品久久久久久久久影视| 亚洲精品一区在线观看香蕉| 在线视频日韩精品| 国产精品久久色| 久久久免费在线观看| 亚洲第一黄色网| 国产一区二区三区在线视频| 国产精品精品一区二区三区午夜版| 国产欧美日韩综合精品| 亚洲精品国产电影| 97在线免费观看视频| 日韩综合视频在线观看| 97国产一区二区精品久久呦| 最新国产成人av网站网址麻豆| 992tv成人免费影院| 亚洲视频在线观看| 亚洲毛片在线看| 亚洲欧美中文另类| 亚洲成人黄色网址| 国产视频欧美视频| 欧美一级片久久久久久久| 亚洲风情亚aⅴ在线发布| 久久国产精品久久国产精品| 国产精品av免费在线观看| 日本亚洲精品在线观看| 亚洲国产中文字幕在线观看| 黑人狂躁日本妞一区二区三区| 免费不卡在线观看av| 日本韩国欧美精品大片卡二| 国产精品一区二区三区免费视频| 成人欧美一区二区三区在线| 一区二区三区视频免费| 成人欧美一区二区三区黑人孕妇| 欧美日韩性视频在线| 亚洲毛片在线观看| 国产精品久久久精品| 亚洲第一网站免费视频| 欧美性xxxxxxx| 欧美日韩国产影院| 久久久国产精品视频| 日韩va亚洲va欧洲va国产| 国产91精品高潮白浆喷水| 国产精品美乳一区二区免费| 91在线观看欧美日韩| 国产精品男女猛烈高潮激情| 中文字幕在线视频日韩| 91亚洲国产成人精品性色| 国产精品第三页| 日韩麻豆第一页| 亚洲欧美精品suv| 欧美激情亚洲一区| 亚洲精品欧美日韩专区| 高清亚洲成在人网站天堂| 国产69精品99久久久久久宅男| 欧美午夜久久久| 大量国产精品视频| 色阁综合伊人av| 日韩美女写真福利在线观看| 欧美日韩国产中文精品字幕自在自线| 亚洲国产一区二区三区在线观看| 伊人久久综合97精品| 国产一区二区三区视频在线观看| 性视频1819p久久| 亚洲人成电影网站色| 国产一区二区三区久久精品|