java代码实现mysql分表(用户行为记录)

设置项目气动执行次方法(每天检查一次表记录)

public class DayInterval implements ServletContextListener{
	private static SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static void showDayTime() {
			Timer dTimer = new Timer();
			dTimer.schedule(new TimerTask() {
			@Override
			public void run() {	
			     System.out.println("每日任务执行:"+simpleDateFormat.format(new Date()));
			     LogTableCreate logTableCreate = new LogTableCreate();
			     Thread thread=new Thread(logTableCreate);
			     thread.start();
			}
			}, 1000 , 24* 60* 60 * 1000);//24* 60* 60 * 1000(第一次一秒后执行,以后每次一天后执行)
	}

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
//		showDayTime();
	}

	@Override
	public void contextInitialized(ServletContextEvent arg0) {
		showDayTime();
	}

}

LogTableCreate 用来做表分表是否已经创建,如现在是9月在启动时检查是否存在当月表记录,不存在则创建存在则不创建,另外检查是否存在10月份表记录,不存在则创建(提前创建一个也空表,以此类推)。
拷贝代码修改createsql(建表sql),URL (数据库地址),USER (数据库连接用户),PASSWORD(数据库连接密码)

public  class LogTableCreate extends TimerTask  {
	
	private static final Log log = LogFactory.getLog(LogTableCreate.class);
	public static final String TBASENAME="tb_log";
		private String createsql = " (\r\n" + 
				"  `ID` varchar(64) NOT NULL COMMENT '主键id',\r\n" + 
				"  `userid` varchar(255) DEFAULT NULL COMMENT '用户id',\r\n" + 
				"  `username` varchar(255) DEFAULT NULL COMMENT '用户姓名',\r\n" + 
				"  `useridcard` varchar(255) DEFAULT NULL COMMENT '用户身份证号码',\r\n" + 
				"  `realname` varchar(64) DEFAULT NULL COMMENT '真实姓名',\r\n" + 
				"  `logintime` varchar(255) DEFAULT NULL COMMENT '登录时间',\r\n" + 
				"  `exittime` varchar(64) DEFAULT NULL COMMENT '退出时间',\r\n" + 
				"  `ippath` varchar(255) DEFAULT NULL COMMENT 'ip地址',\r\n" + 
				"  `macpath` varchar(255) DEFAULT NULL COMMENT 'mac地址',\r\n" + 
				"  `usercreatedtime` varchar(255) DEFAULT NULL COMMENT '用户创建时间',\r\n" + 
				"  `userbusidaddress` varchar(255) DEFAULT NULL COMMENT '用户钱包地址',\r\n" + 
				"  `member` int(11) DEFAULT NULL COMMENT '是否是会员',\r\n" + 
				"  `membertype` int(11) DEFAULT NULL COMMENT '会员类型',\r\n" + 
				"  `spare1` varchar(255) DEFAULT NULL,\r\n" + 
				"  `spare2` varchar(255) DEFAULT NULL,\r\n" + 
				"  `spare3` varchar(255) DEFAULT NULL,\r\n" + 
				"  PRIMARY KEY (`ID`)\r\n" + 
				")";	

	private SimpleDateFormat sdyyyy = new SimpleDateFormat("yyyy");
	private SimpleDateFormat sdmm = new SimpleDateFormat("MM");

    private static final String URL = "";
    private static final String USER = "";
    private static final String PASSWORD = "";
    //得到表名
    public static String gettable() {
    	Date date = new Date();
    	LogTableCreate logTableCreate=new LogTableCreate();
		String yyyy = logTableCreate.sdyyyy.format(date);
		String mm = logTableCreate.sdmm.format(date);
		String nmm = logTableCreate.getNextMM(mm);
		return TBASENAME+yyyy+mm;
		
    }
    
	//得到下一个月
	private String getNextMM(String mm){
		String nmm = "";
		int imm = Integer.parseInt(mm);
		if(imm>=12){
			nmm = "01";
		}else{
			imm++;
			if(imm>9)
				nmm = ""+imm;
			else
				nmm = "0"+imm;
		}
		return nmm;
	} 

	@Override
	public void run() {
		Date date = new Date();
		String yyyy = sdyyyy.format(date);
		String mm = sdmm.format(date);
		String nmm = getNextMM(mm);
		
		String nyyyy = "";
		if("01".equals(nmm)){
			nyyyy = ""+(Integer.parseInt(yyyy)+1);
		}else{
			nyyyy = yyyy;
		}
		
		log.info("日志表检查及创建:"+yyyy+" - "+mm+" | "+nyyyy+"-"+nmm);
		String temp = TBASENAME+yyyy+mm;  //日志表名称
		boolean has =  false;
	
		try{
			has = hasTable(temp);
		}catch(Exception e){
			log.error("当前操作日志表是否存在判断时发生错误:"+e.getMessage());
			return;
		}
		if(!has){
			try{
				createTable(temp);
			}catch(Exception e){
				log.error("当前操作日志表创建时发生错误:"+e.getMessage());
				return;
			}
		}
		temp = TBASENAME+nyyyy+nmm;
		has =  false;
		try{
			has =  hasTable(temp);
		}catch(Exception e){
			log.error("待用日志表是否存在判断时发生错误:"+e.getMessage());
			return;
		}
		if(!has){
			try{
				createTable(temp);
			}catch(Exception e){
				log.error("待用日志表创建时发生错误:"+e.getMessage());
				return;
			}
		}
		
		log.info("日志表检查及创建结束");
	}
	
	public boolean hasTable(String table) throws Exception{

		Class.forName("com.mysql.jdbc.Driver");
        //2. 获得数据库连接
    Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
		boolean state = false;
		DatabaseMetaData meta = conn.getMetaData();
		ResultSet set;
		set = meta.getTables(null, null, table.toLowerCase(), null);
		while (set.next()) {
			state = true;
			break;
		}
		Statement stmt = null;
		try{
			stmt = conn.createStatement();
		}catch(Exception e){
			log.error("检查日志表是否存在时发生错误:"+e.getMessage());
			throw e;
		}finally{
			if(stmt!=null)
				try {
					stmt.close();
				} catch (Exception e) {
					//e.printStackTrace();
				}
		}
		conn.close();
		return state;
	}
	public void createTable(String table)throws Exception{
		try{
		Class.forName("com.mysql.jdbc.Driver");
	        //2. 获得数据库连接
	    Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
		String sql = "create table "+table+createsql;
		Statement stmt = null;
		stmt = conn.createStatement();
		stmt.execute(sql);
		}catch(Exception e){
			log.error("初始化日志表时发生错误:"+e.getMessage());
			throw e;
		}
	}
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值