前一段时间做一个管理学生加分项的项目,使用SSH模式开发,其中一项功能是通过上传Excel表来导入加减分项目,要求要保证学生姓名学号班级必须完全正确且同学期内不能有项目重复~

判断逻辑不是很复杂:

可以看到每次操作会对数据库进行1~3次访问(基本上是3次啦,毕竟会出错和重复的只有少数),并且由于在过程中有很多取值赋值等操作,所以在进行大批量导入时速度会很慢,经过测试在1.2GHz(笔记本开的省电模式测试的)下导入2100条数据花了一分钟时间,感觉实在是太慢。

进过监测发现运行过程中CPU只有一个核心被占满,而其它核心完全没有被使用,怪不得这么慢呢~

 

于是我想了想考虑使用多线程,同时处理多个项目,因为不同项目的判断和查询是可以同时进行的,理论上应该能够提升一些速度,因为以前从没使用过多线程,于是百度了一下,然后想当然的将原来这一套流畅写入线程,接着将从Excel文件中提取的数据表分割成4份分别作为参数传递给每个线程,听起来很科学的样子

可是运行起来就报错了呢,调试了一下发现了原因,线程中的数据库操作对象没有被注入,因为Spring实在项目启动时进行注入的,后来生成新线程自然就注入不了了……

c86f57306057a4577e75a9d8e09c0978(后边来的进不去门)

那可怎么办,苦恼了一会儿终于想通了,门开不了咱就翻窗吧~直接把注入过的对象当作参数传进去不就可以了么~

至此翻窗成功入屋

抛砖引玉,将Spring注入过的对象作为参数传递的确是个挺有用的方法,可以将数据库操作独立到线程或其它类中去,从而简化action类的代码,对于新手来说不失为一个不错的技巧呢~