如果能帮到你麻烦帮顶一下,谢谢!
菜鸟一枚,今天整理一下最近心得!
在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也不影响!
如果大家有什么更好的方法请指点。