csusky

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          #

          數(shù)據(jù)庫(kù)的事務(wù) JDBC

          TRANSACTION_NONE:
            正式地講,TRANSACTION_NONE不是一個(gè)有效的事務(wù)級(jí)別。
            根據(jù)java.sql Connection API文件,這個(gè)級(jí)別表示事務(wù)是
            不被支持的,因此理論上說(shuō)你不能使用TRANSACTION_NONE作
            為一個(gè)自變量賦給Connection.setTransactionIsolation()
            方法。事實(shí)上,雖然一些數(shù)據(jù)庫(kù)實(shí)施了這個(gè)事務(wù)級(jí)別,但是
            Oracle9i卻沒(méi)有實(shí)施。


           臟讀取(TRANSACTION_READ_UNCOMMITTE):
          (允許的操作       讀-讀  讀-寫 寫-讀     (臟數(shù)據(jù),不可重復(fù)讀,虛讀) )
             表示,這個(gè)事務(wù)級(jí)別
            允許讀取臟數(shù)據(jù),什么是臟數(shù)據(jù)?就是指還沒(méi)有提交的數(shù)據(jù).
            因?yàn)檫@個(gè)級(jí)別,是允許一個(gè)事務(wù)(A)讀取另一個(gè)事務(wù)(B)
            還沒(méi)有提交的數(shù)據(jù).一旦事務(wù)B發(fā)生異常退出.而修改了的數(shù)據(jù)
            卻還沒(méi)提交,或者新插入的數(shù)據(jù)和刪除了的數(shù)據(jù)都還沒(méi)有
            提交,導(dǎo)致事務(wù)A拿到了一些臟數(shù)據(jù),或者錯(cuò)誤數(shù)據(jù);
            因此在這個(gè)事務(wù)級(jí)別里是會(huì)發(fā)生臟讀,重復(fù)讀,錯(cuò)誤讀取;

           禁止臟讀(TRANSACTION_READ_COMMITTED):
          (允許的操作       讀-讀  讀-寫 (不可重復(fù)讀,虛讀))
            在這個(gè)級(jí)別中,事務(wù)A
            只能讀取一些提交的數(shù)據(jù),如事務(wù)B添加了一條記錄,但是
            如果事務(wù)B沒(méi)有提交,那么事務(wù)A是讀不到的,所以該事務(wù)級(jí)別,
            把臟讀給屏蔽掉了.---卻允許重復(fù)讀取,和錯(cuò)誤讀取.

            什么是重復(fù)讀取呢?譬如,事務(wù)A讀取了一個(gè)數(shù)據(jù),這個(gè)數(shù)據(jù)
            的值為"helloworld",事務(wù)A準(zhǔn)備利用這個(gè)數(shù)據(jù)來(lái)更新一下
            其他數(shù)據(jù),但這個(gè)時(shí)候事務(wù)B開(kāi)始對(duì)這個(gè)數(shù)據(jù)進(jìn)行修改,并且
            提交---"hello 無(wú)名氏",由于是已經(jīng)提交了,所以事務(wù)A是可以
            看到這個(gè)數(shù)據(jù)的,當(dāng)事務(wù)A在沒(méi)提交事務(wù)之前,它想看下數(shù)據(jù)
            是否正確,這個(gè)時(shí)候它發(fā)現(xiàn),新讀出的數(shù)據(jù)已經(jīng)和原來(lái)的數(shù)據(jù)
            不一樣了(這就是重復(fù)讀取);




           允許重復(fù)讀取(TRANSACTION_REPEATABLE_READ):
          (允許的操作       讀-讀  讀-寫(僅允許插入,不允許刪除和修改)(虛讀))
            在這個(gè)級(jí)別中,
            是禁止了臟讀,和取消了不可重復(fù)讀取,但是沒(méi)有禁止錯(cuò)誤讀取;
            這個(gè)級(jí)別的事務(wù)比較嚴(yán)格,當(dāng)一個(gè)事務(wù)A在讀取一個(gè)值的時(shí)候
            是不允許另一個(gè)事務(wù)對(duì)該值進(jìn)行修改的;
            為了允許重復(fù)讀取,可以選用該級(jí)別,因?yàn)門RANSACTION_READ_
            COMMITED這個(gè)事務(wù)級(jí)別,是允許重復(fù)讀取提交的數(shù)據(jù)的,如果
            事務(wù)A在讀取一個(gè)數(shù)值的時(shí)候,值為"Hello World!",但這個(gè)時(shí)
            候事務(wù)B對(duì)"Hello World"值進(jìn)行修改了,改為"Hello EveryOne"
            然后提交,當(dāng)事務(wù)A再次去讀取這個(gè)值的時(shí)候,去發(fā)現(xiàn)原來(lái)讀到
            的值改變了,變成了"Hello EveryOne",為了防止出現(xiàn)這種情況
            可以禁止重復(fù)提交,目的是為了重復(fù)讀取不會(huì)出錯(cuò)!那么這個(gè)
            時(shí)候就可以選擇
          TRANSACTION_REPEATABLE_READ這個(gè)級(jí)別,
            這個(gè)級(jí)別就是用來(lái)禁止重復(fù)提交的.
          (實(shí)際上是加了行鎖,鎖定了選中的數(shù)據(jù),不允許修改,但是允許插入新的數(shù)據(jù))
            雖然這個(gè)時(shí)候是禁止了重復(fù)提交,但卻可以添加刪除,
            比如事務(wù)A,作了個(gè)查詢語(yǔ)句"select * from 無(wú)名氏 "; 這個(gè)時(shí)候是允許事務(wù)B做這樣的操作的:
            "insert into 無(wú)名氏 values(2,'aaa')"; 這個(gè)時(shí)候,
            事務(wù)A再次做讀取操作的時(shí)候,卻發(fā)現(xiàn)數(shù)據(jù)莫名其妙的
            多了一條,這就是所謂的---幻影讀取;




           禁止幻讀(TRANSACTION_SERIALIZABLE):
           事務(wù)的最高級(jí)別(串行化  操作)事務(wù)級(jí)別最高,所耗費(fèi)的性能也越多.
            禁止幻讀禁止了臟讀,禁止了重復(fù)提交和幻讀.
            也就是當(dāng)事務(wù)A在按條件查詢的時(shí)候,事務(wù)A一旦沒(méi)有提
            交,任何事務(wù)都不能對(duì)事務(wù)A的資源進(jìn)行操作--- 保證
            事務(wù)A的操作真正的原子性!


           注意:在Oracle中只支持兩種級(jí)別:

            TRANSACTION_READ_COMMITTED(默認(rèn)的級(jí)別)(只有提交后
               才可以讀取)而每一個(gè)終端進(jìn)行自己的DML操作 都自動(dòng)開(kāi)啟了一個(gè)事務(wù)

            TRANSACTION_SERIALIZABLE(竄行化操作)

          posted @ 2008-03-05 09:34 曉宇 閱讀(329) | 評(píng)論 (0)編輯 收藏

          字符串池

          Java運(yùn)行環(huán)境有一個(gè)字符串池,由String類維護(hù)。執(zhí)行語(yǔ)句String str="abc"時(shí),首先查看字符串池中是否存在字符串"abc",如果存在則直接將"abc"賦給str,如果不存在則先在字符串池中新建一個(gè)字符串"abc",然后再將其賦給str。執(zhí)行語(yǔ)句String str=new String("abc")時(shí),不管字符串池中是否存在字符串"abc",直接新建一個(gè)字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后將其付給str。前一語(yǔ)句的效率高,后一語(yǔ)句的效率低,因?yàn)樾陆ㄗ址加脙?nèi)存空間。String str = new String()創(chuàng)建了一個(gè)空字符串,與String str=new String("")相同。

          public String intern()
          返回字符串對(duì)象的規(guī)范化表示形式。

          一個(gè)初始為空的字符串池,它由類 String 私有地維護(hù)。

          當(dāng)調(diào)用 intern 方法時(shí),如果池已經(jīng)包含一個(gè)等于此 String 對(duì)象的字符串(用 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對(duì)象添加到池中,并返回此 String 對(duì)象的引用。

          它遵循以下規(guī)則:對(duì)于任意兩個(gè)字符串 st,當(dāng)且僅當(dāng) s.equals(t)true 時(shí),s.intern() == t.intern() 才為 true

            String.intern();
          再補(bǔ)充介紹一點(diǎn):存在于.class文件中的常量池,在運(yùn)行期間被jvm裝載,并且可以擴(kuò)充。String的intern()方法就是擴(kuò)充常量池的一個(gè)方法;當(dāng)一個(gè)String實(shí)例str調(diào)用intern()方法時(shí),java查找常量池中是否有相同unicode的字符串常量,如果有,則返回其引用,如果沒(méi)有,則在常量池中增加一個(gè)unicode等于str的字符串并返回它的引用。
          例3:
          String   s0=”kvill”;
          String   s1=new   String(“kvill”);
          String   s2=new   String(“kvill”);
          System.out.println(s0==s1);
          S1.intern();
          S2=s2.intern();
          System.out.println(s0==s1);
          System.out.prntln(s0==s1.intern());
          System.out.println(s0==s2);
          結(jié)果為:
          False
          False   //雖然執(zhí)行了s1.intern(),但它的返回值沒(méi)有賦給s1
          True
          True
          最后再破除一個(gè)錯(cuò)誤的理解:
          有人說(shuō),“使用String.intern()方法可以將一個(gè)String類保存到一個(gè)全局的String表中,如果具有相同值的unicode字符串已經(jīng)在這個(gè)表中,那么該方法返回表中已有字符串的地址,如果在表中沒(méi)有相同值的字符串,則將自己的地址注冊(cè)到表中”如果把這個(gè)全局的String表理解為常量吃的話,最后一句話“如果在表中沒(méi)有相同值的字符串,則將自己的地址注冊(cè)到表中”是錯(cuò)的。
          例4:
          String   s1=new   String(“kvill”);
          String   s2=s1.intern();
          System.out.println(s1==s1.intern());
          System.out.println(s1+”   ”+s2);
          System.out.println(s2==s1.intern());
          結(jié)果是:
          False
          Kvill   kvill
          True
          我們沒(méi)有聲明一個(gè)”kvill”常量,所以常量池中一開(kāi)始沒(méi)有”kvill”的,當(dāng)我們調(diào)用s1.intern()后就在常量池中新添加了一個(gè)”kvill”常量,原來(lái)的不在常量池中的”kvill”仍然存在,也就不是“把自己的地址注冊(cè)到常量池中”了。
          例5:
          String   str1=”java”;
          String   str2=”blog”;
          String   s=str1+str2;
          System.out.println(s==”javablog”);
          結(jié)果是false。Jvm確實(shí)對(duì)型如String   str1=”java”;的String對(duì)象放在常量池里,但是它是在編譯時(shí)那么做的,而String   s=str1+str2;是在運(yùn)行時(shí)刻才能知道,也就是說(shuō)str1+str2是在堆里創(chuàng)建的,所以結(jié)果為false了。


          比較兩個(gè)已經(jīng)存在于字符串池中字符串對(duì)象可以用"=="進(jìn)行,擁有比equals操作符更快的速度

          posted @ 2008-03-04 09:40 曉宇 閱讀(849) | 評(píng)論 (0)編輯 收藏

          JAVA中的異常處理

          在JAVA中,如果某個(gè)方法不能夠按照正常的途徑完成它的任務(wù),就可以通過(guò)另外一個(gè)途徑退出方法。在這種情況下,方法并不立刻返回,而是拋出一個(gè)封裝了錯(cuò)誤信息的對(duì)象。需要注意的是,這個(gè)方法將會(huì)立刻退出,且并不返回正常情況下的值。此外,調(diào)用這個(gè)方法的代碼也將無(wú)法執(zhí)行,取而代之的是,異常處理機(jī)制開(kāi)始搜索能夠處理這種錯(cuò)誤條件的異常處理器。

          如果在子類中覆蓋了超類的一個(gè)方法,那么子類方法聲明的已檢查異常不能超過(guò)超類方法中聲明的異常圍。(也就是說(shuō)子類中拋出的異常范圍更小或者根本不拋出異常)。需要說(shuō)明的是,如果超類方法沒(méi)有拋出任何異常,子類也不能拋出任何已檢查異常。例如,如果覆蓋JComponent.paintComponent()方法,那么    由于超類中沒(méi)有拋出任何異常,所以自定義的paintComponent()方法也不能拋出任何異常。

          如何拋出異常:
          譬如在讀一個(gè)輸入流時(shí),如果期待的字節(jié)數(shù)為1024,而當(dāng)讀到700字節(jié)的時(shí)候遇到一個(gè)EOF信號(hào),這是我們未預(yù)期的,正是我們要拋出的異常,下面就是拋出改異常的語(yǔ)句

          1String readData() throws EOFException {
          2   while ({
          3      if(!in.hasNext()) {
          4          if(n<len)
          5            throw new EOFException();
          6     }
            
          7  }

          8}

          這是拋出已存在標(biāo)準(zhǔn)的異常,步驟為:
          1.找到一個(gè)合適的異常類
          2.創(chuàng)建該類的對(duì)象
          3.將異常拋出
          一旦拋出異常,該方法就不可能返回到調(diào)用者,這就意味著不必為返回的默認(rèn)值或錯(cuò)誤代碼擔(dān)憂了。

          在程序中可能會(huì)遇到任何標(biāo)準(zhǔn)異常都無(wú)法正確描述清楚的問(wèn)題,這時(shí)候就需要定義自己的異常類,定義自己的異常類需要繼承自Exception 或者其子類,如繼承自IOException  一般要為自定義的Exception定義兩個(gè)構(gòu)造函數(shù),一個(gè)是默認(rèn)的無(wú)參的構(gòu)造函數(shù),另一個(gè)是帶一個(gè)描述詳細(xì)錯(cuò)誤信息String的構(gòu)造函數(shù)(超類的toString()方法會(huì)打印出這些詳細(xì)信息。

          1public class MyException extends IOException {
          2
          3    MyException () {}
          4    
          5    MyException (String info) {
          6       super(info);
          7   }

          8}

          現(xiàn)在就可以像使用標(biāo)準(zhǔn)Exception類一樣使用自定義的Exception類了

          1String readData() throws MyException {
          2   while () {
          3      if(!in.hasNext()) {
          4          if(n<len)
          5            throw new MyException();
          6    }
            
          7 }

          8}

          可以用超類Throwable類的getMessage方法得到詳細(xì)的錯(cuò)誤描述信息。或者toString()方法打印該信息。

          捕獲異常:
          如果語(yǔ)句exp1有可能拋出一個(gè)異常,或者說(shuō)是調(diào)用了能夠拋出一個(gè)異常的方法,那么我們可以在程序中捕獲該異常

          1try {
          2 exp1;
          3 exp2;
          4 .
          5
          6}
           catch(Exception e) {
          7   e.
          8}

          9

          或者是并不捕獲,再次拋出該異常

          再次拋出異常,異常鏈:
          可以在catch塊中再次拋出新的異常,這樣可以隱藏原始的錯(cuò)誤細(xì)節(jié)

          1catch(SQLException sqle) {
          2    throw new ServletException("caused by SQLException "+e.getMessage());
          3}

          另一種更好的方法
          既拋出高級(jí)的異常,又不會(huì)丟失原始的異常信息。

          1}catch(SQLException sqle) 
          2    Throwable ta=new ServletException("caused by SQLException");
          3    ta.setCause(e);
          4    throw ta;
          5}

          6當(dāng)捕獲拋出的異常ta時(shí),可以用ta.getCause(),得到原始的異常


          finally子句,發(fā)生三種情況時(shí),會(huì)執(zhí)行finally子句
          1.try代碼正常執(zhí)行
          2.try代碼拋出一個(gè)在catch子句中捕獲的異常
          3.try代碼拋出一個(gè)未在catch子句中捕獲的異常
          就是說(shuō)無(wú)論異常如何,finally子句中的代碼都會(huì)執(zhí)行
          一般把一些資源回收的工作交給finally子句

          最好把try-catch塊和try-finally塊分開(kāi),這樣可以提高代碼的清晰度

           1try {
           2   try {
           3      //可能拋出IOException的語(yǔ)句
           4    }
           finally {
           5    is.close();
           6 }

           7}
           catch(IOExceotion e) {
           8   
           9}

          10

          這樣的另外一個(gè)好處是,可以catch到finally子句中拋出的異常。這也就引發(fā)了另外一個(gè)問(wèn)題,如果在try和finally中都拋出了異常,而且是不同類型的,那么最后返回的是那一個(gè)呢?答案是finally中拋出的異常會(huì)覆蓋try中拋出的異常。從而丟失了try當(dāng)中拋出的異常信息,讓拋出該方法的使用者不能跟蹤異常信息。所以,在finally中執(zhí)行的語(yǔ)句最好是不要拋出異常,但是不幸的是我們有時(shí)候不得不在finally中執(zhí)行一些清楚操作如:關(guān)閉輸入流InputStream,但是InputStream類的設(shè)計(jì)者并沒(méi)有這么設(shè)計(jì)(將會(huì)拋出異常)。

          由于finally子句總是會(huì)執(zhí)行,所以在finally中包含return值時(shí),是很危險(xiǎn)的。假設(shè)我們利用return語(yǔ)句從try中返回,在方法返回之前finally子句的內(nèi)容將會(huì)被執(zhí)行。如果finally子句當(dāng)中也包含一個(gè)return 語(yǔ)句,那么這個(gè)return語(yǔ)句所返回的值,將會(huì)覆蓋原先return的值。

          1public int f(int n) {
          2  try {
          3      return n*n;
          4    }
           finally {
          5     if(n==2)
          6       return 2;
          7  }

          8}

          在這里如果調(diào)用i=f(2);那么i的值將會(huì)是2而不是期望的2*2=4


          最后最重要的一點(diǎn),關(guān)于一個(gè)方法是捕獲一個(gè)異常還是拋出給調(diào)用他的方法
          有一點(diǎn)規(guī)則   
                                          早拋出,晚捕獲,盡量把異常拋出給調(diào)用它的函數(shù)

          posted @ 2008-02-26 14:05 曉宇 閱讀(535) | 評(píng)論 (0)編輯 收藏

          JAVA 的字符編碼的問(wèn)題

          首先講一講字符集
           JDK1.4版本引入了java.nio包加入了Charset類來(lái)統(tǒng)一字符集的轉(zhuǎn)換,字符集給出了雙字節(jié)Unicode碼序列與本地字符編碼中采用的字節(jié)序列之間的映射
          字符集的名稱不區(qū)分大小寫,可以用官方名稱或者任何一個(gè)別名調(diào)用靜態(tài)方法forName來(lái)獲得Charset

          1Charset charset=Charset.forName("GBK");
          Charset的aliases()方法返回一個(gè)Set<String>集合,表示該字符集所具有的所有別名
          Set<String> aliases=charset.aliases();
          查看虛擬機(jī)所支持的字符集以及名字可用Charset的靜態(tài)方法availableCharsets()返回一個(gè)SortedMap
          1 Map<String,Charset> map=Charset.availableCharsets();
          2            for(String setname:map.keySet()) {
          3                System.out.println(setname);
          4            }
          一旦有了字符集,就可以用他在本地字符串和Unicode字節(jié)序列之間轉(zhuǎn)換
          如下將一個(gè)字符串編碼為gbk    charset.encode(str)函數(shù)返回一個(gè)ByteBuffer對(duì)象
          1String str=new String("曉宇");
          2            ByteBuffer  buff = charset.encode(str);
          3            byte[] bytes=buff.array();
          同樣,可以將剛才按照GBK方式編碼的字節(jié)流解碼為正確的字符流
          1ByteBuffer by=ByteBuffer.wrap(bytes, 0, bytes.length);
          2      CharBuffer cb=charset.decode(by);//返回一個(gè)CharBuffer對(duì)象,已經(jīng)將字節(jié)數(shù)組轉(zhuǎn)化為字符數(shù)組
          3      System.out.println("  "+cb.toString());


          實(shí)際上String類中集成了Charset對(duì)象的使用,String類有兩個(gè)用于編碼和解碼的函數(shù)

          1byte[] bytes = str.getBytes("CharsetName");  //將字符串str按照指定名稱的Charset進(jìn)行編碼成字節(jié)數(shù)組
          2            String str2=new String(bytes,"CharsetName"); //將字節(jié)數(shù)組按照指定名稱的Charset解碼為字符串


          在輸入輸出流中有兩個(gè)用于將字節(jié)流轉(zhuǎn)化為指定編碼格式的字符流的類  InputStreamReader/OutputStreamReader
          這兩個(gè)類是讀寫流和讀寫器的橋梁 用法如下

          1InputStreamReader isr = new InputStreamReader(in, "charsetname");
          2            BufferedReader br = new BufferedReader(isr);//加入一個(gè)BufferedReader,可以用到該類的readLine()

          該用法在我的另外一篇socket備忘的里面體現(xiàn)了,可將網(wǎng)絡(luò)傳過(guò)來(lái)的utf-8格式編碼的字節(jié)流正確的解碼,以至于顯示的時(shí)候不會(huì)出現(xiàn)亂碼





          posted @ 2008-02-24 16:44 曉宇 閱讀(525) | 評(píng)論 (0)編輯 收藏

          SOCKET基礎(chǔ) 學(xué)習(xí)筆記

               摘要:     1package com;   2   3import java.io.BufferedReader;   4import java.io.ByteArrayOutputStream;   5import java.io.Filte...  閱讀全文

          posted @ 2008-02-22 16:26 曉宇 閱讀(245) | 評(píng)論 (0)編輯 收藏

          字節(jié)數(shù)組和其他類型的轉(zhuǎn)換

           

          //整數(shù)到字節(jié)數(shù)組的轉(zhuǎn)換 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng) h$_g8Lbx g s
             public byte[] intToByte(int intValue) {
          O R-v0OS&{;u0    byte[] result = new byte[4];
          e!sm#DN0    result[0] = (byte) ( (intValue & 0xFF000000) >> 24);軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)3e Ou-l*l
              result[1] = (byte) ( (intValue & 0x00FF0000) >> 16);軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)%F3hN!XoC
              result[2] = (byte) ( (intValue & 0x0000FF00) >> 8);
          d"TS)ro;L`;A:eI0    result[3] = (byte) ( (intValue & 0x000000FF));軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)t1^O{;_,S"e `
              return result;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)q*~[? n M"i
            }

            //字節(jié)數(shù)組到整數(shù)的轉(zhuǎn)換 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)i f9``3@0LZK&R
            public static int byteToInt(byte[] b) { 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)Rb~,Ws"u1m
          public static int byteToInt(byte[] byteVal) {
          2X/cH bIM0      int result = 0;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)7e5~3p"J r\ _
                for (int i = 0; i < byteVal.length; i++) {
          1i {T q a2eT V_.^!Q0        int tmpVal = (byteVal[i] << (8 * (3 - i)));
          &?x%pQ4_9T7k0        switch (i) {軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)A P/u[ C,J&FA#f
                    case 0:軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)B,}\z`]8UU
                      tmpVal = tmpVal & 0xFF000000;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)*yS6X$y9n*md~
                      break;
          piL/jY)lkZ?0          case 1:軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)5D#YS%w3f X|g
                      tmpVal = tmpVal & 0x00FF0000;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)c?Iu I w
                      break;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)~&E3Vmp0_;}@
                    case 2:
          6j3t1F;iX+K4{0            tmpVal = tmpVal & 0x0000FF00;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)5fD7H.i y R a/q
                      break;
          ]5b:h MMa!K0          case 3:
          )^~_.\A0            tmpVal = tmpVal & 0x000000FF;
          t2}8J f7A E~eH2[0            break;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)\? d:MN#D#iN
                  }
          MJ:c.rxWE0X"e"^*@0        result = result | tmpVal;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)9R lE\Q(g&SAJ
                }軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)1ixe#~9]lyF},T
                return result;軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)d,d"L^/fC?*upX
              }

            //字符到字節(jié)轉(zhuǎn)換
          Q N"P6tq.b@~0  public static byte[] charToByte(char ch){ 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)%]|X,~-vb'?$SU
              int temp=(int)ch; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)'L9cx"B:` Ak
              byte[] b=new byte[2]; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)2C8j1U/i1[ ls
              for (int i=b.length-1;i>-1;i--){
          'C3^]_V:qz0      b = new Integer(temp&0xff).byteValue();      //將最高位保存在最低位 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng) |S`"I h%YQU\(g
                temp = temp >> 8;       //向右移8位 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)!s/jv'Z2R
              } 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)R+C:w4LY4Xu!M
              return b; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)%n+x/Y ZV`6T\
            }

            //字節(jié)到字符轉(zhuǎn)換 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)n:gg'^!_@NF p*@B
            public static char byteToChar(byte[] b){ 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)(}xOQ:b
              int s=0;
          ZuYw~ac0    if(b[0]>0) 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)'Tsc(rq
                s+=b[0]; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)5G]%j*fg)wk$Z
              else 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)q#i2kb@
                s+=256+b[0];
          #iCo0kd+|i0    s*=256; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)X%Zn?-k9h5q
              if(b[1]>0) 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)(E0v"C(Bv4Q
                s+=b[1];
          +{`z$m a R0    else 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)D^j aODKA3T
                s+=256+b[1]; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)\ hv8We}U)b
              char ch=(char)s; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)#JLO"h;NH*AHb0LLt!m
              return ch; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)$g,Mu0?JT#Ef&xi
            }

            //浮點(diǎn)到字節(jié)轉(zhuǎn)換
          de4w8L-MpD8{\0  public static byte[] doubleToByte(double d){ 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng),~9g3FuQ9q;sMCa
              byte[] b=new byte[8]; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng) UY:}1oV:\ {-uZ7Ed
              long l=Double.doubleToLongBits(d);
          ar8f3|"@b(g'L0    for(int i=0;i<b.length;i++){
          %t4roUTU;zgxI0      b=new Long(l).byteValue(); 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)*I%@7R#} bb0P
                l=l>>8;
          E$^+\"u!h!Y3^0    } 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)%])x)S)u)i,ul
              return b;
          n`(]3K k`0  }

            //字節(jié)到浮點(diǎn)轉(zhuǎn)換
          KwV!^Kt2q#p j0  public static double byteToDouble(byte[] b){
          :C.}9o GI9r0    long l;

              l=b[0]; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)^4_/j4oL\*l b
              l&=0xff; 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)8x-fA;H.\
              l|=((long)b[1]<<8); 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)P\Z9tk
              l&=0xffff;
          u;A&Vs3n.p]*K/B0    l|=((long)b[2]<<16);
          )_ ^,F\ n3o0    l&=0xffffff;
          ` z3~*PIe aMK0    l|=((long)b[3]<<24);
          DM!ldb&|U(A*J0    l&=0xffffffffl;
          'i)k yh\0    l|=((long)b[4]<<32); 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng) T$D_Wr:M!_,E^a
              l&=0xffffffffffl;

              l|=((long)b[5]<<40); 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)g3m+GN$_)J1h,F.^(u.H d
              l&=0xffffffffffffl;
          ,gJ&o'u N7\Sp0    l|=((long)b[6]<<48);
          :m@s7\WCt+B0    l&=0xffffffffffffffl;
          ,x)T:eO e2d![0    l|=((long)b[7]<<56);
          }^MS.x%_7P0    return Double.longBitsToDouble(l); 軟件測(cè)試專業(yè)網(wǎng)站:51Testing軟件測(cè)試網(wǎng)Q)at;{k9Tq
            }

          posted @ 2008-02-22 15:06 曉宇 閱讀(760) | 評(píng)論 (0)編輯 收藏

          TREEMAP的排序機(jī)制

               摘要: 1package com.sf;  2  3import java.text.CollationKey;  4import java.text.Collator;  5import java.util.Comparator;  6import java.util.Map;  7...  閱讀全文

          posted @ 2008-02-19 15:16 曉宇 閱讀(2106) | 評(píng)論 (1)編輯 收藏

          HASHTABLE的內(nèi)部實(shí)現(xiàn)

           

          public class TestHashtable {
              
          public static void main(String[] args){
                  Hashtable ht 
          = new Hashtable();
                  ht.put(
          "sichuan","chengdu"); //改變以下四行代碼的順序,可能會(huì)改變輸出內(nèi)容的順序    
                  ht.put("hunan","changsha");     
                  ht.put(
          "beijing","beijing");    
                  ht.put(
          "anhui","hefei");    
                  
              Enumeration e 
          = ht.keys();
              
          while(e.hasMoreElements()) {
                  Object key 
          = e.nextElement();
                  Object value 
          = ht.get(key);            
                  System.out.println(key 
          + " " + value + " " + key.hashCode() + " " + value.hashCode());
              }

                  
              }

          }

           為了講述Hashtable鍵排序的問(wèn)題,我們先來(lái)看Hashtable的結(jié)構(gòu)圖:

          Hashtable.GIF

                  從上面的結(jié)構(gòu)圖可以看出,Hashtable的實(shí)質(zhì)就是一個(gè)數(shù)組+鏈表。圖中的Entry就是鏈表的實(shí)現(xiàn),Entry的結(jié)構(gòu)中包含了對(duì)自己的另一個(gè)實(shí)例的引用next,用以指向另外一個(gè)Entry。而圖中標(biāo)有數(shù)字的部分是一個(gè)Entry數(shù)組,數(shù)字就是這個(gè)Entry數(shù)組的index。那么往Hashtable增加鍵值對(duì)的時(shí)候,index會(huì)根據(jù)鍵的hashcode、Entry數(shù)組的長(zhǎng)度共同決定,從而決定鍵值對(duì)存放在Entry數(shù)組的哪個(gè)位置。從這種意義來(lái)說(shuō),當(dāng)鍵一定,Entry數(shù)組的長(zhǎng)度一定的情況下,所得到的index肯定是相同的,也就是說(shuō)插入順序應(yīng)該不會(huì)影響輸出的順序才對(duì)。然而,還有一個(gè)重要的因素沒(méi)有考慮,就是計(jì)算index出現(xiàn)相同值的情況。譬如代碼中 "sichuan" 和 "anhui",所得到的index是相同的,在這個(gè)時(shí)候,Entry的鏈表功能就發(fā)揮作用了:put方法通過(guò)Entry的next屬性獲得對(duì)另外一個(gè)Entry的引用,然后將后來(lái)者放入其中。根據(jù)debug得出的結(jié)果,"sichuan", "anhui"的index同為2,"hunan"的index為6,"beijing"的index為1,在輸出的時(shí)候,會(huì)以index遞減的方式獲得鍵值對(duì)。很明顯,會(huì)改變的輸出順序只有"sichuan"和"anhui"了,也就是說(shuō)輸出只有兩種可能:"hunan" - "sichuan" - "anhui" - "beijing"和"hunan" - "anhui" - "sichuan" - "beijing"。以下是運(yùn)行了示例代碼之后,Hashtable的結(jié)果:

          Hashtable1.GIF

              
                  以上的討論基于Java展開(kāi)的,在C#中的Hashtable實(shí)現(xiàn)會(huì)有所不同,但是我相信兩者的設(shè)計(jì)應(yīng)該是差不多的。感謝葉漂
          和quitgame,給了我思考的機(jī)會(huì),也讓我感到了基礎(chǔ)知識(shí)的匱乏,看來(lái)是要補(bǔ)補(bǔ)基礎(chǔ)知識(shí)了。   

                  [補(bǔ)充]:在Hashtable的實(shí)現(xiàn)代碼中,有一個(gè)名為rehash的方法用于擴(kuò)充Hashtable的容量。很明顯,當(dāng)rehash方法被調(diào)用
          以后,每一個(gè)鍵值對(duì)相應(yīng)的index也會(huì)改變,也就等于將鍵值對(duì)重新排序了。這也是往不同容量的Hashtable放入相同的鍵值對(duì)會(huì)輸出不同的鍵值對(duì)序列的原因。在Java中,觸發(fā)rehash方法的條件很簡(jiǎn)單:hahtable中的鍵值對(duì)超過(guò)某一閥值。默認(rèn)情況下,該閥值等于hashtable中Entry數(shù)組的長(zhǎng)度×0.75

          posted @ 2008-02-19 11:07 曉宇 閱讀(1664) | 評(píng)論 (0)編輯 收藏

          JDBC中的連接方式 thin模式 和 DataSource方式

          一、最常用的是thin模式   利用DriverManager得到Connection
          Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 
          String url
          ="jdbc:oracle:thin:@localhost:1521:orcl"//orcl為數(shù)據(jù)庫(kù)的SID 
          String user="test"
          String password
          ="test"
          Connection conn
          = DriverManager.getConnection(url,user,password);

          二、JDBC的另外一種方式是三層結(jié)構(gòu),就是在應(yīng)用服務(wù)器(tomcat/weblogic)上面建立DataSource
          1Context ctx=new InitiaContext(Hashtable env);
          2DataSource ds=(DataSource)ctx.lookUp("jdbc/OraDB");
          3Connection con=ds.getConnection();

          應(yīng)用中配置如下:未測(cè)試,僅轉(zhuǎn)載。
             
          一、配置server.xml
          找到配置發(fā)布應(yīng)用程序的地方:<Context path=”” docBase=”d:\_webs”/>
          將這個(gè)改為:
          <Context path="" docBase="D:\ _web" debug="0">
           
          <!—聲明一個(gè)數(shù)據(jù)源,程序通過(guò)JNDI找到該數(shù)據(jù)源。
          name指出數(shù)據(jù)源的名稱為jdbc/OraDB,
          auth表明連接池管理的權(quán)限,
          type指出該數(shù)據(jù)源的類型-->
          <Resource name="jdbc/OraDB" auth="SERVLET" type="javax.sql.DataSource"/>
           
          <!—配置該數(shù)據(jù)源的屬性
          name指出數(shù)據(jù)源的名稱
          -->
          <ResourceParams name="jdbc/OraDB">
           
          <!—連接數(shù)據(jù)庫(kù)的用戶名-->
          <parameter>
          <name>username</name>
                     <value>chenws</value>
          </parameter>
              
           <!—連接數(shù)據(jù)庫(kù)的密碼-->
           <parameter>
                     <name>password</name>
                  <value>admin</value>
           </parameter>
                     
           <!—連接數(shù)據(jù)庫(kù)的jdbc驅(qū)動(dòng)程序-->
           <parameter>
                     <name>driverClassName</name>
                     <value>oracle.jdbc.driver.OracleDriver</value>
           </parameter>
           
            <!—連接數(shù)據(jù)庫(kù)的url-->
           <parameter>
                     <name>url</name>
                     <value>jdbc:oracle:thin:@192.168.39.215:1521:jetchin</value>
           </parameter>
          </ResourceParams>
                  
          </Context>
           
          實(shí)際上,配置數(shù)據(jù)源的屬性不止以上那些,還有其他的比如連接時(shí)間的限制,連接數(shù)量的限制等等。這里我們并沒(méi)有給出,只是使用了tomcat提供的默認(rèn)屬性罷了。
          注意:要讓該數(shù)據(jù)源有效,必須將oracleclasses12.zip改名為classes12.jar,然后拷貝到
          tomcat安裝目錄下的/common/lib中。
           
          二、配置web.xml
          web應(yīng)用程序目錄下的web-inf中,打開(kāi)web.xml,加入如下的配置:
          定義數(shù)據(jù)源參照:
          <resource-ref>
           <!—數(shù)據(jù)源描述,可有可無(wú)-->
           <description>Oracle Datasource example</description>
           
            <!--數(shù)據(jù)源名稱-->
           <res-ref-name>jdbc/OraDB</res-ref-name>
           
            <!—數(shù)據(jù)源類型-->
          <res-type>javax.sql.DataSource</res-type>
           
           <!—連接池管理權(quán)限-->
           <res-auth>SERVLET</res-auth>
          </resource-ref>


          另外在weblogic中進(jìn)行配置可參考如下文章:


          WebLogic Server7.0中Oracle的JDBC Pool/DataSource配置指南
           
           

          第一步,去oracle下載最新的 oracle JDBC driver。

          一共2個(gè)文件,ojdbc14.jar和nls_charset12.zip。
          第一個(gè)文件是驅(qū)動(dòng)程序所在,第二個(gè)是支持國(guó)際化的包。

          接下來(lái),把這兩個(gè)文件加入 WLS 的 classpath。
          修改 Bea\Weblogic\server\bin\startWLS.cmd(或者相應(yīng)的Unix啟動(dòng)文件,.sh結(jié)尾的),

          在文件開(kāi)頭加入 PRE_CLASSPATH=C:\ojdbc14.jar;C:\nls_charset12.zip。注意文件的路徑。

          最后可以考慮把Bea\Weblogic\server\lib\classes12.zip刪除,我不保證正確性,只是怕有兼容性問(wèn)題。

          最后,啟動(dòng)weblogic server,進(jìn)入console,在Connection Pool里邊,填入一下資料。

          General欄目:

          Name:MyOracle_CP

          URL:jdbc:oracle:thin:@server:port:sid (自己按照情況修改!)
          比如:jdbc:oracle:thin:@192.168.0.2:1521:Crystal

          DriverName:oracle.jdbc.driver.OracleDriver

          Properties
          user=SYS (這里是用戶,最好不要用SYS,SYSTEM等系統(tǒng)用戶)

          ACL Name: (空)

          password: 用戶密碼

           


          如圖:



          Connection欄目:


          CapacityIncrement = 50
          MaxCapacity = 100
          Capacity Increment: 5
          Login Delay Seconds: 0 seconds
          Refresh Period: 10 minutes
          Supports Local Transaction 不要打勾
          Allow Shrinking 打勾
          Shrink Period: 15 minutes
          Prepared Statement Cache Size: 5

          如圖:



          Test欄目:

          TestTableName:SCOTT.EMP (這里需要改動(dòng),適應(yīng)你自己的表,wls用來(lái)做連接測(cè)試用的)
          TestConnectionsOnReleasetrue 打勾
          TestConnectionsOnReservetrue 打勾

          最后,點(diǎn)擊Apply,然后去Targets,選中你的server,點(diǎn)右箭頭,使你的server進(jìn)入Chosen欄目,最后Apply。(如圖)




          查看dos窗口,是否有錯(cuò)誤,如果沒(méi)有則繼續(xù),如果有的話,自己查看填寫的內(nèi)容。

          至此,Connection Pool已經(jīng)配置完畢。


          接下來(lái),該配置(TX)DataSource了。

          從昨天的panel里邊,單擊DataSources/TX DataSources,進(jìn)入配置界面。

          1。單擊Configure a new JDBC Tx Data Source..配置新的datasource

          2。填入以下數(shù)據(jù):
          Name: MyDataSource (自己隨便起的)
          JNDI: jdbc/OracleDS (這里就是你lookup的時(shí)候填入的名字,自己想吧。
          Pool Name: MyOracle_CP (一定要對(duì)應(yīng)你的Connection Pool的 Name)

          把后邊兩項(xiàng)打上勾。

          第一個(gè)是模擬2階提交模式,如果數(shù)據(jù)庫(kù)driver本身不支持的話。(就是XA標(biāo)準(zhǔn),分布式提交)

          第二個(gè)是 行預(yù)讀。如圖:

           

           

           

           

           

           

           

           

           

           

           

           

          點(diǎn)擊Create,然后去Targets里邊,把你的 server放入chosen,點(diǎn)擊apply。。

          配置完成。。。

          最后檢查你的DataSource是否已經(jīng)成功部屬:

          進(jìn)入你的server的JNDI Tree,很容易就可以看到的。:)。如圖:





          posted @ 2008-02-19 10:22 曉宇 閱讀(3733) | 評(píng)論 (0)編輯 收藏

          JDBC中的批處理

          JDBC中 有兩個(gè)批處理函數(shù)  addBatch(String)  和 executeBatch();

          有兩種方法可以進(jìn)行批處理 第一種是用Statement  另外一種是PreparedStatement

          一、使用Statement 

           

          1Statement sm=con.createStatement();
          2String sql="insert into errbills values()";
          3sm.addBatch(sql);
          4sql="delete from errbills where bno='124'";
          5sm.addBatch(sql);
          6sm.executeBatch();


          二、使用PreparedStatement

          1String sql="delete from errblls where bno=?";
          2PreparedStatement ps=con.prepareStatement(sql);
          3for(int i=0;i<10;i++{
          4   ps.setString(i);
          5   ps.addBatch();
          6}

          7ps.executeBatch();
          8

          注意使用Statement和PreparedStatement的區(qū)別  Statement的addBatch(String s)是帶參數(shù)的(所要執(zhí)行的SQL語(yǔ)句) 而PreparedStatement是不帶參數(shù)的

          在JDBC中使用批處理可以提高執(zhí)行速度,因?yàn)槲覀儾恍枰S護(hù)多條語(yǔ)句,所有的操作都是在一條語(yǔ)句里面完成,這樣數(shù)據(jù)庫(kù)服務(wù)器不必要為每條語(yǔ)句都分配和維護(hù)資源(指針等),可以減輕數(shù)據(jù)庫(kù)服務(wù)器的壓力

          posted @ 2008-02-19 09:50 曉宇 閱讀(539) | 評(píng)論 (1)編輯 收藏

          僅列出標(biāo)題
          共4頁(yè): 上一頁(yè) 1 2 3 4 下一頁(yè) 
          主站蜘蛛池模板: 特克斯县| 屏东市| 罗山县| 海晏县| 汉沽区| 南漳县| 资中县| 论坛| 逊克县| 荆门市| 阳山县| 巴南区| 通海县| 田东县| 黄龙县| 海晏县| 依安县| 高雄市| 台江县| 惠东县| 南陵县| 虎林市| 彩票| 揭西县| 安徽省| 黄大仙区| 深圳市| 兰溪市| 错那县| 怀来县| 株洲县| 沧源| 呼玛县| 庄浪县| 三穗县| 彩票| 饶阳县| 牙克石市| 安化县| 大新县| 桑植县|