#
TRANSACTION_NONE:
正式地講,TRANSACTION_NONE不是一個有效的事務級別。
根據java.sql Connection API文件,這個級別表示事務是
不被支持的,因此理論上說你不能使用TRANSACTION_NONE作
為一個自變量賦給Connection.setTransactionIsolation()
方法。事實上,雖然一些數據庫實施了這個事務級別,但是
Oracle9i卻沒有實施。
臟讀取(TRANSACTION_READ_UNCOMMITTE):
(允許的操作 讀-讀 讀-寫 寫-讀 (臟數據,不可重復讀,虛讀) )
表示,這個事務級別
允許讀取臟數據,什么是臟數據?就是指還沒有提交的數據.
因為這個級別,是允許一個事務(A)讀取另一個事務(B)
還沒有提交的數據.一旦事務B發生異常退出.而修改了的數據
卻還沒提交,或者新插入的數據和刪除了的數據都還沒有
提交,導致事務A拿到了一些臟數據,或者錯誤數據;
因此在這個事務級別里是會發生臟讀,重復讀,錯誤讀取;
禁止臟讀(TRANSACTION_READ_COMMITTED):
(允許的操作 讀-讀 讀-寫 (不可重復讀,虛讀))
在這個級別中,事務A
只能讀取一些提交的數據,如事務B添加了一條記錄,但是
如果事務B沒有提交,那么事務A是讀不到的,所以該事務級別,
把臟讀給屏蔽掉了.---卻允許重復讀取,和錯誤讀取.
什么是重復讀取呢?譬如,事務A讀取了一個數據,這個數據
的值為"helloworld",事務A準備利用這個數據來更新一下
其他數據,但這個時候事務B開始對這個數據進行修改,并且
提交---"hello 無名氏",由于是已經提交了,所以事務A是可以
看到這個數據的,當事務A在沒提交事務之前,它想看下數據
是否正確,這個時候它發現,新讀出的數據已經和原來的數據
不一樣了(這就是重復讀取);
允許重復讀取(TRANSACTION_REPEATABLE_READ):
(允許的操作 讀-讀 讀-寫(僅允許插入,不允許刪除和修改)(虛讀))
在這個級別中,
是禁止了臟讀,和取消了不可重復讀取,但是沒有禁止錯誤讀取;
這個級別的事務比較嚴格,當一個事務A在讀取一個值的時候
是不允許另一個事務對該值進行修改的;
為了允許重復讀取,可以選用該級別,因為TRANSACTION_READ_
COMMITED這個事務級別,是允許重復讀取提交的數據的,如果
事務A在讀取一個數值的時候,值為"Hello World!",但這個時
候事務B對"Hello World"值進行修改了,改為"Hello EveryOne"
然后提交,當事務A再次去讀取這個值的時候,去發現原來讀到
的值改變了,變成了"Hello EveryOne",為了防止出現這種情況
可以禁止重復提交,目的是為了重復讀取不會出錯!那么這個
時候就可以選擇
TRANSACTION_REPEATABLE_READ這個級別,
這個級別就是用來禁止重復提交的.
(實際上是加了行鎖,鎖定了選中的數據,不允許修改,但是允許插入新的數據)
雖然這個時候是禁止了重復提交,但卻可以添加刪除,
比如事務A,作了個查詢語句"select * from 無名氏 "; 這個時候是允許事務B做這樣的操作的:
"insert into 無名氏 values(2,'aaa')"; 這個時候,
事務A再次做讀取操作的時候,卻發現數據莫名其妙的
多了一條,這就是所謂的---幻影讀取;
禁止幻讀(TRANSACTION_SERIALIZABLE):
事務的最高級別(串行化 操作)事務級別最高,所耗費的性能也越多.
禁止幻讀禁止了臟讀,禁止了重復提交和幻讀.
也就是當事務A在按條件查詢的時候,事務A一旦沒有提
交,任何事務都不能對事務A的資源進行操作--- 保證
事務A的操作真正的原子性!
注意:在Oracle中只支持兩種級別:
TRANSACTION_READ_COMMITTED(默認的級別)(只有提交后
才可以讀取)而每一個終端進行自己的DML操作 都自動開啟了一個事務
TRANSACTION_SERIALIZABLE(竄行化操作)
Java運行環境有一個字符串池,由String類維護。執行語句String str="abc"時,首先查看字符串池中是否存在字符串"abc",如果存在則直接將"abc"賦給str,如果不存在則先在字符串池中新建一個字符串"abc",然后再將其賦給str。執行語句String str=new String("abc")時,不管字符串池中是否存在字符串"abc",直接新建一個字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后將其付給str。前一語句的效率高,后一語句的效率低,因為新建字符串占用內存空間。String str = new String()創建了一個空字符串,與String str=new String("")相同。
public String intern()
- 返回字符串對象的規范化表示形式。
一個初始為空的字符串池,它由類 String
私有地維護。
當調用 intern 方法時,如果池已經包含一個等于此 String
對象的字符串(用 equals(Object)
方法確定),則返回池中的字符串。否則,將此 String
對象添加到池中,并返回此 String
對象的引用。
它遵循以下規則:對于任意兩個字符串 s
和 t
,當且僅當 s.equals(t)
為 true
時,s.intern() == t.intern()
才為 true
。
String.intern();
再補充介紹一點:存在于.class文件中的常量池,在運行期間被jvm裝載,并且可以擴充。String的intern()方法就是擴充常量池的一個方法;當一個String實例str調用intern()方法時,java查找常量池中是否有相同unicode的字符串常量,如果有,則返回其引用,如果沒有,則在常量池中增加一個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);
結果為:
False
False //雖然執行了s1.intern(),但它的返回值沒有賦給s1
True
True
最后再破除一個錯誤的理解:
有人說,“使用String.intern()方法可以將一個String類保存到一個全局的String表中,如果具有相同值的unicode字符串已經在這個表中,那么該方法返回表中已有字符串的地址,如果在表中沒有相同值的字符串,則將自己的地址注冊到表中”如果把這個全局的String表理解為常量吃的話,最后一句話“如果在表中沒有相同值的字符串,則將自己的地址注冊到表中”是錯的。
例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());
結果是:
False
Kvill kvill
True
我們沒有聲明一個”kvill”常量,所以常量池中一開始沒有”kvill”的,當我們調用s1.intern()后就在常量池中新添加了一個”kvill”常量,原來的不在常量池中的”kvill”仍然存在,也就不是“把自己的地址注冊到常量池中”了。
例5:
String str1=”java”;
String str2=”blog”;
String s=str1+str2;
System.out.println(s==”javablog”);
結果是false。Jvm確實對型如String str1=”java”;的String對象放在常量池里,但是它是在編譯時那么做的,而String s=str1+str2;是在運行時刻才能知道,也就是說str1+str2是在堆里創建的,所以結果為false了。
比較兩個已經存在于字符串池中字符串對象可以用"=="進行,擁有比equals操作符更快的速度
摘要:
1package com;
2
3import java.io.BufferedReader;
4import java.io.ByteArrayOutputStream;
5import java.io.Filte...
閱讀全文
//整數到字節數組的轉換 軟件測試專業網站:51Testing軟件測試網 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);軟件測試專業網站:51Testing軟件測試網3e Ou-l*l
result[1] = (byte) ( (intValue & 0x00FF0000) >> 16);軟件測試專業網站:51Testing軟件測試網%F3hN!XoC
result[2] = (byte) ( (intValue & 0x0000FF00) >> 8);
d"TS)ro;L`;A:eI0 result[3] = (byte) ( (intValue & 0x000000FF));軟件測試專業網站:51Testing軟件測試網t1^O{;_,S"e `
return result;軟件測試專業網站:51Testing軟件測試網q*~[? n M"i
}
//字節數組到整數的轉換 軟件測試專業網站:51Testing軟件測試網i f9``3@0LZK&R
public static int byteToInt(byte[] b) { 軟件測試專業網站:51Testing軟件測試網Rb~,Ws"u1m
public static int byteToInt(byte[] byteVal) {
2X/cH bIM0 int result = 0;軟件測試專業網站:51Testing軟件測試網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) {軟件測試專業網站:51Testing軟件測試網A P/u[ C,J&FA#f
case 0:軟件測試專業網站:51Testing軟件測試網B,}\z`]8UU
tmpVal = tmpVal & 0xFF000000;軟件測試專業網站:51Testing軟件測試網*yS6X$y9n*md~
break;
piL/jY)lkZ?0 case 1:軟件測試專業網站:51Testing軟件測試網5D#YS%w3f X|g
tmpVal = tmpVal & 0x00FF0000;軟件測試專業網站:51Testing軟件測試網c?Iu I w
break;軟件測試專業網站:51Testing軟件測試網~&E3Vmp0_;}@
case 2:
6j3t1F;iX+K4{0 tmpVal = tmpVal & 0x0000FF00;軟件測試專業網站:51Testing軟件測試網5fD7H.i y R a/q
break;
]5b:h MMa!K0 case 3:
)^~_.\A0 tmpVal = tmpVal & 0x000000FF;
t2}8J f7A E~eH2[0 break;軟件測試專業網站:51Testing軟件測試網\? d:MN#D#iN
}
MJ:c.rxWE0X"e"^*@0 result = result | tmpVal;軟件測試專業網站:51Testing軟件測試網9R lE\Q(g&SAJ
}軟件測試專業網站:51Testing軟件測試網1ixe#~9]lyF},T
return result;軟件測試專業網站:51Testing軟件測試網d,d"L^/fC?*upX
}
//字符到字節轉換
Q N"P6tq.b@~0 public static byte[] charToByte(char ch){ 軟件測試專業網站:51Testing軟件測試網%]|X,~-vb'?$SU
int temp=(int)ch; 軟件測試專業網站:51Testing軟件測試網'L9cx"B:` Ak
byte[] b=new byte[2]; 軟件測試專業網站:51Testing軟件測試網2C8j1U/i1[ ls
for (int i=b.length-1;i>-1;i--){
'C3^]_V:qz0 b = new Integer(temp&0xff).byteValue(); //將最高位保存在最低位 軟件測試專業網站:51Testing軟件測試網 |S`"I h%YQU\(g
temp = temp >> 8; //向右移8位 軟件測試專業網站:51Testing軟件測試網!s/jv'Z2R
} 軟件測試專業網站:51Testing軟件測試網R+C:w4LY4Xu!M
return b; 軟件測試專業網站:51Testing軟件測試網%n+x/Y ZV`6T\
}
//字節到字符轉換 軟件測試專業網站:51Testing軟件測試網n:gg'^!_@NF p*@B
public static char byteToChar(byte[] b){ 軟件測試專業網站:51Testing軟件測試網(}xOQ:b
int s=0;
ZuYw~ac0 if(b[0]>0) 軟件測試專業網站:51Testing軟件測試網'Tsc(rq
s+=b[0]; 軟件測試專業網站:51Testing軟件測試網5G]%j*fg)wk$Z
else 軟件測試專業網站:51Testing軟件測試網q#i2kb@
s+=256+b[0];
#iCo0kd+|i0 s*=256; 軟件測試專業網站:51Testing軟件測試網X%Zn?-k9h5q
if(b[1]>0) 軟件測試專業網站:51Testing軟件測試網(E0v"C(Bv4Q
s+=b[1];
+{`z$m a R0 else 軟件測試專業網站:51Testing軟件測試網D^j aODKA3T
s+=256+b[1]; 軟件測試專業網站:51Testing軟件測試網\ hv8We}U)b
char ch=(char)s; 軟件測試專業網站:51Testing軟件測試網#JLO"h;NH*AHb0LLt!m
return ch; 軟件測試專業網站:51Testing軟件測試網$g,Mu0?JT#Ef&xi
}
//浮點到字節轉換
de4w8L-MpD8{\0 public static byte[] doubleToByte(double d){ 軟件測試專業網站:51Testing軟件測試網,~9g3FuQ9q;sMCa
byte[] b=new byte[8]; 軟件測試專業網站:51Testing軟件測試網 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(); 軟件測試專業網站:51Testing軟件測試網*I%@7R#} bb0P
l=l>>8;
E$^+\"u!h!Y3^0 } 軟件測試專業網站:51Testing軟件測試網%])x)S)u)i,ul
return b;
n`(]3K k`0 }
//字節到浮點轉換
KwV!^Kt2q#p j0 public static double byteToDouble(byte[] b){
:C.}9o GI9r0 long l;
l=b[0]; 軟件測試專業網站:51Testing軟件測試網^4_/j4oL\*l b
l&=0xff; 軟件測試專業網站:51Testing軟件測試網8x-fA;H.\
l|=((long)b[1]<<8); 軟件測試專業網站:51Testing軟件測試網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); 軟件測試專業網站:51Testing軟件測試網 T$D_Wr:M!_,E^a
l&=0xffffffffffl;
l|=((long)b[5]<<40); 軟件測試專業網站:51Testing軟件測試網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); 軟件測試專業網站:51Testing軟件測試網Q)at;{k9Tq
}
摘要: 1package com.sf;
2
3import java.text.CollationKey;
4import java.text.Collator;
5import java.util.Comparator;
6import java.util.Map;
7...
閱讀全文
一、最常用的是thin模式 利用DriverManager得到Connection
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
String url="jdbc:oracle:thin:@localhost:1521:orcl"; //orcl為數據庫的SID
String user="test";
String password="test";
Connection conn= DriverManager.getConnection(url,user,password);
二、JDBC的另外一種方式是三層結構,就是在應用服務器(tomcat/weblogic)上面建立DataSource
1
Context ctx=new InitiaContext(Hashtable env);
2
DataSource ds=(DataSource)ctx.lookUp("jdbc/OraDB");
3
Connection con=ds.getConnection();
應用中配置如下:未測試,僅轉載。
一、配置server.xml
找到配置發布應用程序的地方:<Context path=”” docBase=”d:\_webs”/>
將這個改為:
<Context path="" docBase="D:\ _web" debug="0">
<!—聲明一個數據源,程序通過JNDI找到該數據源。
name指出數據源的名稱為jdbc/OraDB,
auth表明連接池管理的權限,
type指出該數據源的類型-->
<Resource name="jdbc/OraDB" auth="SERVLET" type="javax.sql.DataSource"/>
<!—配置該數據源的屬性
name指出數據源的名稱
-->
<ResourceParams name="jdbc/OraDB">
<!—連接數據庫的用戶名-->
<parameter>
<name>username</name>
<value>chenws</value>
</parameter>
<!—連接數據庫的密碼-->
<parameter>
<name>password</name>
<value>admin</value>
</parameter>
<!—連接數據庫的jdbc驅動程序-->
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<!—連接數據庫的url-->
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@192.168.39.215:1521:jetchin</value>
</parameter>
</ResourceParams>
</Context>
實際上,配置數據源的屬性不止以上那些,還有其他的比如連接時間的限制,連接數量的限制等等。這里我們并沒有給出,只是使用了tomcat提供的默認屬性罷了。
注意:要讓該數據源有效,必須將oracle的classes12.zip改名為classes12.jar,然后拷貝到
tomcat安裝目錄下的/common/lib中。
二、配置web.xml
到web應用程序目錄下的web-inf中,打開web.xml,加入如下的配置:
定義數據源參照:
<resource-ref>
<!—數據源描述,可有可無-->
<description>Oracle Datasource example</description>
<!--數據源名稱-->
<res-ref-name>jdbc/OraDB</res-ref-name>
<!—數據源類型-->
<res-type>javax.sql.DataSource</res-type>
<!—連接池管理權限-->
<res-auth>SERVLET</res-auth>
</resource-ref>
另外在weblogic中進行配置可參考如下文章:
WebLogic Server7.0中Oracle的JDBC Pool/DataSource配置指南
|
|
第一步,去oracle下載最新的 oracle JDBC driver。
一共2個文件,ojdbc14.jar和nls_charset12.zip。
第一個文件是驅動程序所在,第二個是支持國際化的包。
接下來,把這兩個文件加入 WLS 的 classpath。
修改 Bea\Weblogic\server\bin\startWLS.cmd(或者相應的Unix啟動文件,.sh結尾的),
在文件開頭加入 PRE_CLASSPATH=C:\ojdbc14.jar;C:\nls_charset12.zip。注意文件的路徑。
最后可以考慮把Bea\Weblogic\server\lib\classes12.zip刪除,我不保證正確性,只是怕有兼容性問題。
最后,啟動weblogic server,進入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等系統用戶)
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 (這里需要改動,適應你自己的表,wls用來做連接測試用的)
TestConnectionsOnReleasetrue 打勾
TestConnectionsOnReservetrue 打勾
最后,點擊Apply,然后去Targets,選中你的server,點右箭頭,使你的server進入Chosen欄目,最后Apply。(如圖)

查看dos窗口,是否有錯誤,如果沒有則繼續,如果有的話,自己查看填寫的內容。
至此,Connection Pool已經配置完畢。
接下來,該配置(TX)DataSource了。
從昨天的panel里邊,單擊DataSources/TX DataSources,進入配置界面。
1。單擊Configure a new JDBC Tx Data Source..配置新的datasource
2。填入以下數據:
Name: MyDataSource (自己隨便起的)
JNDI: jdbc/OracleDS (這里就是你lookup的時候填入的名字,自己想吧。
Pool Name: MyOracle_CP (一定要對應你的Connection Pool的 Name)
把后邊兩項打上勾。
第一個是模擬2階提交模式,如果數據庫driver本身不支持的話。(就是XA標準,分布式提交)
第二個是 行預讀。如圖:

點擊Create,然后去Targets里邊,把你的 server放入chosen,點擊apply。。
配置完成。。。
最后檢查你的DataSource是否已經成功部屬:
進入你的server的JNDI Tree,很容易就可以看到的。:)。如圖:

|