自年夜在数据库中可以运行Java后,Oracle最令人感动的新特征被Java阐扬到了最年夜化,但与之呈现的问题也常困扰着开发人员,本文例出三个最常见的问题,但愿对有此困扰的伴侣有所辅佐。, t) M& P' ?- T5 C
问题一:如保加载JDBC驱动轨范:1 }$ |% ]' m4 \
正常我们加载驱动轨范有三个路子:5 |- a, e! z9 M! [& {2 a
1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动轨范的静态内容都初始化,其拭魅这时驱动轨范类挪用了DriverManager.registerDriver(driver)体例。( x4 U9 A" n; u- d
2)使用系统属性:System.getProperty().load(new FileInputStream("属性文件")); 在属性文件中指定jdbc.driver=drivername 这样的益处是可以同时加载多个JDBC,换数据库时不用访谒JAVA源代码,只是改削属性文件。
4 X# \0 y' B. V 3)直接registerDriver(driver)这种体例最靠得住,可以在任何情形下使用。 1)体例简单,但MS的JVM不能正确初始化。好比使用IE时在APPLET中就不能使用,应该用3)的体例。但3)体例在矫捷性方面不如2),可以按照情形综合考虑。
: S( q) P0 E1 ^, J( j5 l% O/ [ 问题二:年夜对象存储
& c6 A$ O8 B# a Q$ c) J 一般来说,年夜对象存储是把文件存到数据库中,当然也可以内存中的超年夜字符串。对于象图片这样的文件当然是用二进制存储,这里有良多误区,收集上的教程99%都是行欠亨的,连 SUN自己的文档都一向错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如不美观你这样做,会获得一个IO而不是SQL异常,为此花了我近两个小时才弄清嚣张。
+ Q: J# S! E9 V6 p; x, t 如不美观要把一个二制文件存入ORACLE,用尺度的JDBC你就要用LONG ROW类型:# l- E8 \; z ^* g' \3 f
create table tb_file(name varchar(20),detail long row);5 ]% X: H0 u G. V0 t2 ?, F }; \
然后$ @ u( g- l# b2 M7 D$ M- E1 s
File file = new File("aaa.gif"); ! H N# z2 [9 V; m2 y' S
int fileLength =(int) file.length();
) [0 _" O. h7 S" D InputStream fin = new FileInputStream(file);! r# ?9 o$ G6 j" x# G( R4 C
PreparedStatement pstmt =% h. V3 _: @5 D ~. p7 L: T
con.prepareStatement("insert into tb_file values('aaa.gif',?)");
) ]' V7 o1 Q1 Y# }: ~/ ? pstmt.setBinaryStream (1, fin, fileLength); pstmt.executeUpdate();1 G5 J8 K2 t) `- a: d1 ]3 I' u8 Z
如不美观你必然要用BLOB存储,你就必需用ORACLE自己的体例:8 U4 o3 w3 O' {0 K! C9 |
create table tb_file(name varchar(20),detail BLOB);, p1 [4 l# E( r
con.setAutoCommit(false);' a. y+ U6 x7 m! P5 H
stmt.executeUpdate
4 \$ v' v# C9 m, z8 J8 {7 }$ i3 t ("insert into tb_file values('aaa.gif',empty_blob())");
% k) P3 W1 X6 T# { 下面必需SELECT获得BLOB的对象再向里写:
$ w! O& g7 E) y8 T- z rs = stmt.executeQuery
+ V+ v) O# `( V/ @ ("select detail from tb_file where name='aaa.gif' for upfdate" );" ]4 E0 |7 Z* b3 Y! G6 _
if(rs.next()) { Blob blob = rs.getBlob(1);
4 R$ O8 f4 s# {2 j9 y: E, G- t BinaryOutputStream out =+ t* R6 B4 j, C. X; x$ e
((oracle.sql.BLOB)blob).getBinaryOutputStream();
! q0 }7 y; Z9 T' A2 O+ y byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize];
$ s9 P# n4 F, e InputStream fin = new FileInputStream(file);( ~, D" j- _6 g; r
int len = 0; while( (len = fin.read(b)) != -1) out.write(b,0,len);( o* h+ n% D7 s( |& H1 I
fin.close(); out.close(); con.commit(); }; z6 T* x, e. u0 n6 R0 X: M
同样篡夺数据你并不能象LONG RO对data block物理结构的熟悉4 t/ u* \, ~( V5 p" Z: O( B
1.Data Block 物理结构图: |