DBPersistence.java 2.47 KB
package com.bsth.oplog.db.mysql;

import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;

import com.bsth.oplog.Log;

/**
 * 
 * @ClassName: DBPersistence 
 * @Description: TODO(mysql 批量入库) 
 * @author PanZhao 
 * @date 2016年10月20日 上午9:44:00 
 *
 */
@Component
public class DBPersistence {
	
	@Autowired
	JdbcTemplate jdbcTemplate;
	
	Logger logger = LoggerFactory.getLogger(DBPersistence.class);
	
	public void batchSave(LinkedList<Log> list){
		String sql = "insert into bsth_c_sys_op_log"
				+ "(timestamp, path, type,level, caller_class, caller_method, user_name, client_ip, server_ip, month, http_data, line_number)"
				+ " values(?,?,?,?,?,?,?,?,?,?,?,?)";
		
		
		List<Log> saveList = new ArrayList<>(list.size());
		Log log;
		while(true){
			log = list.poll();
			if(log != null)
				saveList.add(log);
			else
				break;
		}	
		
		Date month = new Date(System.currentTimeMillis());
		
		try {
			jdbcTemplate.batchUpdate(sql, new LogBatchPreparedStatementSetter(saveList, month));
		} catch (Exception e) {
			logger.error("操作日志入库失败", e);
		}
	}
	
	private class LogBatchPreparedStatementSetter implements BatchPreparedStatementSetter{

		List<Log> temList;  
		Date month;
	      
	    public LogBatchPreparedStatementSetter(final List<Log> list, Date month){  
	        this.temList = list; 
	        this.month = month;
	    }
	    
		@Override
		public void setValues(PreparedStatement ps, int i) throws SQLException {
			Log log = temList.get(i);
			ps.setLong(1, log.getTimestamp());
			ps.setString(2, log.getPath());
			ps.setString(3, log.getType());
			ps.setString(4, log.getLevel());
			ps.setString(5, log.getCallerClass());
			ps.setString(6, log.getCallerMethod());
			ps.setString(7, log.getUserName());
			ps.setString(8, log.getClientIp());
			ps.setString(9, log.getServerIp());
			ps.setDate(10, month);
			ps.setString(11, log.getHttpData());
			ps.setObject(12, log.getLineNumber());
		}

		@Override
		public int getBatchSize() {
			return temList.size();
		} 
	}
}