数据删除失效问题

利用jdbc进行MySQL数据库操作,我在同一个事务里对表进行删除和插入操作,但是不知道什么原因,数据删除不起作用。

MySQL表:

create table day_info (
    dayInfo date,
	isHoliday  int(1) COMMENT '工作日对应结果为 0, 休息日对应结果为 1, 节假日对应的结果为 2'
);

代码断如下:

            Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(CONNECT_STR[0], CONNECT_STR[1], CONNECT_STR[2]);
			conn.setAutoCommit(false); // 设置手动提交
			int count = 0;
			
			String delete_sql = "delete from day_info where dayInfo = date_format(?,'%y%m%d') ";
			psts = conn.prepareStatement(delete_sql);
			for (Map<String, String> map:resultMapList) {
				psts.setString(1, map.get("day"));
				psts.addBatch(); // 加入批量处理
			}
//			psts.executeBatch(); // 执行批量处理
//			conn.commit(); // 提交
			
			
			String insert_sql = " insert into day_info ( dayInfo, isHoliday ) values ( date_format(?,'%y%m%d'), ? ) ";
			psts = conn.prepareStatement(insert_sql);
			for (Map<String, String> map:resultMapList) {
				psts.setString(1, map.get("day"));
				psts.setString(2, map.get("type"));
				psts.addBatch(); // 加入批量处理
				count++;
			}
			psts.executeBatch(); // 执行批量处理
			conn.commit(); // 提交
			System.out.println("All down : " + count);

多次运行后发现数据有重复,可以确定是删除是失效的。

如果注释掉如下代码,即只进行删除而不插入。

那么数据可以正常删除,具体原因未知。

 

验证一:将代码段中的这两行注释去除,此时可以正常的删除和插入。

但是代码中提示存在内存泄漏,需要关闭一下psts(加一行代码psts.close())

 

问题原因:

psts在此处有两次创建(1.psts = conn.prepareStatement(delete_sql);   2.psts = conn.prepareStatement(insert_sql);)由于第一次创建后SQL没有执行(psts.executeBatch(); ),所以数据没有进行删除,后面重新创建psts后已经覆盖了前面删除相关的SQL,所以最终执行的只有第二次创建出来的psts。即只执行了插入操作。解决方案就是上面验证一的方案,将第一个psts相关语句执行(psts.executeBatch();),事务(conn.commit();)可以提交或者待第二个psts执行完后提交均可。

这也就可以解释为什么验证一中去掉注释的两行代码后编译器为什么会提示内存泄漏了。因为这是完全不一样的两个psts,由于第一个并没有进行关闭,所以会有内存泄漏,需要进行关闭。

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值