入库模块修改
版本一
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处的不同。
个人感觉方法二天数判断更优,方法一天数获得更优。