如何将大的2进制文件文件存到oracle、mssqlserver等数据库中,oracle中存clob成功,就是不能将2进制文件放进去,我的oracles是8i...
hibernate中blob大2进制文件的问题?
没有用用过的吗?只要是大于4k的文件都不能保存
up
clob(Character Large Objects)是存字符的,也就是大的文本文件。
blob(Binary Large Objects)才是存二进制大对象的。
还有连接Oracle的jdbc如果是用thin的方式,则只能存储4k;如果想存储更大的对象,需要使用oci方式。
乱讲,我就是thin连接,插入1.2MB的blob型数据。
可以插入大于4k的,不过要做特别处理
在 design pattons里面有篇文章专门讲这个问题的
http://hibernate.bluemars.net/56.html
我直接使用Oracle 的驱动来输入 blob 的。
没听说过 thin 的驱动只能输入 4k 的说法,也许是孤陋寡闻~~
就我自己的经历,试过插入大于 1M 的文本。
各位数据库驱动是什么,我是按照http://hibernate.bluemars.net/56.html中的例子来的,确实不成功
请成功的网友贴点例子
大家可以参考一下:http://asktom.oracle.com/pls/ask/f?p=4950:8:4435890365134197305::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1310802216301,
这个thin的连接的问题,我没有仔细的调查清楚,当初有一哥们是用jsp+(weblogic+connectionpool),pool是使用thin的方式的,结果往long类型的字段插入>4000字符就会出错,后来weblogic的连接池改了配置以后,就可以了。
因此我怀疑可能是驱动程序的不同造成这样的问题的。一般的使用type 1类型的容易出这个问题,如果都是使用oracle classes111.zip是不是有这个问题,我没有测试。当然使用oci应该不会出问题的。
我曾经成功的插入过大于4k的数据。下面是我做的一个完整的程序:
public void createFile(Long folder_id, InputStream content) throws Exception {
Session session = sessions.openSession();
Transaction tx = null;
Content_file file = new Content_file();
file.setContent(Hibernate.createBlob(new byte[1]));
Content_folder folder = (Content_folder) session.load(Content_folder.class,
folder_id);
file.setFolder_id(folder_id);
try {
tx = session.beginTransaction();
session.save(file);
session.flush();
session.refresh(file, LockMode.UPGRADE);
oracle.sql.BLOB blobs = (oracle.sql.BLOB) file.getContent();
OutputStream os = blobs.getBinaryOutputStream();
int chunk = blobs.getChunkSize();
byte[] buffer = new byte[chunk];
int bytesread = 0;
while ( (bytesread = content.read(buffer, 0, chunk)) != -1) {
os.write(buffer, 0, bytesread);
}
os.flush();
os.close();
tx.commit();
}
catch (HibernateException he) {
if (tx != null)
tx.rollback();
throw he;
}