Spring Sample里面的ImageDB问题

看到Spring文件夹里面的ImageDB应用例子,就想跑起来看看效果怎样。
如果使用Mysql数据库,修改一下DDL里面的content字段为LONGBLOB就可以很方便地将图片存储在MySql数据库中。
(MySQL的四种BLOB类型
类型 大小(单位:字节)
TinyBlob 最大 255B
Blob 最大 65K
MediumBlob 最大 16M
LongBlob 最大 4G

在Oracle数据库(我用的是Oracle 11g XE)中却不是成功保存图片,一点击上传应用就卡住了,在Eclipse的高度窗口下,出现在很多Daemon进程。(一时找不出原因,我想可能是Oracle数据库版本以及Spring2.5对BLOB的一些兼容性上的问题。非常欢迎高人指正这个猜测)
于是我修改了一下存储图片的方法为如下,就可正常地在Oracle中存储图片了。
@Transactional
public void storeImage(final String name, final InputStream contentStream,
final int contentLength, final String description)
throws DataAccessException {
if (lobHandler instanceof OracleLobHandler) {
try {

PreparedStatement ptst = getConnection()
.prepareStatement(
"INSERT INTO IMAGEDB VALUES(? , EMPTY_BLOB() , EMPTY_CLOB())");
ptst.setString(1, name);
ptst.executeUpdate();
// Execute SQL statement
ptst = getConnection()
.prepareStatement(
"SELECT CONTENT ,DESCRIPTION FROM IMAGEDB WHERE IMAGE_NAME = ? FOR UPDATE");
ptst.setString(1, name);

ResultSet rs = ptst.executeQuery();
rs.next();
Blob contentBlob = rs.getBlob(1);
OutputStream blobOutputStream = ((BLOB) contentBlob)
.getBinaryOutputStream();
FileCopyUtils.copy(contentStream, blobOutputStream);

Clob descClob = rs.getClob(2);
Writer clobWriter = ((oracle.sql.CLOB) descClob)
.getCharacterOutputStream();
clobWriter.write(description);
clobWriter.close();

contentStream.close();
blobOutputStream.close();
getConnection().commit();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
getJdbcTemplate()
.execute(
"INSERT INTO imagedb (image_name, content, description) VALUES (?, ?, ?)",
new AbstractLobCreatingPreparedStatementCallback(
this.lobHandler) {
protected void setValues(PreparedStatement ps,
LobCreator lobCreator)
throws SQLException {
ps.setString(1, name);
lobCreator.setBlobAsBinaryStream(ps, 2,
contentStream, contentLength);
lobCreator.setClobAsString(ps, 3,
description);
}
});
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值