2010-08-11 2 views
4

mysql 데이터베이스는 localhost에서만 액세스 할 수있는 요구 사항이 있습니다. 이 시스템의 다른 서버가 데이터에 액세스 할 수 있도록 데이터베이스에 액세스하는 서블릿을 구현해야합니다 (서블릿이 프록시로 작동 함).서블릿에서 데이터 액세스

select * from database limit 100; 

사람이 어떻게 효율적으로 이러한 데이터를 스트리밍 할 서블릿을 작성하는 날을 제안 할 수 있습니다 (I가 새로운 오전 그러나,이 시스템은 같은 문장을 실행하는 데이터의 많은 부분을 다운로드 원격 서버로 구성 데이터베이스)?

답변

2

우선 서블릿을 사용하지 않는 것이 좋습니다. 올바른 접근 방법은 aioobe 및 mdma의 대답을 참조하십시오. 정말 다른 선택이없는 경우, 그때 계속 읽기 :


그냥 응답 데이터에 오는대로 즉시에 데이터를 기록 자바의 메모리의 모든 내용을 저장하지 마십시오.. 그래서 기본적으로 : writer.write(resultSet.getString("col")). 더구나, MySQL JDBC 드라이버는 기본적으로 무엇이든을 ResultSet#next()에주기 전에 Java 메모리에있는 모든 것을 캐시합니다. MySQL JDBC driver documentation에 따라 Statement#setFetchSize()을 설정하여 데이터를 즉시 행별로 전달할 수 있습니다. 여기

는 출력 CSV 형식의 데이터를 원하는 가정, 킥오프의 예입니다 :

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/csv"); 

    Connection connection = null; 
    Statement statement = null; 
    ResultSet resultSet = null; 
    PrintWriter writer = response.getWriter(); 

    try { 
     connection = database.getConnection(); 
     statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
     statement.setFetchSize(Integer.MIN_VALUE); 
     resultSet = statement.executeQuery("SELECT col1, col2, col3 FROM tbl"); 

     while (resultSet.next()) { 
      writer.append(resultSet.getString("col1")).append(','); 
      writer.append(resultSet.getString("col2")).append(','); 
      writer.append(resultSet.getString("col3")).println(); 
      // PS: don't forget to sanitize quotes/commas as per RFC4130. 
     } 
    } catch (SQLException e) { 
     throw new ServletException("Query failed!", e); 
    } finally { 
     if (resultSet != null) try { resultSet.close; } catch (SQLException logOrIgnore) {} 
     if (statement != null) try { statement.close; } catch (SQLException logOrIgnore) {} 
     if (connection != null) try { connection.close; } catch (SQLException logOrIgnore) {} 
    } 
} 
1

외부 호스트의 쿼리에 대해 SQL Server를 완전히 여는 것이 목표이지만 외부 연결을 허용하도록 재구성하지 않으려는 경우 터널을 설정하기 만하면됩니다. 서버가 청취하는 포트.

원격 호스트는 응용 프로그램 (로컬 호스트에서 실행)에 연결하고 SQL Server에 간단히 연결하여 데이터 스트림을 앞뒤로 중계합니다.

+1

이 가장 간단한 솔루션입니다; 데이터베이스의 기본 통신 방법을 사용하면 서블릿/http 응답을 통해 모든 것을 실행하는 것보다 오랜 시간이 걸릴 것 같습니다 –

1

Virtual JDBC과 같이 사용자가 찾고있는 것을 제공하는 JDBC 프록시가 있습니다.

관련 문제