spring线程处理事物

如果能帮到你麻烦帮顶一下,谢谢!

菜鸟一枚,今天整理一下最近心得!

在spring中,线程是不受容器管理的(百度上看的资料,我也不懂),所以当需要在线程中处理数据的时候事物怎么操作呢?

亲测在线程中注解失效,spring中的注解注入都为空!

最近做了一个功能,上传一个txt文件,文件上传后在后台自动处理文件(提取txt文件中的内容),同时前端可以看到处理状态(正在处理、处理成功、处理失败)。此处用到了线程。

在线程中,由于线程不受spring管理,所以我在线程里注入mapper这些东西都得不到,怎么办呢?

构造器传参,或者是get、set传值

现在在线程里能操作数据了,但另一个问题来了,事物失效!

百思不得骑姐

--------------------------------------------------------------------------------------------------------------------------------------

问了大神,大神给了思路,不要用同一个数据库连接!不要用同一个数据库连接!不要用同一个数据库连接!

可我的注入又不能用,想从新连接也不会!

然后自己写了一个笨办法:在线程里采用JDBC连接

class MyThread extends Thread{

Connection conn = DBUtil.getConnection();//自己封装的jdbc连接

try {

String sql = "sql原生语句";

PreparedStatement ps =  conn.prepareStatement(sql);

conn.setAutoCommit(false);//开启事物

while (

ps.setString(1,"要处理的数据");

ps.addBatch();

)

conn.commit();//处理完毕后提交

} catch (Exception e) {

//异常时回滚

conn.rollback();

} finaly {

DBUtil.close(conn);

}

}


或者是这么写,这样的话就受spring管理了,不需要写JDBC了。

public void run() {
// TODO Auto-generated method stub
        //获取spring容器对象
        ClassPathXmlApplicationContext contextLoader = new ClassPathXmlApplicationContext(
                new String[] { "classpath:/applicationContext.xml", "classpath:/context-dispatcher.xml"});
        //获取事务控制管理器
DataSourceTransactionManager transactionManager =
(DataSourceTransactionManager) contextLoader.getBean("transactionManager");
        //定义事务
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //事物隔离级别
TransactionStatus status = transactionManager.getTransaction(def); //获得事务状态
try {
dealFile(this.getResp(),this.getRequest(), this.getFilePath(), this.getUuid());
transactionManager.commit(status);
} catch (Exception e) {
// TODO Auto-generated catch block
transactionManager.rollback(status);

}


第二种方法完全不管用,请注意。

大概就是这么写的。

还请大神指点此处rollback存在的意义,因为我发现没有rollback也不影响!

如果大家有什么更好的方法请指点。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值