java My代码太慢(使用jdbc、oracle.sql.BLOB并在BLOB中搜索字符串)
下面是我的代码片段
PreparedStatement preStatement = conn.prepareStatement(query);
System.out.println("preparing sql ststement: " + query);
ResultSet result = preStatement.executeQuery();
System.out.println(" result stored in result set ");
while(result.next()){
try{
int readCount = 0;
oracle.sql.BLOB blob=((OracleResultSet)result).getBLOB("payload");
InputStream in=blob.getBinaryStream();
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(in));
String total="";
String str;
while ((str = br.readLine()) != null) {
total += str;
//System.out.println(total);
}
System.out.println(total);
in.close();
执行ResultSet result = preStatement.executeQuery();
行大约需要1分钟。
但是,将Blob数据转换为文本字符串需要4分钟
下面是代码的这一部分
oracle.sql.BLOB blob=((OracleResultSet)result).getBLOB("payload");
InputStream in=blob.getBinaryStream();
BufferedReader br = new BufferedReader(new java.io.InputStreamReader(in));
String total="";
String str;
while ((str = br.readLine()) != null) {
total += str;
//System.out.println(total);
}
然后,根据搜索结果集列的结果,在“total”中搜索字符串 存储在hashmap中
有人能建议如何加快处理速度吗
# 1 楼答案
对于第一部分(慢速sql查询),我无法提供太多帮助,因为我们不知道查询、blob的大小和数据库配置。然而,如果斑点不是太大,这不是一个自然的响应时间。你真的应该像Lucene那样使用Oracle文本功能或第三方搜索引擎。这通常会在搜索响应时间上产生巨大差异
关于你的第二个问题(阅读blob),我相信你会从以下方面看到一些改进:
BufferedReader
使用默认值(8K)以外的缓冲区大小,即64或128K。您可以在您的案例中尝试哪个值提供更好的结果李>StringBuilder
连接字符串另外需要注意的是,使用
InputStreamReader
的构造函数,它接受一个字符集参数,并将其设置为数据库配置的相同字符集。如果您当前使用的代码是UTF8,则可能会损坏您的数据# 2 楼答案
能否将搜索步骤移动到传递给executeQuery的SQL片段中,以便数据库执行搜索而不是Java代码
否则,Blob接口支持比使用流更直接的方法来获取数据,例如getBytes()可以获取可以传递给字符串构造函数的字节数组,或者例如position(),它在Blob中搜索模式