隨筆-16  評(píng)論-84  文章-1  trackbacks-0
            2009年10月25日
          通過存儲(chǔ)過程向數(shù)據(jù)庫一下子插入了一千萬(10000000)條記錄,結(jié)果等了很長時(shí)間,PL/SQL都沒有響應(yīng),我又瞎折騰了下,結(jié)果執(zhí)行了好幾次,導(dǎo)致數(shù)據(jù)庫假死了,我只有刪除當(dāng)前的會(huì)話,從網(wǎng)上找到相關(guān)的腳本代碼。


          1> 通過此語句查詢正在鎖定的SESSION_ID:

          1SELECT  SESSION_ID   FROM   V$LOCKED_OBJECT,USER_OBJECTS  WHERE   V$LOCKED_OBJECT.OBJECT_ID   =   USER_OBJECTS.OBJECT_ID


          2> 通過第一步查詢到的SESSION_ID查詢SERIAL#

          1SELECT SERIAL# FROM V$SESSION  WHERE SID='12'(此處'12'為上面查詢到的'SESSION_ID')


           3> 根據(jù)1,2步查詢到的SESSION_ID和SERIAL#執(zhí)行

          1ALTER   SYSTEM   KILL   SESSION  '12,154'(12為SESSION_ID的值, 154為SERIAL#的值)

          4> 如果利用上面的命令殺死一個(gè)進(jìn)程后,進(jìn)程狀態(tài)被置為"killed",但是鎖定的資源很長時(shí)間沒有被釋放,那么還可以在os一級(jí)再殺死相應(yīng)的進(jìn)程(線程),首先執(zhí)行下面的語句獲得當(dāng)前進(jìn)程(線程)的標(biāo)示PID:

          1select spid, osuser, s.program 
          2from v$session s,v$process p
          3where s.paddr=p.addr and s.sid=12 (12是上面的SESSION_ID)

          然后在OS通過任務(wù)管理器找到對(duì)應(yīng)的進(jìn)程,在殺死這個(gè)進(jìn)程(線程)

          posted @ 2010-11-27 14:55 absolute 閱讀(859) | 評(píng)論 (0)編輯 收藏
          最近在學(xué)習(xí)存儲(chǔ)過程,以前在項(xiàng)目中沒有怎么接觸過!

          我通過存儲(chǔ)過程像數(shù)據(jù)庫中批量添加一千萬(100000000)條記錄,結(jié)果PL/SQL很長時(shí)間沒有反映,結(jié)果不得已通過腳本殺掉當(dāng)前進(jìn)程,我重新通過存儲(chǔ)過程插入10000條數(shù)據(jù)。

          建表腳本:
           1--刪除用戶表
           2DROP TABLE T_PORTAL_USER;
           3
           4--創(chuàng)建用戶表
           5CREATE TABLE T_PORTAL_USER
           6(
           7    id NUMBER PRIMARY KEY-- 用戶表示
           8    username VARCHAR2(24NOT NULL,-- 用戶名
           9    password VARCHAR2(24NOT NULL,-- 密碼
          10    realname VARCHAR2(24NOT NULL,-- 真實(shí)姓名
          11    sex VARCHAR2(2DEFAULT '0',-- 性別 "0":Male "1":Female
          12    registerDate TIMESTAMP NOT NULL,-- 注冊(cè)日期
          13    state VARCHAR2(2NOT NULL -- 賬號(hào)狀態(tài) "0":啟用  "1":注銷
          14)
          15
          16--刪除用戶表序列
          17DROP SEQUENCE SEQ_T_PORTAL_USER;
          18
          19--創(chuàng)建用戶表序列
          20CREATE SEQUENCE SEQ_T_PORTAL_USER
          21START WITH 1
          22INCREMENT BY 1
          23NOMAXVALUE
          24CACHE 20


          -- 批量新增一萬條用戶

           1-- 批量新增一萬條用戶
           2CREATE OR REPLACE PROCEDURE PROC_USER_CREATE_BAT
           3AS
           4    startTime VARCHAR2(32);--開始時(shí)間
           5    endTime VARCHAR2(32);--結(jié)束時(shí)間
           6BEGIN
           7  SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:ff'INTO startTime FROM DUAL;
           8  DBMS_OUTPUT.PUT_LINE('Start Time: '||startTime);
           9  FOR i in 1..10000 LOOP
          10     INSERT INTO T_PORTAL_USER VALUES(SEQ_T_PORTAL_USER.NEXTVAL,'owen'||i,'123456','gekunjin'||i,'0',sysdate,'0');
          11  END LOOP;
          12  SELECT TO_CHAR(SYSDATE,'yyyy-mm-dd hh24:mi:ss:ff'INTO endTime FROM DUAL;
          13  DBMS_OUTPUT.PUT_LINE('End Time: '||endTime);
          14END PROC_USER_CREATE_BAT;
          posted @ 2010-11-27 14:41 absolute 閱讀(3698) | 評(píng)論 (1)編輯 收藏
               摘要: 在項(xiàng)目中使用Apache開源的Services Framework CXF來發(fā)布WebService,CXF能夠很簡潔與Spring Framework 集成在一起,在發(fā)布WebService的過程中,發(fā)布的接口的入?yún)⒂行╊愋椭С植皇呛芎?,比如Timestamp和Map。這個(gè)時(shí)候我們就需要編寫一些適配來實(shí)行類型轉(zhuǎn)換。 Timestamp:  1/** *//** &n...  閱讀全文
          posted @ 2010-11-27 14:28 absolute 閱讀(3423) | 評(píng)論 (1)編輯 收藏

          Web應(yīng)用初始化Spring容器策略

          以下軟件測試環(huán)境為Spring,Struts1

          1、通過struts1提供的插件機(jī)制,采用Spring提供的ContextLoaderPlugIn

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">

          <struts-config>
           <global-exceptions />
           <global-forwards />
           <message-resources parameter="com.portal.ApplicationResources" />
           <!--  通過S1提供的插件機(jī)制來初始化Spring容器,加載Spring配置文件
           <plug-in
            className="org.springframework.web.struts.ContextLoaderPlugIn">
            <!--
             1、ContextLoaderPlugIn默認(rèn)加載配置文件命名規(guī)則是actionServlet-servlet.xml,其中actionServlet
             是配置org.apache.struts.action.ActionServlet時(shí)指定的servlet名稱
             
             2、通過配置contextConfigLocation屬性來指點(diǎn)Spring配置文件的位置,多個(gè)配置文件可以使用 逗號(hào)","、分號(hào)";"、空格" "
            -->
            <set-property property="contextConfigLocation"
             value="/WEB-INF/conf/spring-application.xml,/WEB-INF/conf/**/spring*.xml" />
           </plug-in> 
            -->
          </struts-config>


          2、采用Spring提供的ContextLoaderListener來初始化(應(yīng)用服務(wù)器需要支持Listener,Servlet2.3版本及以上)
           <context-param>
             <description>通過配置contextConfigLocation屬性來指點(diǎn)Spring配置文件的位置,多個(gè)配置文件可以使用 逗號(hào)","、分號(hào)";"、空格" "</description>
             <param-name>contextConfigLocation</param-name>
             <param-value>/WEB-INF/conf/spring-application.xml /WEB-INF/conf/**/spring*.xml</param-value>
            </context-param>
           
            <listener>
             <description>通過ContextLocaderListener來初始化Spring容器,加載Spring配置文件</description>
             <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
            </listener>

          3、采用load-on-startup Servlet 來初始化Spring容器
            <servlet>
             <description>
              通過load-on-startup Servlet來初始化Spring容器
              該如何Servlet 用于提供"后臺(tái)"服務(wù),作為容器管理應(yīng)用中的其他bean,不需要響應(yīng)客戶請(qǐng)求,因此無須配置servlet-mapping
             </description>
             <servlet-name>applicationContext</servlet-name>
             <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
             <load-on-startup>0</load-on-startup>
            </servlet>

          posted @ 2010-09-13 18:10 absolute 閱讀(2268) | 評(píng)論 (0)編輯 收藏

          集群概念
          1. 兩大關(guān)鍵特性
          集群是一組協(xié)同工作的服務(wù)實(shí)體,用以提供比單一服務(wù)實(shí)體更具擴(kuò)展性與可用性的服務(wù)平臺(tái)。在客戶端看來,一個(gè)集群就象是一個(gè)服務(wù)實(shí)體,但事實(shí)上集群由一組服務(wù)實(shí)體組成。與單一服務(wù)實(shí)體相比較,集群提供了以下兩個(gè)關(guān)鍵特性:

          ·  可擴(kuò)展性--集群的性能不限于單一的服務(wù)實(shí)體,新的服務(wù)實(shí)體可以動(dòng)態(tài)地加入到集群,從而增強(qiáng)集群的性能。

          ·  高可用性--集群通過服務(wù)實(shí)體冗余使客戶端免于輕易遇到out of service的警告。在集群中,同樣的服務(wù)可以由多個(gè)服務(wù)實(shí)體提供。如果一個(gè)服務(wù)實(shí)體失敗了,另一個(gè)服務(wù)實(shí)體會(huì)接管失敗的服務(wù)實(shí)體。集群提供的從一個(gè)出錯(cuò)的服務(wù)實(shí)體恢復(fù)到另一個(gè)服務(wù)實(shí)體的功能增強(qiáng)了應(yīng)用的可用性。

          2. 兩大能力
          為了具有可擴(kuò)展性和高可用性特點(diǎn),集群的必須具備以下兩大能力:

          ·  負(fù)載均衡--負(fù)載均衡能把任務(wù)比較均衡地分布到集群環(huán)境下的計(jì)算和網(wǎng)絡(luò)資源。

          ·  錯(cuò)誤恢復(fù)--由于某種原因,執(zhí)行某個(gè)任務(wù)的資源出現(xiàn)故障,另一服務(wù)實(shí)體中執(zhí)行同一任務(wù)的資源接著完成任務(wù)。這種由于一個(gè)實(shí)體中的資源不能工作,另一個(gè)實(shí)體中的資源透明的繼續(xù)完成任務(wù)的過程叫錯(cuò)誤恢復(fù)。

          負(fù)載均衡和錯(cuò)誤恢復(fù)都要求各服務(wù)實(shí)體中有執(zhí)行同一任務(wù)的資源存在,而且對(duì)于同一任務(wù)的各個(gè)資源來說,執(zhí)行任務(wù)所需的信息視圖(信息上下文)必須是一樣的。

          3. 兩大技術(shù)
          實(shí)現(xiàn)集群務(wù)必要有以下兩大技術(shù):

          ·  集群地址--集群由多個(gè)服務(wù)實(shí)體組成,集群客戶端通過訪問集群的集群地址獲取集群內(nèi)部各服務(wù)實(shí)體的功能。具有單一集群地址(也叫單一影像)是集群的一個(gè)基本特征。維護(hù)集群地址的設(shè)置被稱為負(fù)載均衡器。負(fù)載均衡器內(nèi)部負(fù)責(zé)管理各個(gè)服務(wù)實(shí)體的加入和退出,外部負(fù)責(zé)集群地址向內(nèi)部服務(wù)實(shí)體地址的轉(zhuǎn)換。有的負(fù)載均衡器實(shí)現(xiàn)真正的負(fù)載均衡算法,有的只支持任務(wù)的轉(zhuǎn)換。只實(shí)現(xiàn)任務(wù)轉(zhuǎn)換的負(fù)載均衡器適用于支持ACTIVE-STANDBY的集群環(huán)境,在那里,集群中只有一個(gè)服務(wù)實(shí)體工作,當(dāng)正在工作的服務(wù)實(shí)體發(fā)生故障時(shí),負(fù)載均衡器把后來的任務(wù)轉(zhuǎn)向另外一個(gè)服務(wù)實(shí)體。

          ·  內(nèi)部通信--為了能協(xié)同工作、實(shí)現(xiàn)負(fù)載均衡和錯(cuò)誤恢復(fù),集群各實(shí)體間必須時(shí)常通信,比如負(fù)載均衡器對(duì)服務(wù)實(shí)體心跳測試信息、服務(wù)實(shí)體間任務(wù)執(zhí)行上下文信息的通信。

          具有同一個(gè)集群地址使得客戶端能訪問集群提供的計(jì)算服務(wù),一個(gè)集群地址下隱藏了各個(gè)服務(wù)實(shí)體的內(nèi)部地址,使得客戶要求的計(jì)算服務(wù)能在各個(gè)服務(wù)實(shí)體之間分布。內(nèi)部通信是集群能正常運(yùn)轉(zhuǎn)的基礎(chǔ),它使得集群具有均衡負(fù)載和錯(cuò)誤恢復(fù)的能力。

          集群分類
          Linux集群主要分成三大類( 高可用集群, 負(fù)載均衡集群,科學(xué)計(jì)算集群)

          高可用集群( High Availability Cluster)
          負(fù)載均衡集群(Load Balance Cluster)
          科學(xué)計(jì)算集群(High Performance Computing Cluster)
          ================================================

          具體包括:

          Linux High Availability 高可用集群                                      
          (普通兩節(jié)點(diǎn)雙機(jī)熱備,多節(jié)點(diǎn)HA集群,RAC, shared, share-nothing集群等)

          Linux Load Balance 負(fù)載均衡集群                                     
           (LVS等....)

          Linux High Performance Computing 高性能科學(xué)計(jì)算集群    
           (Beowulf 類集群....)

          分布式存儲(chǔ)                                                                        
          其他類linux集群             
          (如Openmosix, rendering farm 等..)

          詳細(xì)介紹
          1. 高可用集群(High Availability Cluster)
          常見的就是2個(gè)節(jié)點(diǎn)做成的HA集群,有很多通俗的不科學(xué)的名稱,比如"雙機(jī)熱備", "雙機(jī)互備", "雙機(jī)".
          高可用集群解決的是保障用戶的應(yīng)用程序持續(xù)對(duì)外提供服務(wù)的能力。 (請(qǐng)注意高可用集群既不是用來保護(hù)業(yè)務(wù)數(shù)據(jù)的,保護(hù)的是用戶的業(yè)務(wù)程序?qū)ν獠婚g斷提供服務(wù),把因軟件/硬件/人為造成的故障對(duì)業(yè)務(wù)的影響降低到最小程度)。

          2. 負(fù)載均衡集群(Load Balance Cluster)

          負(fù)載均衡系統(tǒng):集群中所有的節(jié)點(diǎn)都處于活動(dòng)狀態(tài),它們分?jǐn)傁到y(tǒng)的工作負(fù)載。一般Web服務(wù)器集群、數(shù)據(jù)庫集群和應(yīng)用服務(wù)器集群都屬于這種類型。

          負(fù)載均衡集群一般用于相應(yīng)網(wǎng)絡(luò)請(qǐng)求的網(wǎng)頁服務(wù)器,數(shù)據(jù)庫服務(wù)器。這種集群可以在接到請(qǐng)求時(shí),檢查接受請(qǐng)求較少,不繁忙的服務(wù)器,并把請(qǐng)求轉(zhuǎn)到這些服務(wù)器上。從檢查其他服務(wù)器狀態(tài)這一點(diǎn)上看,負(fù)載均衡和容錯(cuò)集群很接近,不同之處是數(shù)量上更多。

          3. 科學(xué)計(jì)算集群(High Performance Computing Cluster)

          高性能計(jì)算(High Perfermance Computing)集群,簡稱HPC集群。這類集群致力于提供單個(gè)計(jì)算機(jī)所不能提供的強(qiáng)大的計(jì)算能力。

          高性能計(jì)算分類  
           高吞吐計(jì)算(High-throughput Computing)
            有一類高性能計(jì)算,可以把它分成若干可以并行的子任務(wù),而且各個(gè)子任務(wù)彼此間沒有什么關(guān)聯(lián)。象在家搜尋外星人( SETI@HOME -- Search for Extraterrestrial Intelligence at Home )就是這一類型應(yīng)用。這一項(xiàng)目是利用Internet上的閑置的計(jì)算資源來搜尋外星人。SETI項(xiàng)目的服務(wù)器將一組數(shù)據(jù)和數(shù)據(jù)模式發(fā)給Internet上參加SETI的計(jì)算節(jié)點(diǎn),計(jì)算節(jié)點(diǎn)在給定的數(shù)據(jù)上用給定的模式進(jìn)行搜索,然后將搜索的結(jié)果發(fā)給服務(wù)器。服務(wù)器負(fù)責(zé)將從各個(gè)計(jì)算節(jié)點(diǎn)返回的數(shù)據(jù)匯集成完整的數(shù)據(jù)。因?yàn)檫@種類型應(yīng)用的一個(gè)共同特征是在海量數(shù)據(jù)上搜索某些模式,所以把這類計(jì)算稱為高吞吐計(jì)算。所謂的Internet計(jì)算都屬于這一類。按照 Flynn的分類,高吞吐計(jì)算屬于SIMD(Single Instruction/Multiple Data)的范疇。

           分布計(jì)算(Distributed Computing)
            另一類計(jì)算剛好和高吞吐計(jì)算相反,它們雖然可以給分成若干并行的子任務(wù),但是子任務(wù)間聯(lián)系很緊密,需要大量的數(shù)據(jù)交換。按照Flynn的分類,分布式的高性能計(jì)算屬于MIMD(Multiple Instruction/Multiple Data)的范疇。

          4. 分布式(集群)與集群的聯(lián)系與區(qū)別
          分布式是指將不同的業(yè)務(wù)分布在不同的地方。
          而集群指的是將幾臺(tái)服務(wù)器集中在一起,實(shí)現(xiàn)同一業(yè)務(wù)。
          分布式中的每一個(gè)節(jié)點(diǎn),都可以做集群。
          而集群并不一定就是分布式的。
          舉例:就比如新浪網(wǎng),訪問的人多了,他可以做一個(gè)群集,前面放一個(gè)響應(yīng)服務(wù)器,后面幾臺(tái)服務(wù)器完成同一業(yè)務(wù),如果有業(yè)務(wù)訪問的時(shí)候,響應(yīng)服務(wù)器看哪臺(tái)服務(wù)器的負(fù)載不是很重,就將給哪一臺(tái)去完成。
          而分布式,從窄意上理解,也跟集群差不多, 但是它的組織比較松散,不像集群,有一個(gè)組織性,一臺(tái)服務(wù)器垮了,其它的服務(wù)器可以頂上來。
          分布式的每一個(gè)節(jié)點(diǎn),都完成不同的業(yè)務(wù),一個(gè)節(jié)點(diǎn)垮了,哪這個(gè)業(yè)務(wù)就不可訪問了。

           

          本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/tanghongru1983/archive/2009/04/28/4130356.aspx

          posted @ 2010-03-02 14:16 absolute 閱讀(642) | 評(píng)論 (0)編輯 收藏
          代碼如下:
          import java.io.BufferedReader;
          import java.io.IOException;
          import java.io.InputStreamReader;

          public class MyEclipseGen {
          private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";

          public String getSerial(String userId, String licenseNum) {
             java.util.Calendar cal 
          = java.util.Calendar.getInstance();
             cal.add(
          13);
             cal.add(
          6-1);
             java.text.NumberFormat nf 
          = new java.text.DecimalFormat("000");
             licenseNum 
          = nf.format(Integer.valueOf(licenseNum));
             String verTime 
          = new StringBuilder("-").append(
               
          new java.text.SimpleDateFormat("yyMMdd").format(cal.getTime()))
               .append(
          "0").toString();
             String type 
          = "YE3MP-";
             String need 
          = new StringBuilder(userId.substring(01)).append(type)
               .append(
          "300").append(licenseNum).append(verTime).toString();
             String dx 
          = new StringBuilder(need).append(LL).append(userId)
               .toString();
             
          int suf = this.decode(dx);
             String code 
          = new StringBuilder(need).append(String.valueOf(suf))
               .toString();
             
          return this.change(code);
          }


          private int decode(String s) {
             
          int i;
             
          char[] ac;
             
          int j;
             
          int k;
             i 
          = 0;
             ac 
          = s.toCharArray();
             j 
          = 0;
             k 
          = ac.length;
             
          while (j < k) {
              i 
          = (31 * i) + ac[j];
              j
          ++;
             }

             
          return Math.abs(i);
          }


          private String change(String s) {
             
          byte[] abyte0;
             
          char[] ac;
             
          int i;
             
          int k;
             
          int j;
             abyte0 
          = s.getBytes();
             ac 
          = new char[s.length()];
             i 
          = 0;
             k 
          = abyte0.length;
             
          while (i < k) {
              j 
          = abyte0[i];
              
          if ((j >= 48&& (j <= 57)) {
               j 
          = (((j - 48+ 5% 10+ 48;
              }
           else if ((j >= 65&& (j <= 90)) {
               j 
          = (((j - 65+ 13% 26+ 65;
              }
           else if ((j >= 97&& (j <= 122)) {
               j 
          = (((j - 97+ 13% 26+ 97;
              }

              ac[i] 
          = (char) j;
              i
          ++;
             }

             
          return String.valueOf(ac);
          }


          public MyEclipseGen() {
             
          super();
          }


          public static void main(String[] args) {
             
          try {
              System.out.println(
          "please input register name:");
              BufferedReader reader 
          = new BufferedReader(new InputStreamReader(
                System.in));
              String userId 
          = null;
              userId 
          = reader.readLine();
              MyEclipseGen myeclipsegen 
          = new MyEclipseGen();
              String res 
          = myeclipsegen.getSerial(userId, "5");
              System.out.println(
          "Serial:" + res);
              reader.readLine();
             }
           catch (IOException ex) {
             }

          }

          }


          注冊(cè)方法:
          window -> preferences -> myeclipse -> subscription

           

          posted @ 2010-02-16 09:20 absolute| 編輯 收藏

           

          Hibernate學(xué)習(xí)筆記

          1、Hibernate核心類與接口    

          1-1.Configuration

                Configuration類是Hibernate的入口,它負(fù)責(zé)配置和啟動(dòng)Hibernate,Hibernate框架通過Configuration實(shí)例加載配置文件信息(hibernate.cfg.xml),然后讀取指定對(duì)象關(guān)系映射文件(bean.hbm.xml)的內(nèi)容并創(chuàng)建SessionFactory.

          1-2.SessionFactory接口

                 SessionFactory接口負(fù)責(zé)初始化Hibernate,一個(gè)SessionFactory實(shí)例對(duì)應(yīng)一個(gè)數(shù)據(jù)存儲(chǔ)源(一般就是指一個(gè)數(shù)據(jù)庫)。應(yīng)用程序從SessionFactory中獲得Session實(shí)例。SessionFactory具有以下特點(diǎn):

                 1)    線程安全,即同一個(gè) SessionFactory實(shí)例可以被應(yīng)用 的多個(gè)線程共享。

                 2)    它是重量級(jí)的 ,因?yàn)樗枰粋€(gè)很大的緩存,用來存放預(yù)定義的SQL語句以及映射元數(shù)據(jù)等。

          所以說 ,如果一個(gè)應(yīng)用程序中只訪問一個(gè)數(shù)據(jù)庫 ,則只需要?jiǎng)?chuàng)建一個(gè)全局的 SessionFactory實(shí)例。

          1-3.Session 接口

              SessionHibernate中應(yīng)用最頻繁的接口。Session也被稱為持久化管理器 ,它負(fù)責(zé)管理所有與持久化相關(guān)的操作:如存儲(chǔ)、更新、刪除和加載對(duì)象等。Session接口具有以下特點(diǎn):

              1)    單線程,非共享的對(duì)象。線程不安全,在設(shè)計(jì)軟件架構(gòu)時(shí)候,應(yīng)該避免多個(gè)線程共享同一個(gè)session實(shí)例。

              2)    Session 實(shí)例是輕量級(jí)的,它的創(chuàng)建和銷毀不需要消耗太多的資源??梢詾槊總€(gè)請(qǐng)分配一個(gè)Session實(shí)例,在每次請(qǐng)求過程匯總及時(shí)創(chuàng)建和銷毀 Session實(shí)例。

              3)    Session有一個(gè)緩存,它存放當(dāng)前工作單元加載的對(duì)象。Session的緩存被稱為Hibernate的一級(jí)緩存。

          1-4.Transaction接口

              Transaction接口是 Hibernate框架的事務(wù)接口。它對(duì)底層的事務(wù)接口做了封裝,包括:JDBC APIJTA.這樣使得Hibernate應(yīng)用可以通過一致的Transaction接口來申明事務(wù)邊界,這有助于應(yīng)用程序再不同的環(huán)境和容器中移植。

          1-5.QueryCriteria接口

              它們是 Hibernate的查詢接口,用于從數(shù)據(jù)存儲(chǔ)源查詢對(duì)象及控制執(zhí)行查詢的過程。Query包裝了一個(gè) HQL(Hibernate Query Language);而Criteria接口完全封裝了基本字符串形式的查詢語句,比Query更加面向?qū)ο螅?/span>Criteria接口擅長于執(zhí)行動(dòng)態(tài)查詢。

          2、Hibernate中常用的事務(wù)隔離級(jí)別

          常量

          說明

          TRANSACTION_NONE 

          0

          不支持事務(wù)

          TRANSACTION_READ_UNCOMMITTED

          1

          指示可以發(fā)生臟讀(dirty read)、不可重復(fù)讀和虛讀(phantom read)的常量。此級(jí)別允許被某一事務(wù)更改的行在已提交該行所有更改之前被另一個(gè)事務(wù)讀取(“臟讀”)。如果所有更改都被回滾,則第二個(gè)事務(wù)將獲取無效的行。

          TRANSACTION_READ_COMMITTED

          2

          指示不可以發(fā)生臟讀的常量;不可重復(fù)讀和虛讀可以發(fā)生。此級(jí)別只禁止事務(wù)讀取其中帶有未提交更改的行。

          TRANSACTION_REPEATABLE_READ

          4

          指示不可以發(fā)生臟讀和不可重復(fù)讀的常量;虛讀可以發(fā)生。此級(jí)別禁止事務(wù)讀取帶有未提交更改的行,它還禁止這種情況:一個(gè)事務(wù)讀取某一行,而另一個(gè)事務(wù)更改該行,第一個(gè)事務(wù)重新讀取該行,并在第二次讀取時(shí)獲得不同的值(“不可重復(fù)讀”)。

          TRANSACTION_SERIALIZABLE

          8

          指示不可以發(fā)生臟讀、不可重復(fù)讀和虛讀的常量。此級(jí)別包括TRANSACTION_REPEATABLE_READ 中禁止的事項(xiàng),同時(shí)還禁止出現(xiàn)這種情況:某一事務(wù)讀取所有滿足 WHERE 條件的行,另一個(gè)事務(wù)插入一個(gè)滿足 WHERE 條件的行,第一個(gè)事務(wù)重新讀取滿足相同條件的行,并在第二次讀取時(shí)獲得額外的“虛”行。

          3、Hibernate中實(shí)例的狀態(tài)

          3-1:臨時(shí)狀態(tài)

                 該實(shí)例從未與任何持久化上下文關(guān)聯(lián)過。它沒有持久化標(biāo)識(shí)(相當(dāng)于主鍵值),臨時(shí)狀態(tài)下的對(duì)象有如下特征。

          1)    不處于Session緩存中,也可以說不被任何一個(gè)Session關(guān)聯(lián)

          2)    在數(shù)據(jù)庫中沒有對(duì)應(yīng)的記錄

          在以下情況下,Java對(duì)象進(jìn)入臨時(shí)狀態(tài)

          1) 當(dāng)通過new語句剛創(chuàng)建一個(gè)Java對(duì)象,它處于臨時(shí)狀態(tài),此時(shí)不和數(shù)據(jù)庫中的任何記錄對(duì)應(yīng)。

          2) Sessiondelete()方法能使一個(gè)持久化或臨時(shí)脫管對(duì)象轉(zhuǎn)換為臨時(shí)對(duì)象。對(duì)于脫管對(duì)象,delete()方法從數(shù)據(jù)庫中刪除與它對(duì)應(yīng)的記錄,并且把它從Session緩存中刪除。

          3-2:持久化狀態(tài)

                該實(shí)例目前與某個(gè)持久化上下文有關(guān)聯(lián),它擁有持久化標(biāo)識(shí)(相當(dāng)于主鍵值),并且可能在數(shù)據(jù)庫匯總有一個(gè)對(duì)應(yīng)的行。對(duì)于某一個(gè)特定的持久化上下文,Hibernate保證標(biāo)識(shí)與Java標(biāo)識(shí)(其值代表對(duì)應(yīng)在內(nèi)存中的位置)等價(jià)。持久化對(duì)象有以下特征。

          1) 位于一個(gè)Session實(shí)例的緩存中,也可以說,持久化對(duì)象總是被一個(gè)Session實(shí)例關(guān)聯(lián)。

          2) 持久化對(duì)象和數(shù)據(jù)庫中的相關(guān)記錄對(duì)應(yīng)。

          3) Session在清理緩存時(shí),會(huì)根據(jù)持久化對(duì)象的屬性變化,來同步更新數(shù)據(jù)庫。

          Session的許多方法都能夠觸發(fā)Java對(duì)象進(jìn)入持久化狀態(tài)。

          4) Sessionsave()的方法能夠把臨時(shí)對(duì)象轉(zhuǎn)變成持久化對(duì)象。

          5) Sessionload()get()方法返回的對(duì)象總是處于持久化狀態(tài)。

          6) Query類的list()方法返回的list集合中存放的都是持久化對(duì)象。

          7) Sessionupdate()、saveOrUpdate()lock()方法使脫管對(duì)象轉(zhuǎn)變?yōu)槌志没瘜?duì)象。

          當(dāng)一個(gè)持久化對(duì)象關(guān)聯(lián)一個(gè)臨時(shí)對(duì)象時(shí),在允許級(jí)聯(lián)保存的情況下,Session在清理緩存時(shí)會(huì)把這個(gè)臨時(shí)對(duì)象也轉(zhuǎn)變成持久化對(duì)象。Hibernate保證在同一個(gè)Session實(shí)例的緩存中,數(shù)據(jù)庫表中的每條記錄只對(duì)應(yīng)唯一的持久化對(duì)象,也就是說在一個(gè)Sessionload/get同一個(gè)OID得到 的是相同的對(duì)象。

          3-3:脫管狀態(tài)

                      實(shí)例曾經(jīng)與某個(gè)持久化上下文發(fā)生過關(guān)聯(lián),不過那個(gè)上下文被關(guān)閉了,或者這個(gè)實(shí)例是被序列化(serialize)到另外的進(jìn)程。它擁有持久化標(biāo)識(shí),并且在數(shù)據(jù)庫中可能存在一個(gè)對(duì)應(yīng)的行。對(duì)于脫管狀態(tài)的實(shí)例,Hibernate不保證任何持久化標(biāo)識(shí)和Java標(biāo)識(shí)的關(guān)系。

          脫管對(duì)象具有以下特征。

          1)    不再位于Session的緩存中,也可以說,脫管對(duì)象不被Session關(guān)聯(lián)。

          2)    脫管對(duì)象是有持久化對(duì)象轉(zhuǎn)變過來的,因此在數(shù)據(jù)庫中可能還存在與它對(duì)應(yīng)的記錄(前提條件是沒有其他程序刪除了這條記錄)。

          3)    脫管對(duì)象與臨時(shí)對(duì)象的相同指出在于兩者都不被Session關(guān)聯(lián),因此Hibernate不會(huì)保證他們屬性變化與數(shù)據(jù)庫保持同步。脫管對(duì)象與臨時(shí)對(duì)象的區(qū)別在于前者是由持久化對(duì)象轉(zhuǎn)變過來的,因此可能在書庫中還存在對(duì)應(yīng)的記錄,而后者在數(shù)據(jù)庫中是沒有對(duì)應(yīng)的記錄的。

          Session的以下方法使持久化對(duì)象轉(zhuǎn)變成脫管對(duì)象.

          1)      當(dāng)調(diào)用Sessionclose()方法時(shí),Session 的緩存被清空,緩存中的所有持久化對(duì)象都變?yōu)槊摴軐?duì)象,如果在應(yīng)用程序中沒有引用變量引用這些脫管對(duì)象,他們就會(huì)結(jié)束生命周期。

          2)      Sessionevict()方法能夠從緩存中刪除一個(gè)持久化對(duì)象,使它變?yōu)槊摴軤顟B(tài),當(dāng)Session的緩存中保存了大量的持久化對(duì)象時(shí),會(huì)消耗許多內(nèi)存空間,為了提高性能,可以考慮調(diào)用evict()方法,從緩存中刪除一些持久化對(duì)象。但是多數(shù)情況下不推薦使用該方法,而應(yīng)該通過查詢語言,或者顯示的導(dǎo)航來控制對(duì)象圖的深度。

           

          posted @ 2010-01-09 19:08 absolute 閱讀(673) | 評(píng)論 (0)編輯 收藏
          最近在構(gòu)思寫一些設(shè)計(jì)模式方面的文章,用到UML圖,以前用Visio和WithClass..但功能不多,所以就安裝了Rose 2003..以下是安裝過程:

               1.安裝Rose后,默認(rèn)是需要許可證書的..去下載個(gè)破解的..我上傳了破解文件..點(diǎn)擊這里下載Rose 2003破解

               2.先用破解壓縮包里的 rational.exe,lmgrd.exe 覆蓋到你的 \安裝目錄的Rartional\commen\下

               3.然后記事本打開 license.dat, 修改里面的 SERVER yourPC ANY  DAEMON rational "C:\Program Files\Rational\Common\rational.exe"
               改成 SERVER 你的機(jī)器名 ANY  DAEMON rational "你的安裝目錄\rational.exe" ,拷貝到Common目錄下..

              4. 將Flexlm.cpl拷貝到C:\winnt\system32\下, 在控制面板里運(yùn)行 FlexLm License Manager,   

              運(yùn)行后, 在 Setup 面板配置文件路徑,lmgrd.exe -> 你的安裝目錄 \Common\lmgrd.exe, 而 License File 為你改過的 license.dat ...



               5.在Control面板點(diǎn)擊Start,如果成功的話點(diǎn)擊Status按鈕將顯示 你的機(jī)器名:license server UP (MASTER) 說明成功了
               失敗的話重啟一下FlexLm License Manager就沒問題了。 



               6.如果彈出對(duì)話框License Key Administrator Wizard后, 選定Point to a Rational License Server to get my licenses,單擊下一步,
          Server Name文本框中填寫你的機(jī)器號(hào)(可能已經(jīng)填好),單擊完成。 (成功的話會(huì)出現(xiàn)兩屏的licenses) 

          注意:本文轉(zhuǎn)至:http://www.cnblogs.com/lixianhuei/archive/2006/01/09/313644.html
          posted @ 2009-10-25 08:29 absolute 閱讀(877) | 評(píng)論 (1)編輯 收藏
          主站蜘蛛池模板: 富民县| 临江市| 永善县| 麻城市| 图木舒克市| 肃南| 民县| 永泰县| 湘潭县| 常山县| 安乡县| 武夷山市| 富锦市| 白朗县| 常州市| 洪泽县| 囊谦县| 长宁区| 株洲市| 通河县| 新丰县| 常山县| 九江市| 行唐县| 宜兴市| 深圳市| 玉林市| 富民县| 洛隆县| 福贡县| 高碑店市| 阿尔山市| 武宁县| 靖江市| 阿拉善左旗| 永和县| 青海省| 镇远县| 龙南县| 大港区| 茶陵县|