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查询,执行时间仅为一分钟以上。首先,我将实施这里建议的事情。