복붙노트

[SQL] 캔 PreparedStatement.addBatch ()는 SELECT 쿼리에 사용?

SQL

캔 PreparedStatement.addBatch ()는 SELECT 쿼리에 사용?

나는 하나 개의 입력에 따라 다릅니다 (100 개) SELECT 쿼리를 가지고 있다고 상상해보십시오. 해, PreparedStatement는 값에 사용할 수 있습니다.

나는 웹에 표시되는 모든 문서는 일괄 삽입 / 업데이트 / 삭제를위한 것입니다. 나는 select 문에 사용되는 배치를 본 적이 없다.

이것은 할 수 있습니까? 그렇다면, 때 아래의 샘플 코드를 좀 도와주세요.

나는 이것이 "IN"절을 사용하여 수행 할 수 있다고 생각,하지만 난 일괄 선택 문을 사용하는 것을 선호합니다.

샘플 코드 :

public void run(Connection db_conn, List value_list) {
    String sql = "SELECT * FROM DATA_TABLE WHERE ATTR = ?";
    PreparedStatement pstmt = db_conn.prepareStatement(sql);
    for (String value: value_list) {
        pstmt.clearParameters();
        pstmt.setObject(1, value);
        pstmt.addBatch();
    }
    // What do I call here?
    int[] result_array = pstmt.executeBatch()
    while (pstmt.getMoreResults()) {
        ResultSet result_set = pstmt.getResultSet();
        // do work here
    }
}

나는이 또한 드라이버에 의존하는 행동을 할 수있다 가정하자. 나는 IBM AS에 대해 자신의 JDBC 드라이버를 사용하여 / 400 DB2 데이터베이스에 쿼리를 쓰고 있어요.

해결법

  1. ==============================

    1.자바 튜토리얼을 참조하십시오 :

    자바 튜토리얼을 참조하십시오 :

  2. ==============================

    2.JDBC는 내 의견으로는 준비된 명령문은 당신이 IN (...) 절처럼, 인수의 변수 번호를 지정하는 것을 허용하지 않습니다 특히 때문에, 좌절 제한입니다 일괄 SELECT 쿼리를 생성 할 수 없습니다.

    JDBC는 내 의견으로는 준비된 명령문은 당신이 IN (...) 절처럼, 인수의 변수 번호를 지정하는 것을 허용하지 않습니다 특히 때문에, 좌절 제한입니다 일괄 SELECT 쿼리를 생성 할 수 없습니다.

    JavaRanch 기사 F.J 링크 고정 된 크기의 일련의 쿼리를 생성하고 나에게 성가신 및 최적 수정처럼 보인다 결과를, 가입하여 일괄 처리를 시뮬레이션 제안에; 수동으로 구성해야하고 지금 여러 쿼리를 처리하고 데이터베이스를 여러 번했다. 수동으로 정의 된 배치에 대해 선택한 번호가 좋지 않은 경우, 당신은 단지 간단한 쿼리에 응답하기 위해 데이터베이스를 꽤 몇 번을 치는 끝낼 수 있었다.

    대신, 동적 된 PreparedStatement는 내가 필요로하는 분야의 수와 개체 구성에 촬영했습니다. 이것은 잠재적으로 우리가 수동 배치 때와보다자는 PreparedStatements의 더 큰 수를 만들 평균 않지만, 우리는 우리가 데이터베이스에 접속하고 내가 더 중요한 문제로 볼 둘 다 우리의 구현을 단순화 빈도를 제한.

    /**
     * Use this method to create batch-able queries, e.g:
     * "SELECT * FROM t WHERE x IN (?, ?, ?, ?)"
     * Can be built as:
     * "SELECT * FROM t where x IN ("+getLineOfQs(4)+")"
     */
    public static String getLineOfQs(int num) {
      // Joiner and Iterables from the Guava library
      return Joiner.on(", ").join(Iterables.limit(Iterables.cycle("?"), num));
    }
    
    /**
     * Gets the set of IDs associated with a given list of words
     */
    public Set<Integer> find(Connection conn, List<String> words)
        throws SQLException {
      Set<Integer> result = new HashSet<>();
      try(PreparedStatement ps = conn.prepareStatement(
          "SELECT id FROM my_table WHERE word IN ("+
          getLineOfQs(words.size())+")")) {
        for(int i = 0; i < words.size(); i++) {
          ps.setString(i+1, words.get(i));
        }
    
        try (ResultSet rs = ps.executeQuery()) {
          while(rs.next()) {
            result.add(rs.getInt("id"));
          }
        }
      }
      return result;
    }
    

    이 코드에 너무 고통없는 당신의 PreparedStatement를 사용의 안전을 준다, 불필요한 데이터베이스 안타를 피할 수 있습니다.

  3. ==============================

    3.AddBatch는 () / '삽입'/ '갱신'문 '삭제'를, 그리고 '선택'문입니다.

    AddBatch는 () / '삽입'/ '갱신'문 '삭제'를, 그리고 '선택'문입니다.

  4. ==============================

    4.다른 답변에서 지적한 바와 같이 JDBC 일괄 업데이트는 SELECT 쿼리에 대한 작업을하지 않거나 적어도 그것을 위해 사용하는 것이 아닙니다.

    다른 답변에서 지적한 바와 같이 JDBC 일괄 업데이트는 SELECT 쿼리에 대한 작업을하지 않거나 적어도 그것을 위해 사용하는 것이 아닙니다.

    문제는 그러나 RDBMS로 DB2를 언급하기 때문에,이 특정 데이터베이스에 대한 공식 드라이버가 실제로 제공하여이 기능 DB2PreparedStatement # executeDB2QueryBatch () (참조를한다는 것을, 그것은 가치 (... 조금이라도 말 현재) 여기서 가리키는 생각 자세한 내용은 문서). 나는이 기능을 사용하여 다른 JDBC 드라이버를 인식하지입니다.

  5. from https://stackoverflow.com/questions/7899543/can-preparedstatement-addbatch-be-used-for-select-queries by cc-by-sa and MIT license