2017-05-17 1 views
0

SQLite DB를 쿼리하는 Java 프로그램을 사용하고 있습니다. 나는 현재 개발 테스트 상태에 있으며 특정 select 쿼리를 테스트하려고했습니다. 모든 결과를 처리하기 위해 모든 DB 명령 (생산자)과 소비자 스레드를 발행하기 위해 호출하는 스레드가 있습니다. DBCommand 스레드 (프로듀서) 다만 문제는이 결과는 설정 얻을, 새 쿼리를 작성하고 공유 큐에 배치의 DB 연결을 열고 같은 연결을 닫습니다 : 지점ResultSet이 이미 요청되었습니다.

String url = "jdbc:sqlite:" + Configuration.getInstance().getDbPath(); 
     // create a connection to the database 
     conn = DriverManager.getConnection(url); 

try 
     { 
      if (conn.isValid(DB_TIMEOUT)) 
      { 
       Statement stmt; 
       try 
       { 
        errorLog.info("Query Issued to Database: " + query); 
        stmt = conn.createStatement(); 
        stmt.execute(query); 
        ResultSet rs = stmt.getResultSet(); 
        if (rs != null) 
        { 
         try 
         { 
          TrendApp.resultSetProcQueue.put(new QueryResult(request, stmt.getResultSet())); 
         } catch (InterruptedException e) 
         { 
          errorLog.error("Failed to capture result set from query: " + e); 
         } 

        } else 
        { 
         try 
         { 
          TrendApp.resultSetProcQueue.put(new QueryResult(request, null)); 
         } catch (InterruptedException e) 
         { 
          errorLog.error("Failed to capture result set from query: " + e); 
         } 
         errorLog.info(stmt.getUpdateCount() + " rows updated."); 
        } 

       } catch (SQLException e) 
       { 
        errorLog.error("Failed to issue database command: " + e); 
       } 

      } 
     } catch (SQLException e) 
     { 
      errorLog.error("Database connection is not valid."); 
     } 

     closeDB(); 
    } else 
    { 
     errorLog.info("Database query is empty. No action performed."); 
    } 

} 

마음을 이 프로그램은 이미 존재하는 더 큰 테이블 세트에서 요소를 가져와보다 쉽게 ​​액세스 할 수 있도록 새 테이블에 하위 세트를 추가하는 것입니다. 따라서 새 테이블을 쿼리 할 때 "ResultSet already requested"오류가 발생합니다. 소비자 측면에 대한 참고 사항, 아직 결과 집합 처리가 아직 없습니다 (아직 코드를 작성하지 않았습니다). 이 오류는 프로그램 재시작 사이에도 발생합니다. 새 테이블에 대한 초기 쿼리 이후로는 작동하지 않았습니다.

[정보] 2017년 5월 17일 9시 27분 41초 [풀-2 스레드-4] DBExtend - 데이터베이스에 발행 검색어 : TrendPredef1111 구별 타임 스탬프, machineId, ioType, ioId, 서브 필드 값을 선택 WHERE = 1,111 machineId AND ioType = 2 AND ioId = "25"AND 소인 < = 1495027659000000000 소인> = 1494943059000000000

[ERROR] 2017년 5월 17일 9시 27분 41초 [풀 -2- 스레드 4] DBExtend - 데이터베이스 명령을 발행하지 못했습니다 : java.sql.SQLException : 이미 요청 된 ResultSet

내가 뭘 잘못하고 있는거야?

+4

'stmt.getResultSet()'을 두 번 호출하고 있습니다. 이것은 금지되어 있습니다. – Berger

답변

2

결과 집합 요청은 두 번 있습니다.

첫 번째는 Resultset 개체를 만드는 경우입니다.

두 번째로 QueryResult 객체를 생성하는 중입니다.

대신 "rs"개체를 전달하십시오.

+0

고맙습니다 !!!!!! – Tacitus86

+0

편집을 참조하십시오 – Shuddh

+0

네, 편집하기 전에 변경했습니다. 그럼에도 불구하고 명확한 설명에 감사드립니다. – Tacitus86