Java 我的代码太慢(使用jdbc、oracle.sql.BLOB并在BLOB中搜索字符串)
下面是我的代码片段Java 我的代码太慢(使用jdbc、oracle.sql.BLOB并在BLOB中搜索字符串),java,jdbc,blob,Java,Jdbc,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 ");
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中
有人能建议如何加快处理速度吗?能否将搜索步骤移动到传递给executeQuery的SQL片段中,以便数据库执行搜索而不是Java代码
否则,Blob接口支持比使用流更直接的方法来获取数据,例如getBytes()可以获取可以传递给字符串构造函数的字节数组,或者例如position(),它搜索Blob中的模式。根据您提供的信息,我看到了一些可能的增强功能。但并非所有这些都适用:
存储结构化数据,而不是blob。当可搜索信息存储在规范化的表和列中时,最好使用RDBMS。搜索Blob内部并不是RDBMS的目的
使用Oracle的全文搜索功能
使用真正的搜索引擎,例如Lucene
使用StringBuilder,而不是连接字符串,从而生成大量垃圾
在你刚读到的行中搜索,一旦你找到了你要找的内容,就停止阅读,而不是只在你读了内存中的整条BLOB后才搜索
对于第一部分(慢速sql查询),我不能提供太多帮助,因为我们不知道查询、blob的大小和数据库配置。然而,如果blob不是太大,这不是一个自然的响应时间。您应该真正使用Oracle文本功能或第三方搜索引擎作为Lucene。这通常会在搜索响应时间上产生巨大的差异
对于您的第二个问题(阅读blob),我相信您将从以下方面看到一些改进:
- 对于
BufferedReader
使用默认值(8K)以外的缓冲区大小,即64或128K。您可以在您的案例中尝试哪个值提供更好的结果
- 使用
StringBuilder
连接字符串
另外需要注意的是,使用InputStreamReader
的构造函数,该构造函数接受字符集参数,并将其设置为数据库配置的相同字符集。如果您当前使用的代码是UTF8,则可能会损坏您的数据。Blob的大小是多少?Blob的大小小于200kb。Blob的大小小于200kb。转换(Blob到文本)以及在地图中搜索和存储结果需要时间。我将按照建议进行更改。@DeepakPandey在我看来,要么您的数据库负载很大,要么它的连接速度非常慢。如果您从Oracle客户机获取sql查询并手动执行它,它是否仍然很慢?sql查询并不慢..我在sql developer上手动执行了sql查询,执行时间仅为一分钟以上。首先,我将实施这里建议的事情。