您的位置:首页 > 数据库 > Oracle

在weblogic8.14里面操作oracle大字段

2010-01-20 14:12 211 查看
1.首先说明一下:

原因是因为我在做这个项目时,被限制得太多,weblogic和oracle的版本不能变,要使用原来的版本。

因此呢。操作起来比较麻烦。而且不能更改原本工程里面的Jar包(它里面存在了oracle14.jar包,但比较旧)

weblogic版本为:8.14

oracle版本为:9i

2.在这里呢,使用hibernate,以流的形式读取到数据里面。

3.数据表呢:是一张保存文件的表

如下:

CREATE TABLE T_UPLOAD_FILE  (
FILE_ID            VARCHAR2(60)        PRIMARY KEY      NOT NULL,
FILE_NAME          VARCHAR2(250)                    NOT NULL,
OLD_FILE_NAME      VARCHAR2(250)                    NOT NULL,
FILE_PATH          VARCHAR2(250)                    NOT NULL,
FILE_TYPE          VARCHAR2(10),
FILE_SIZE          LONG,
STATUS             CHAR(1)                         NOT NULL,
UPLOAD_TIME        TIMESTAMP,
OPERATOR_ID        VARCHAR2(30),
FILE_CONTENT       BLOB
);


4.一个上传文件的文件对象:

UploadFileBFO:

private java.lang.String fileId;

private java.lang.String fileName;

private java.lang.String filePath;

private java.lang.Long fileSize;

private java.lang.String fileType;

private java.lang.String oldFileName;

private java.lang.String status;

private java.sql.Timestamp uploadTime;

private java.lang.String operatorId;

private java.sql.Blob fileContent;
//....get/set方法


5.在DAO里面实现:

/**
* 保存文件到数据库表中
*/
public boolean saveFileToDatabase(UploadFileBFO uploadFileBFO) {
boolean result = true;

Session s = null;
byte[] buffer = new byte[1];
buffer[0] = 1;
OutputStream out = null;
FileInputStream fin = null;

try {
SessionFactory sf = this.getSessionFactory();

s = sf.openSession();

Transaction tx = s.beginTransaction();

// 获取已经保存到数据库的对象
TUploadFileBO fileBO = getById(uploadFileBFO.getFileId());

fileBO.setFileContent(Hibernate.createBlob(buffer));

s.update(fileBO); // 更新对象
s.flush();

s.refresh(fileBO, LockMode.UPGRADE);

SerializableBlob sblob = (SerializableBlob) fileBO.getFileContent();
// BLOB转换
BLOB oracleBlob = null;

Class clzWeblogicOracleThinBlob = null;

try {
clzWeblogicOracleThinBlob = Class
.forName("weblogic.jdbc.vendor.oracle.OracleThinBlob");

Method method = clzWeblogicOracleThinBlob.getDeclaredMethod(
"getBinaryOutputStream", new Class[] {});
Object value = method.invoke(sblob.getWrappedBlob(),
new Object[] {});
out = (OutputStream) value;
} catch (ClassNotFoundException e) {
log
.warn(
"加载WebLogic的Oracle数据库JDBC驱动程序失败:weblogic.jdbc.vendor.oracle.OracleThinBlob",
e);
log.debug("使用Oracle数据库JDBC驱动程序。");
oracleBlob = (BLOB) sblob.getWrappedBlob();
out = oracleBlob.getBinaryOutputStream();
}

String fileName = fileBO.getFilePath() + "/" + fileBO.getFileName();

File f = FileUtils.getFileByPath(fileName);
if (f == null) {
log.error("无法读取文件。");
result = false;
return result;
}

fin = new FileInputStream(f);

byte[] b = new byte[FILE_BUFFER];
int len = 0;
while ((len = fin.read(b)) != -1) {
out.write(b, 0, len);
}

// 依次关闭(注意顺序)
fin.close();
out.flush();
out.close();
s.flush(); // 提交session
tx.commit(); // 提交事务
} catch (Exception e) {
log.error("保存文件到数据库时发生异常", e);
result = false;
} finally {
if (s != null) {
try {
s.close();
} catch (Exception e) {
log.error("关闭Hibernate Session失败.", e);
result = false;
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
log.error("关闭文件输出流失败.", e);
result = false;
}
}

if (fin != null) {
try {
fin.close();
} catch (IOException e) {
log.error("关闭输入流失败.", e);
result = false;
}
}
}
return result;
}


大家可以看到这段代码

Class clzWeblogicOracleThinBlob = null;

try {
clzWeblogicOracleThinBlob = Class
.forName("weblogic.jdbc.vendor.oracle.OracleThinBlob");

Method method = clzWeblogicOracleThinBlob.getDeclaredMethod(
"getBinaryOutputStream", new Class[] {});
Object value = method.invoke(sblob.getWrappedBlob(),
new Object[] {});
out = (OutputStream) value;
} catch (ClassNotFoundException e) {
log
.warn(
"加载WebLogic的Oracle数据库JDBC驱动程序失败:weblogic.jdbc.vendor.oracle.OracleThinBlob",
e);
log.debug("使用Oracle数据库JDBC驱动程序。");
oracleBlob = (BLOB) sblob.getWrappedBlob();
out = oracleBlob.getBinaryOutputStream();
}


上面这段代码为了在weblogic环境里面找驱动。如果没有Oracle的JDBC驱动,那么就使用weblogic自带的驱动。

注意:

在oracle旧的版本里面写BOLB字段时,会有些限制,大小的限制,同时不能直接写进去,

一般的做法:先写一个空的BLOB进去,再进行更新。

在oracle新的版本里面并不需要这样做,它是可以直接写到数据库里面去的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: