智能家居数据中心项目第四天修改

入库模块修改

版本一

public void save(Collection<Environment> coll) throws Exception {

		connection = ConnectionFactory.getConnection();
		// 表示当前sql语句数
		int count = 0;
		/*
		 * 记录当前天数,默认为0
		 */
		int day = 0;
		for (Environment environment : coll) {
			/*
			 * 先判断要不要创建新的ps对象。 如果为null或者天数改变,则创建新的对象
			 */
			/*
			 * 注意:Timestamp对象的getDate()方法返回day of month
			 * Timestamp对象的getDay()返回0-6(对应的星期天到星期六)
			 */
			if (day != environment.getGather_date().getDate() && day != 0) {
				// 手动提交前一天的数据
				dealBatch();
				log.info("数据库入库的数据" + count);
				day = environment.getGather_date().getDate();
				log.info("数据库入库的天数:" + day);
				// 根据日期不同,产生不同的sql语句
				String sql = "insert into e_detail_" + day + " values(?,?,?,?,?,?,?,?,?)";
				ps = connection.prepareStatement(sql);
			} else if (ps == null) {
				day = environment.getGather_date().getDate();
				log.info("数据库入库的天数:" + day);
				String sql = "insert into e_detail_" + day + " values(?,?,?,?,?,?,?,?,?)";
				ps = connection.prepareStatement(sql);
			}
			ps.setString(1, environment.getName());
			ps.setString(2, environment.getSrcid());
			ps.setString(3, environment.getDesid());
			ps.setString(4, environment.getSersorAddress());
			ps.setInt(5, environment.getCount());
			ps.setString(6, environment.getCmd());
			ps.setInt(7, environment.getStatus());
			ps.setFloat(8, environment.getData());
			ps.setTimestamp(9, environment.getGather_date());
			// 将sql语句放入到批处理中
			ps.addBatch();
			count++;

			if (count % Integer.parseInt(batchSize) == 0) {
				ps.executeBatch();
			}
		}
		dealBatch();
		// 循环结束提交数据
		log.info("数据库入库的数据" + count);
	}

版本二

public void saveDb(Collection<Environment> coll) throws Exception {
		try {
			log.info("开始连接数据库");
			connection=ConnectionFactory.getConnection();
			log.info("数据库连接成功"+connection+",开始入库");
			int preDay=0;//用来记录上一次插入的表日期(天数)
			int count=0;//缓存的计数
			for (Environment environment : coll) {
				//获取一个日历实例
				Calendar c = Calendar.getInstance(); 
				c.setTime(environment.getGatherDate());
				//将给定的日期按照指定要求转为指定格式
				int day = c.get(Calendar.DAY_OF_MONTH);//此格式为一个月的第几天
				if(day!=preDay) {
					//当前插入的表和上一次插入的表不一致
					//需要先将之前上一张表未达到缓存次数的数据插入数据库,完成批处理
					//?
					if(ps!=null) {
						ps.executeBatch();//在关闭上一个表的对应的ps对象之前需要将上一个ps对象中缓存的数据插入数据库
						ps.close();//关闭ps对象资源
					}
					//将上一次的插入天数改为当前天数
					preDay=day;
					//将缓存次数清0
					count=0;
					String sql="insert into e_detail_"+day+" values(?,?,?,?,?,?,?,?,?)";
					ps=connection.prepareStatement(sql);
				}
				ps.setString(1, environment.getName()); 
				ps.setString(2, environment.getSendId());
				ps.setString(3, environment.getSmId());
				ps.setString(4, environment.getAddress());
				ps.setInt(5, environment.getCount());
				ps.setString(6, environment.getOrdernumber());
				ps.setInt(7, environment.getStatus());
				ps.setFloat(8, environment.getData());
				ps.setTimestamp(9, environment.getGatherDate()); 
				ps.addBatch();
				count++;
				if(count%batchSize==0) {
					ps.executeBatch();
					ps.clearBatch();
				}
				
			}
			//将剩余的缓存数据插入数据库中
			if(count!=0||count%batchSize!=0){
				ps.executeBatch();
			}
			ps.close();
			connection.commit();//提交事务
			log.info("数据入库成功");
		} catch (Exception e) {
			log.info("数据入库失败");
			connection.rollback();//回滚事务
			e.printStackTrace();
		}finally {
			connection.close();
		}
		
	}
	

不同点

版本一:
采用Timestamp类的getDate()方法返回day of month
(Timestamp对象的getDay()返回0-6(对应的星期天到星期六))

判断天数方面:
只声明一个day,直接判断day与Environment中的属性值是否相同,当天数变化,不同时进入,同时判断day是否等于0,杜绝第一次进入。
遇到天数变化,进入if块后,先提交前一天的数据,然后重新new一个ps对象,插入第二天的数据。
把判断第一次进入的ps为空放在if块外面,独立判断ps==null,第一次执行时,必然进入else if代码块,new一个ps对象,插入数据。
循环如此。
版本二:
采用Calendar类。

Calendar c = Calendar.getInstance(); 
				c.setTime(environment.getGatherDate());
				//将给定的日期按照指定要求转为指定格式
				int day = c.get(Calendar.DAY_OF_MONTH);//此格式为一个月的第几天

判断天数方面:
声明了一个day和一个preday。day为从environment中取到的值,preday初始化为0。
判断day与preday值是否相等,不相等则进入if块,在if块中,嵌套判断,ps!=null,当不等于null时,提交缓存数据并关闭ps。
然后new一个ps对象,插入第二天的数据。

如此以来,第一次进入时ps为null直接创建,后续进入时,天数切换时创建新的ps,同样实现。

方法一方法二区别在于判断ps为null处的不同。
个人感觉方法二天数判断更优,方法一天数获得更优。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值