关于在ORACLE下开发JAVA的几个问题

oracle|问题

我本来不再想写一些类似教程的文章,因为既然叫教程就要能历经历史的考验,而对于我这种菜鸟级的程序设计者来说仅喜欢随心所欲地交流一些自己的经验。可以不成方法,无关条理地想到哪说到哪。但是有些问题我又不能不出来说明白,因为目前网上的很多“教程”都在把初学者引向错误,有些是作者个人理解的错误,有些作者自己从来没有做过开发却能写出一篇软件开发的文章。他们只会做TRANSLATE,COPY,CUT这些操作,最简单的例子就是sun的JDK开发文档中到目前为止介绍大对象(文件)存储的方法都是错误的,可是说经过N(N >100)次的重写都没有人纠正,因为后来的人都只是COPY了一下,根本没有真的去做,只是把原作者换成自己的名字而已。
(尊重声明:凡以AXMAN,超级菜鸟,诗剑书生签名的文章除在CNJSP网站发布谢绝任何网站转贴)

问题一:如保加载JDBC驱动程序:
正常我们加载驱动程序有三个途径:
1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动程序的静态内容都初始化,其实这时驱动程序类调用了DriverManager.registerDriver(driver);方法
2)使用系统属性:System.getProperty().load(new FileInputStream("属性文件"));
在属性文件中指定jdbc.driver=drivername 这样的好处是可以同时加载多个JDBC,换数据库时不用访问JAVA源代码,只是修改属性文件
3)直接registerDriver(driver)这种方法最可靠,可以在任何环境下使用。

1)方法简单,但MS的JVM不能正确初始化。比如使用IE时在APPLET中就不能使用,应该用3)的方法。但3)方法在灵活性方面不如2),可以根据环境综合考虑。

问题二:大对象存储
一般来说,大对象存储是把文件存到数据库中,当然也可以内存中的超大字符串。对于象图片这样的文件当然是用二进制存储,这里有很多误区,网络上的教程99%都是行不通的,连SUN自己的文档都一直错误,虽然错误很小。按说二进制文件应该存为BLOB类型,但JBDC2并不能直接对BLOB存入二进制文件,如果你这样做,会得到一个IO而不是SQL异常,为此花了我近两个小时才弄清楚。
如果要把一个二制文件存入ORACLE,用标准的JDBC你就要用LONG ROW类型:
create table tb_file(name varchar(20),detail long row);
然后
File file = new File("aaa.gif");
int fileLength =(int) file.length();
InputStream fin = new FileInputStream(file);
PreparedStatement pstmt = con.prepareStatement("insert into tb_file values('aaa.gif',?)");
pstmt.setBinaryStream (1, fin, fileLength);
pstmt.executeUpdate();

如果你一定要用BLOB存储,你就必须用ORACLE自己的方法:
create table tb_file(name varchar(20),detail BLOB);
con.setAutoCommit(false);
stmt.executeUpdate("insert into tb_file values('aaa.gif',empty_blob())");
下面必须SELECT得到BLOB的对象再向里写:
rs = stmt.executeQuery("select detail from tb_file where name='aaa.gif' for upfdate" );
if(rs.next())
{
Blob blob = rs.getBlob(1);
BinaryOutputStream out = ((oracle.sql.BLOB)blob).getBinaryOutputStream();
byte[] b = new byte[((oracle.sql.BLOB)blob).getBufferSize];
InputStream fin = new FileInputStream(file);
int len = 0;
while( (len = fin.read(b)) != -1)
out.write(b,0,len);
fin.close();
out.close();
con.commit();
}

同样读取数据你并不能象LONG ROW那样
InputStream in = rs.getBinaryInputStream("detail");
而要
Blob blob = rs.getBlob("detail");
in = blob.getBinaryStream();

问题三:可滚动结果集
ORACLE 明确说明不支持结果集滚动,那么我们用JDBC2得到一个可滚动的结果集就是同JDBC自己支持的,就是说结果集要在内存中高度缓存,很多很多的开发者都错误地认为是数据库支持的。只是他们没有真正查询大量行,如果真的查询大量行的话肯定是死定了!!!!!!对于超大量行的数据,情愿返回到它的笨方法也不要使用可滚动结果集。

-------------------------------------
注:应作者要求,本文谢绝任何网站转贴!

时间: 2024-11-10 08:00:30

关于在ORACLE下开发JAVA的几个问题的相关文章

谈谈在ORACLE下开发JAVA程序的问题

问题一:如保加载JDBC驱动程序: 正常我们加载驱动程序有三个途径: 1)Class.forName(String)这想当于classLoader一个String指定的类,在装载时把该驱动程序的静态内容都初始化,其实这时驱动程序类调用了DriverManager.registerDriver(driver);方法 2)使用系统属性:System.getProperty().load(new FileInputStream("属性文件")); 在属性文件中指定jdbc.driver=dr

Mac OS X 下搭建 Java 开发环境图解

本篇博客介绍如何在Mac osx系统下搭建java开发环境,有了java的开发环境,我们就可以做Java相关的开发,Eclipse和Android Studio都是要有JVM环境才能运行的,所以本篇就稍微总结一下如何在Mac osx下配置java环境变量. 先来看看笔者的电脑配置: 打开终端,查看10.10版本的系统使用的是什么shell命令: 输出的是bash,说明是Bourne shell,是默认的Unix Shell命令. 下面通过命令行查看笔者的java版本: 如果你的系统已经安装成功J

在Centos6.5系统下安装java开发环境详细步骤

Centos6.5系统下安装java开发环境的步骤如下 一.安装jdk 1.查看Linux自带的JDK是否已安装 java ?version 如果出现openjdk,最好还是先卸载掉openjdk,在安装sun公司的jdk. 2.查看jdk信息 rpm -qa|grep java 3.卸载OpenJDK,执行以下操作: rpm -e --nodeps tzdata-java-2012c-1.el6.noarchrpm -e --nodeps java-1.7.0-openjdk-1.7.0.45

《精通Android 实例开发》——第1章,第1.1节Windows下安装Java环境JDK

第1章 正式开发前的准备精通Android 实例开发都说"工欲善其事,必先利其器",在进行Android开发之前,需要先搭建一个合适的开发环境.在本章的内容中,将以具体实例来详细介绍搭建Android开发环境中的知识,让读者从实例中体会搭建Android开发环境的方法和技巧,为步入本书后面知识的学习打下基础. 1.1 Windows下安装Java环境JDK 1.1.1 实例说明在搭建Android开发环境之前,一定先确定基于Android应用软件所需要开发环境的要求,具体要求如表1-1

在Ubuntu 11.04环境下开发SSH范例框架AppFuse 2.1 Java Web应用

问题描述 刚刚把原先在Windows7下开发AppFuse2.1的应用,成功迁移到Ubuntu11.04下,使得在Ubuntu环境下,能够用Maven3.0.3和EclipseGalileo开发源代码,并把WAR包部署到Tomcat6上.Ubuntu是目前市场占有率超过50%的Linux桌面系统,完全免费,通过近一周的体验,其桌面使用体验的"炫"程度要强于已经使用半年的Windows7.Unbuntu最吸引我的是它的UbuntuSoftwareCenter功能,能够方便地搜索并安装一些

ubuntu下搭建JAVA开发环境【转】

转自:http://jingyan.baidu.com/article/86fae346b696633c49121a30.html JAVA开发环境是一种跨平台的程序设计语言,可以在windows.LINUX等操作系统上进行开发.小编以前是做LINUX C开发的,最近因为工作,需要在UBUNTU下进行java开发环境的搭建,故写下这篇经验,和大家共享.参考.本篇经验分四步: 1)下载JDK 2)下载eclipse 3 ) 安装JDK 4)安装eclipse   工具/原料   UBUNTU ec

Linux环境下的Java开发(八):Linux和Windows的比较

在我刚开篇写这一系列随笔的时候,就有人问:在Linux下进行Java开发究竟 有什么优势,如果都是一样安装JDK.安装Eclipse,那和Windows下开发有什么区 别?这个问题问得很尖锐,的确,我们似乎根本没有必要把我们的工作从Windows 中转移到Linux中来. 在Linux系统中进行开发,和在Windows中进行开发相比较起来,即有优点,也 有缺点.下面是我的一些意见,欢迎大家讨论. 先来说说优势: 1.由Linux系统的本质决定的: Linux的本质有三点,一是开源,二是免费,三是

软件开发-JAVA在下载的时候报错,各位大神路过顺便帮忙看下吧

问题描述 JAVA在下载的时候报错,各位大神路过顺便帮忙看下吧 ClientAbortException: java.io.IOException at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:369) at org.apache.tomcat.util.buf.ByteChunk.append(ByteChunk.java:368) at org.apache.catalina.co

Ubuntu下搭建Java开发环境方法详解

具体安装步骤及问题: 本文以当前用户帐号安装和配置为例,不像切换root帐号那么麻烦,偶尔还会有权限问题. 1.安装jdk 1.6 我安装的是jdk-6u45-linux-x64.bin,在Ubuntu上安装rpm挺费事,.bin文件直接安装就ok.jdk 1.6版本还是很不错的,关键是要和"工作大环境"相统一.要稳定不要最新,新版不一定是好的,附上:jdk官方下载地址. 下载后,打开终端(ctrl+alt+t),进入到下载的文件目录,再执行命令安装到指定目录,如我的jdk安装目录为: