JDBC 조회 로 그 를 간단하게 만 들 기
12120 단어 디자인 모드sqljdbc전자 상 거래performance
이 글 에서 JDBC Prepared Statement 인 터 페 이 스 를 확장 하여 로 그 를 조회 하 는 방법 을 알 게 될 것 입 니 다.Loggable Statement 류 는 Prepared Statement 인 터 페 이 스 를 실현 하지만 검색 문자열 을 얻 는 방법 을 추가 하여 기록 에 적용 되 는 형식 을 사용 합 니 다.Loggable Statement 류 를 사용 하면 로그 코드 에서 오류 가 발생 할 확률 을 줄 이 고 간단 하고 관리 하기 쉬 운 코드 를 생 성 할 수 있 습 니 다.주의: 본 고 는 귀하 가 풍부 한 JDBC 와 Prepared Statement 류 경험 이 있다 고 가정 합 니 다.전형 적 인 로그 솔 루 션 표 1 은 데이터 베 이 스 를 조회 할 때 보통 Prepared Statement 을 어떻게 사용 하 는 지 소개 합 니 다. (초기 화 와 오류 처 리 는 무시 하지만)본 논문 에서 우 리 는 SQL query SELECT 를 예 로 들 지만 DELETE, UPDATE, INSERT 와 같은 다른 유형의 SQL 문 구 를 사용 하 는 것 을 토론 할 것 이다.표 1: 전형 적 인 SQL 데이터베이스 조회 < ccdnobr>
<ccid_code><font size="4"><font color="#a52a2a">String sql = "select foo, bar from foobar where foo < ? and bar = ?";
String fooValue = new Long(99);
String barValue = "christmas";
Connection conn = dataSource.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setLong(1,fooValue);
pstmt.setString(2,barValue);
ResultSet rs = pstmt.executeQuery();
// parse result...</font></font></ccid_code>
표 1 의 좋 은 조회 로그 항목 은 아래 와 몇 가지 유사 해 야 합 니 다.<ccid_code><font size="4"><font color="#a52a2a">Executing query: select foo,bar from foobar where foo < 99 and
bar='christmas'</font></font></ccid_code>
다음은 조회 로그 코드 의 예 입 니 다.메모: 표 1 의 물음 표 는 매개 변수의 값 으로 바 뀌 었 습 니 다.<ccid_code><font size="4"><font color="#a52a2a">System.out.println("Executing query:
select foo, bar from foobar where foo
< "+fooValue+" and bar = '+barValue+"'")</font></font></ccid_code>
더 좋 은 방법 은 만 드 는 방법 입 니 다. 우 리 는 replace First QuestionMark 라 고 부 릅 니 다. 검색 문자열 을 읽 고 매개 변수 값 으로 물음 표를 바 꾸 는 것 입 니 다. 표 2 와 같 습 니 다.이러한 방법 은 SQL 문 구 를 설명 하기 위해 복사 한 문자열 을 만 들 필요 가 없습니다.표 2: replace First QuestionMark 를 사용 하여 문자열 을 바 꿉 니 다.
<ccid_code><font size="4"><font color="#a52a2a">// listing 1 goes here
sql = replaceFirstQuestionMark(sql, fooValue);
sql = replaceFirstQuestionMark(sql, barValue);
System.out.println("Executing query: "+sql);</font></font></ccid_code>
이런 해결 방안 들 은 모두 실시 하기 쉽 지만 완벽 한 것 은 하나 도 없다.문 제 는 SQL 템 플 릿 을 변경 하 는 동시에 로그 코드 도 변경 해 야 한 다 는 것 이다.당신 은 어떤 점 에서 실 수 를 하 는 것 은 거의 불가피 할 것 입 니 다.조 회 는 변경 되 지만 로그 코드 를 업데이트 하 는 것 을 잊 었 습 니 다. 데이터베이스 에 보 낼 조회 와 일치 하지 않 는 로그 항목 인 디 버 깅 악몽 을 끝 낼 것 입 니 다.우리 에 게 정말 필요 한 것 은 모든 매개 변수 변 수 를 한꺼번에 사용 할 수 있 도록 하 는 디자인 방안 입 니 다.우 리 는 검색 문자열 을 얻 고 실제 매개 변수 값 으로 매개 변수 대체 자 를 대체 할 수 있 는 방법 이 있 기 를 바 랍 니 다.자바. sql. Prepared Statement 에는 이런 방법 이 없 기 때문에 우 리 는 스스로 실현 해 야 합 니 다.
맞 춤 형 솔 루 션
JDBC 드라이브 를 둘 러 싼 "실제 구문 (real statement)" 의 패 키 징 기 (Wrapper) 를 위 한 맞 춤 형 구현 입 니 다. 패 키 징 기 문 구 는 모든 방법 (예 를 들 어 setLong (int, long) 과 setString (int, String) 을 "실제 구문" 으로 전송 합 니 다.. 이렇게 하기 전에 관련 매개 변수 값 을 저장 하여 로그 출력 결 과 를 만 드 는 데 사용 할 수 있 습 니 다.
표 3 은 Loggable Statement 류 가 자바. sql. Prepared Statement 을 어떻게 실현 하 는 지, 그리고 JDBC 연결 과 SQL 템 플 릿 을 입력 으로 구축 하 는 방법 을 소개 했다.
표 3: LoggableStatement 구현 java. sql. Prepared Statement
<ccid_code><font size="4"><font color="#a52a2a">public class LoggableStatement implements java.sql.PreparedStatement {
// used for storing parameter values needed
// for producing log
private ArrayList parameterValues;
// the query string with question marks as
// parameter placeholders
private String sqlTemplate;
// a statement created from a real database
// connection
private PreparedStatement wrappedStatement;
public LoggableStatement(Connection connection, String sql)
throws SQLException {
// use connection to make a prepared statement
wrappedStatement = connection.prepareStatement(sql);
sqlTemplate = sql;
parameterValues = new ArrayList();
}
}</font></font></ccid_code>
Loggable Statement 어떻게 작 동 합 니까?
표 4 에 서 는 Loggable Statement 이 saveQuery ParamValue () 방법 에 호출 을 추가 하 는 방법 과 방법 setLong 과 setString 의 '진실 한 문장' 을 상 향 조정 하 는 방법 을 소개 합 니 다. 매개 변수 설정 에 사용 되 는 모든 방법 (예 를 들 어 setChar, setLong, setRef, setObj) 과 같은 방식 으로 saveQuery ParamValue () 를 추가 합 니 다.호출. 표 4 는 saveQuery ParamValue () 를 호출 하지 않 은 상태 에서 방법 executeQuery 를 어떻게 봉인 하 는 지 보 여 줍 니 다. '매개 변수 설정' 방법 이 아니 기 때 문 입 니 다.
표 4: Loggable Statement 방법
<ccid_code><font size="4"><font color="#a52a2a">public void setLong(int parameterIndex, long x)
throws java.sql.SQLException {
wrappedStatement.setLong(parameterIndex, x);
saveQueryParamValue(parameterIndex, new Long(x));
}
public void setString(int parameterIndex, String x)
throws java.sql.SQLException {
wrappedStatement.setString(parameterIndex, x);
saveQueryParamValue(parameterIndex, x);
}
public ResultSet executeQuery() throws java.sql.SQLException {
return wrappedStatement.executeQuery();
}</font></font></ccid_code>
표 5 에는 saveQuery ParamValue () 방법 이 표 시 됩 니 다. getQuery String 방법 을 나중에 사용 할 수 있 도록 매개 변수 값 을 String 으로 변환 합 니 다. 결 성 된 경우, 한 대상 이 toString 방법 을 사용 하면 String 으로 변 환 됩 니 다. 단, 대상 이 String 이나 Date 이면 작은 따옴표 (') 로 표 시 됩 니 다. getQueryString ()로그 에서 대부분의 조 회 를 복사 하고 붙 여 넣 을 수 있 는 방법 입 니 다. 대화 형 SQL 프로 세 서 를 수정 하지 않 아 도 테스트 와 디 버 깅 을 할 수 있 습 니 다. 이 방법 을 수정 해 야 하 는 방법 에 따라 다른 종류의 매개 변수 값 을 변환 할 수 있 습 니 다.표 5: saveQuery ParamValue () 방법
<ccid_code><font size="4"><font color="#a52a2a">private void saveQueryParamValue(int position, Object obj) {
String strValue;
if (obj instanceof String || obj instanceof Date) {
// if we have a String, include '' in the saved value
strValue = "'" + obj + "'";
} else {
if (obj == null) {
// convert null to the string null
strValue = "null";
} else {
// unknown object (includes all Numbers), just call toString
strValue = obj.toString();
}
}
// if we are setting a position larger than current size of
// parameterValues, first make it larger
while (position >= parameterValues.size()) {
parameterValues.add(null);
}
// save the parameter
parameterValues.set(position, strValue);
}</font></font></ccid_code>
모든 인 자 를 표준 방법 으로 설정 할 때 Loggable Statement 에서 getQuery String () 방법 을 간단하게 호출 하여 검색 문자열 을 얻 습 니 다. 모든 물음표 가 실제 매개 변수 값 으로 대 체 됩 니 다. 선택 한 로그 목적지 로 출력 하려 고 합 니 다.LoggableStatement 사용 하기
표 6 은 표 1 과 표 2 의 코드 를 LoggableStatement 으로 변경 하 는 방법 을 보 여 줍 니 다. LoggableStatement 을 프로그램 코드 에 도입 하면 복 사 된 매개 변수 변 수 를 해결 할 수 있 습 니 다. SQL 템 플 릿 을 바 꾸 면 Prepared Statement 의 매개 변수 설정 호출 만 업데이트 합 니 다. (예 를 들 어 pstmt. setString (3, "new - param - value")이 변경 사항 은 로그 출력 결과 에 반영 되 며, 기록 코드 가 필요 없 는 수 동 업데이트 입 니 다.
표 6: Loggable Statement 사용
<ccid_code><font size="4"><font color="#a52a2a">String sql = "select foo, bar from foobar where foo < ? and bar = ?";
long fooValue = 99;
String barValue = "christmas";
Connection conn = dataSource.getConnection();
PreparedStatement pstmt;
if(logEnabled) // use a switch to toggle logging.
pstmt = new LoggableStatement(conn,sql);
else
pstmt = conn.prepareStatement(sql);
pstmt.setLong(1,fooValue);
pstmt.setString(2,barValue);
if(logEnabled)
System.out.println("Executing query: "+
((LoggableStatement)pstmt).getQueryString());
ResultSet rs = pstmt.executeQuery();</font></font></ccid_code>
종결 어
본 고 에서 소개 한 매우 간단 한 절 차 를 사용 하면 조회 기록 을 위해 JDBC Prepared Statement 인 터 페 이 스 를 확장 할 수 있 습 니 다. 여기 서 사용 하 는 기술 은 "패 키 징 을 통 해 확장" 또는 Decorator 디자인 모델 의 인 스 턴 스 로 볼 수 있 습 니 다. (참고 자료 참조)... 패 키 징 을 통 해 확장 을 실현 합 니 다. API 를 확장 해 야 하지만 subclassing 은 선택 할 수 있 는 기능 이 아 닐 때 유용 합 니 다.
참고 자료 부분 에서 Loggable Statement 류 의 소스 코드 를 찾 을 수 있 습 니 다. 데이터베이스 프로그램의 특별한 수 요 를 충족 시 키 기 위해 서 는 그대로 사용 하거나 맞 춤 형 으로 사용 할 수 있 습 니 다.
참고 자료
◆ Loggable Statement 클래스 다운로드
소스 코드 。
◆ 당신 은 Roman Vichr 에서
팁 과 팁: JDBC 팁 (developerWorks, 2002 년 10 월) 에서 Prepared Statements 를 사용 하 는 간단 한 소 개 를 찾 았 습 니 다.
◆ 레 너 트 조 렐 리드 의 '
"Use JDBC for industrial-strength performance" (developerWorks, 2000 년 1 월) 은 JDBC 에서 모델 을 디자인 하 는 두 부분 에 대한 소개 적 인 글 입 니 다.
◆ 조 쉬 하 이 드 브 레 히트 가 쓴 '
"JDBC 3.0 새로운 기능" (developerWorks, 2001 년 7 월) 는 JDBC 3.0 의 개술 을 제공 합 니 다.
◆ 당신 은
java.sun.com 자바 플랫폼, Standard Edition, JDBC 3.0 API 규범 을 다운로드 합 니 다.
◆ 데 이 비 드 갤 러 도의 '
"자바 디자인 모드 101" (developerWorks, 2002 년 1 월) 은 Gang of Four 템 플 릿 에 대한 좋 은 소개 입 니 다.
◆ 폴 몬 데 이의 '
자바 디자인 모드 201 "(developerWorks, 2002 년 4 월) 고급 학생 들 에 게 자바 디자인 모델 에 대해 더욱 개념 적 인 설명 을 제공 했다.
◆ 빈 스 허 스 턴 의
Design Patterns site 디자인 모델 을 잘 아 는 또 다른 자원 이다.
◆ 브 라 이언 고 츠 의 '자바 이론 과 실천:
성능 관리 - 계획 이 있 습 니까? "(developerWorks, 2003 년 3 월) 자바 응용 프로그램의 전체적인 성능 을 향상 시 키 는 조 치 를 실시 할 수 있 음 을 논술 했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.