/* ==================================================================
* Created [2009-4-27 下午11:32:55] by Jon.King
* ==================================================================
* TSS
* ==================================================================
* mailTo:jinpujun@hotmail.com
* Copyright (c) Jon.King, 2009-2012
* ==================================================================
*/
package com.jinhe.tss.portal.helper;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Iterator;
import java.util.List;
import com.jinhe.tss.core.Config;
import com.jinhe.tss.core.cachepool.extend.assignment.OutputRecordsManager;
import com.jinhe.tss.core.cachepool.extend.assignment.RecordsOutputTask;
import com.jinhe.tss.core.cachepool.extend.connection.DBHelper;
import com.jinhe.tss.portal.entity.FlowRate;
/**
* <p> FlowrateManager.java </p>
* 页面流量访问统计
*/
public class FlowrateManager extends OutputRecordsManager{
private static FlowrateManager manager;
private FlowrateManager(){
}
public static FlowrateManager getInstanse(){
if(manager == null)
manager = new FlowrateManager();
return manager;
}
protected void excuteTask(List<Object> temp) {
OutputFlowrateTask task = new OutputFlowrateTask();
task.fill(temp);
tpool.excute(task);
}
public void output(Object record){
super.output(record);
//super.flush();
}
public static class OutputFlowrateTask extends RecordsOutputTask {
protected void createRecords(Connection conn) throws SQLException {
String insertSql;
if( Config.TRUE.equals(Config.getAttribute(Config.IS_H2_DATABASE)) ) {
// H2:跑单元测试用,无需关心ID,DEFAULT nextval('pms_flowrate_sequence')
insertSql = "insert into pms_flowrate(pageId, ip, visitTime) values(?, ?, ?)";
}
else {
// Oracle or 其他正式数据库
insertSql = "insert into pms_flowrate(id, pagedId, ip, visitTime) values(pms_flowrate.nextval, ?, ?, ?)";
}
PreparedStatement pstmt = conn.prepareStatement(insertSql);
for (Iterator<?> it = records.iterator(); it.hasNext();) {
FlowRate temp = (FlowRate) it.next();
if(checkIsTheSameVisitor(conn, temp))
continue;
int index = 1;
pstmt.setLong(index++, temp.getPageId());
pstmt.setString(index++, temp.getIp());
pstmt.setTimestamp(index++, new Timestamp(temp.getVisitTime().getTime()));
pstmt.execute();
}
pstmt.close();
}
/**
* 如果数据库中已经有这样一条记录:和当前访问相同的页面且相同的IP,并且相隔时间在三分钟内
* @param conn
* @param temp
* @return
*/
private boolean checkIsTheSameVisitor(Connection conn, FlowRate temp) {
String sql = "select count(*) from pms_flowrate t where t.ip ='"
+ temp.getIp() + "' and t.pageId = " + temp.getPageId()
+ " and t.visitTime between sysdate - 1/480 and sysdate ";
return DBHelper.executeSQL(conn, sql) != 0;
}
}
}