1

下面是我的代码片段

    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);
                }   

然后,基于结果集列存储在 hashmap 中,在“total”中完成对字符串的搜索。

有人可以建议如何加快处理速度吗?

4

3 回答 3

0

您能否将搜索步骤移动到传递给 executeQuery 的 SQL 片段中,以便数据库执行搜索而不是 Java 代码?

否则,Blob 接口支持比使用流更直接的方法来获取数据,例如 getBytes() 可以获取可以传递给 String 构造函数的字节数组,或者例如 position(),它在 blob 中搜索模式。

于 2013-07-20T16:09:25.240 回答
0

鉴于您提供的信息,我看到了几种可能的增强功能。并非所有可能都适用:

  1. 存储结构化数据而不是 blob。当可搜索信息存储在规范化的表和列中时,最好使用 RDBMS。在 blob 内部进行搜索并不是 RDBMS 的用途。
  2. 使用 Oracle 的全文搜索功能
  3. 使用真正的搜索引擎,例如 Lucene
  4. 使用 StringBuilder 而不是连接字符串,从而产生大量垃圾。
  5. 在您刚刚阅读的行中搜索,并在找到所需内容后立即停止阅读,而不是仅在阅读完内存中的整个 BLOB 后才搜索
于 2013-07-20T16:09:51.143 回答
0

对于第一部分(慢速 sql 查询),我无法提供太多帮助,因为我们不知道查询、blob 的大小和数据库配置。但是,如果 blob 不是太大,这不是自然的响应时间。您应该真正使用 Oracle Text 功能或第三方搜索引擎作为 Lucene。这通常会对搜索响应时间产生巨大影响。

对于您的第二个问题(阅读 blob),我相信您将从以下方面看到一些改进:

  • BufferedReader为ie 64 或 128K使用除默认 (8K) 以外的缓冲区大小。您可以尝试哪个值在您的情况下提供更好的结果。
  • 使用 aStringBuilder连接字符串

另外需要注意的是,使用InputStreamReader接受字符集参数并将其设置为数据库配置的相同字符集的构造函数。您当前使用的代码如果是 UTF8,则可能会损坏您的数据

于 2013-07-20T16:48:52.447 回答