有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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中

有人能建议如何加快处理速度吗


共 (2) 个答案

  1. # 1 楼答案

    对于第一部分(慢速sql查询),我无法提供太多帮助,因为我们不知道查询、blob的大小和数据库配置。然而,如果斑点不是太大,这不是一个自然的响应时间。你真的应该像Lucene那样使用Oracle文本功能或第三方搜索引擎。这通常会在搜索响应时间上产生巨大差异

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

    • BufferedReader使用默认值(8K)以外的缓冲区大小,即64或128K。您可以在您的案例中尝试哪个值提供更好的结果
    • 使用StringBuilder连接字符串

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

  2. # 2 楼答案

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

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