一个特殊的应用,一定要用到这样的操作:假如在数据库中有这样一个记录
列名 a1 a2 a3
值 abcd 12 2008-01-01
现在要实现一个追加操作,之后该记录变为
列名 a1 a2 a3
值 abcdm5dc 129510 2008-01-01
数据库可以进行这样的操作吗?
列名 a1 a2 a3
值 abcd 12 2008-01-01
现在要实现一个追加操作,之后该记录变为
列名 a1 a2 a3
值 abcdm5dc 129510 2008-01-01
数据库可以进行这样的操作吗?
可以的,使用update Table set a1=al||'m5dc' ,a2=12||'9510' where id=????这里是的||是字符串链接操作,ORCALE里面的,其他数据库也可以有代替的
嗯,只能用update了,插入是指插入新的记录嘛,不能用update么?
用户提供的机器1G内存,要在数据库中存2G的blob数据
而java对数据库的操作是这样的:将2G blob全部读入到内存在,再写入数据库
考虑到并发的情况,就是20G内存都不能够(假如系统支持),所以我想了一个办法,将
2G分开读,依次追加到列中,但是在一般的应用中,好像不能这样做,所以向高手请教!!!!
明白你的意思,blob数据也是采用流的形式来存储的,你可以就像写outputStream一样一点一点添加的
还有一点建议就是,这么大的blob数据最好不要写入数据库,可以作为一个文件存储,而在数据库中只记录他的位置就可以了,使用的时候就根据地址直接读取文件,这样速度快得多,也不会造成数据库瓶颈
加到这个中可以outputStream分次进行,分次加到数据库中行吗!!!!!!求语句!!!
BLOB blob = (BLOB) rs.getBlob("A");
OutputStream os = blob.getBinaryOutputStream();
BufferedOutputStream output = new BufferedOutputStream(os); 后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中:
BufferedInputStream input = new BufferedInputStream(new File("c:\\hpWave.log").toURL().openStream());
byte[] buff = new byte[2048]; //用做文件写入的缓冲
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
上面的代码就是从input里2k地读取,然后写入到output中。
1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet
1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true);
从查询到的 BLOB字段中,获取blob并进行更新,代码如下:
BLOB blob = (BLOB) rs.getBlob("A");
OutputStream os = blob.getBinaryOutputStream();
BufferedOutputStream output = new BufferedOutputStream(os); 后面再使用output.write方法将需要写入的内容写到output中就可以了。例如我们将一个文件写入这个字段中:
BufferedInputStream input = new BufferedInputStream(new File("c:\\hpWave.log").toURL().openStream());
byte[] buff = new byte[2048]; //用做文件写入的缓冲
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
上面的代码就是从input里2k地读取,然后写入到output中。
1.5上面执行完毕后,记得关闭output,input,以及关闭查询到的ResultSet
1.6最后执行conn.commit();将更新的内容提交,以及执行conn.setAutoCommit(true);
--------------------------------------------------------------------------
上面的代码我试过,注意到这段代码了吗?
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
如果内存1G,blob 1G,
程序要把全部的blob都读入到output中,才开始数据库的写入操作
所以,程序跑一会,就会出现内存不足问题
在output.write(buff, 0, bytesRead); 抛出异常java.lang.OutOfMemoryError: Java heap space
这个sql2000的 不过要求a1 a2不能为char
那你就需要特殊处理一下了,往outStream中写入一定数据之后,你就commit一下,然后再继续写入
如果你中间commit一下,以后如果要回滚就有问题了!
BufferedInputStream input = new BufferedInputStream(new File("c:\\hpWave.log").toURL().openStream());
byte[] buff = new byte[2048]; //用做文件写入的缓冲
int bytesRead;
while(-1 != (bytesRead = input.read(buff, 0, buff.length))) {
output.write(buff, 0, bytesRead);
System.out.println(bytesRead);
}
这个部分,这个部分是不能完成数据库的写入操作的!
还要有类是的
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, bt);
ps.executeUpdate();
才能完成数据库的写操作,而一次
PreparedStatement ps = conn.prepareStatement(sql);
ps.setObject(1, bt);
ps.executeUpdate();
会删除上次已经插入的blob部分的!!!
所以,还是不能追加记录的!!!!!
如果把用户名和密码还有一些关键字用MD5加密,你下到数据库也白费,server裸了,又如何,你面对N多的blob数据,如何判断是什么格式的?是否加了密?