각 기사에 대한 클릭 수를 계산해야 하는 경우도 있습니다. 검색할 때마다 데이터베이스를 업데이트해야 하는 경우 방문 수가 많으면 성능이 매우 높아집니다. 더 좋은 방법은 먼저 업데이트할 데이터를 캐시한 다음 정기적으로 데이터베이스의 일괄 처리를 사용하여 일괄적으로 데이터베이스를 업데이트하는 것입니다. 소스코드는 다음과 같습니다.
CountBean.java
/*
*CountData.java
*
* 작성일: 2006년 10월 18일 오후 4시 44분
*
* 이 템플릿을 변경하려면 도구 | 옵션을 선택하고 아래에서 템플릿을 찾으세요.
* 소스 생성 및 관리 노드를 마우스 오른쪽 버튼으로 클릭하고 선택합니다.
* 엽니다. 그러면 소스 편집기에서 템플릿을 변경할 수 있습니다.
*/
패키지 com.tot.count
/**
*
* @author http://www.tot.name
*/
공개 클래스 CountBean {
개인 문자열 countType;
int countId;
/** CountData의 새 인스턴스를 생성합니다 */
공개 CountBean() {}
공공 무효 setCountType(문자열 countTypes){
this.countType=countTypes;
}
공공 무효 setCountId(int countIds){
this.countId=countIds;
}
공개 문자열 getCountType(){
카운트 유형을 반환합니다.
}
공개 int getCountId(){
countId를 반환합니다.
}
}
CountCache.java
/*
*CountCache.java
*
* 작성일: 2006년 10월 18일 오후 5시 1분
*
* 이 템플릿을 변경하려면 도구 | 옵션을 선택하고 아래에서 템플릿을 찾으세요.
* 소스 생성 및 관리 노드를 마우스 오른쪽 버튼으로 클릭하고 선택합니다.
* 엽니다. 그러면 소스 편집기에서 템플릿을 변경할 수 있습니다.
*/
패키지 com.tot.count;
import java.util.*;
/**
*
* @author http://www.tot.name
*/
공개 클래스 CountCache {
공개 정적 LinkedList 목록=새 LinkedList();
/** CountCache의 새 인스턴스를 생성합니다 */
공개 CountCache() {}
공개 정적 무효 추가(CountBean cb){
if(cb!=널){
목록.추가(cb);
}
}
}
CountControl.java
/*
*CountThread.java
*
* 작성일: 2006년 10월 18일 오후 4시 57분
*
* 이 템플릿을 변경하려면 도구 | 옵션을 선택하고 아래에서 템플릿을 찾으세요.
* 소스 생성 및 관리 노드를 마우스 오른쪽 버튼으로 클릭하고 선택합니다.
* 엽니다. 그러면 소스 편집기에서 템플릿을 변경할 수 있습니다.
*/
패키지 com.tot.count;
tot.db.DBUtils 가져오기;
import java.sql.*;
/**
*
* @author http://www.tot.name
*/
공개 클래스 CountControl{
private static long lastExecuteTime=0;//마지막 업데이트 시간 private static long executeSep=60000;//업데이트 간격을 밀리초 단위로 정의/** CountThread의 새 인스턴스를 생성합니다 */
공개 카운트컨트롤() {}
공개 동기화 무효 실행 업데이트(){
연결 연결=null;
준비된 진술 ps=null;
노력하다{
conn = DBUtils.getConnection();
conn.setAutoCommit(false);
ps=conn.prepareStatement("t_news 세트 업데이트 = hits+1 여기서 id=?");
for(int i=0;i<CountCache.list.size();i++){
CountBean cb=(CountBean)CountCache.list.getFirst();
CountCache.list.removeFirst();
ps.setInt(1, cb.getCountId());
ps.executeUpdate();⑴
//ps.addBatch();⑵
}
//int [] counts = ps.executeBatch();⑶
conn.commit();
}catch(예외 e){
e.printStackTrace();
} 마지막으로{
노력하다{
if(ps!=null) {
ps.clearParameters();
ps.close();
ps=널;
}
}catch(SQLException e){}
DBUtils.closeConnection(conn);
}
}
공개 긴 getLast(){
lastExecuteTime을 반환합니다.
}
공개 무효 실행(){
이제 오래되었습니다 = System.currentTimeMillis();
if ((현재 - lastExecuteTime) > excuteSep) {
//System.out.print("lastExecuteTime:"+lastExecuteTime);
//System.out.print(" 지금:"+now+"n");
// System.out.print(" sep="+(now - lastExecuteTime)+"n");
lastExecuteTime=지금;
실행업데이트();
}
또 다른{
//System.out.print(""+(now - lastExecuteTime)+" 초 동안 대기:"+"n");
}
}
}
//참고: 데이터베이스 드라이버가 일괄 처리를 지원하는 경우 ⑵ 및 ⑶로 표시된 코드 앞의 주석을 제거하고
코드 ⑴ 앞에 주석 클래스를 추가할 수 있습니다. 다음은 JSP의 다음 호출입니다.
<%
CountBean cb=new CountBean();
cb.setCountId(Integer.parseInt(request.getParameter("cid")));
CountCache.add(cb);
out.print(CountCache.list.size()+"<br>");
CountControl c=new CountControl();
c.실행();
out.print(CountCache.list.size()+"<br>");
%>