在Spring事务中并行化这些查询时如何使用相同的Connection?

时间:2017-02-14 22:39:27

标签: java spring spring-jdbc spring-transactions spring-4

...人

我们正在使用在Java 8下运行的Spring 4.1.6(MVC,TM和JDBC)来对抗Oracle 12c数据库。我们现在说这是一个人的数据库。

我有一个无状态的@Service(称为 PersonService ),带有@Transactional方法(称为 searchPersons()),该方法目前使用了几个注入的无状态@Repository DAO以下方式:

  1. 启动事务上下文(隐式),确保后续操作都使用相同的Connection,因此使用相同的Oracle会话。
  2. 清除TEMP_PERSON_IDS 全局临时表中的所有记录(每个Oracle会话中都有一个记录)。
  3. 执行查询#1 (使用某些给定的搜索条件)只搜索所需人员的ID,并在TEMP_PERSON_IDs中存储这些ID。最高可达10,000。 这是此"事务"。
  4. 中唯一的写作
  5. 查询#2,加入PERSONS_CORE表,获取TEMP_PERSON_IDS中所有人的核心信息。
  6. 查询#3,加入PERSON_ADDRESSES表,获取TEMP_PERSON_IDS中所有人的地址(可能每人多人)。
  7. 查询#4,与PERSON_VEHICLES表联系,以获取TEMP_PERSON_IDS中所有人的车辆(可能每人多人)。
  8. 查询#5,加入PERSON_BANK_ACCOUNTS表,获取TEMP_PERSON_IDS中所有人的银行帐户(可能每人多人)。
  9. 同样执行查询#6 ...#15,其中每个查询都使用不同的表连接TEMP_PERSON_IDS,以返回与人员相关的域对象的非常不同的集合。
  10. 以对应用程序有用的方式将各种与人物相关的域对象集合放在一起,并将它们返回。
  11. 以单线程形式,一切都很好 - 只需15个查询,无论原始查询返回多少人,我都可以在数十个表中获得数百个属性

    但是上面的所有内容都必须尽可能快,而且我希望使用由线程池或类似功能支持的ExecutorService进行多线程查询#2 ..#15,

    但是,挑战在于,如果我将给定DAO的工作委托给另一个线程,DAO(由JDBCTemplate支持,由DataSource支持)将不会使用存储在Spring TM&#39中的Connection。 ; s ThreadLocal字典。所以它看到了一个不同的会话,错误的TEMP_PERSON_IDs表。

    我想要的,我认为,是在searchPersons()方法中按需创建各种DAO,由在SearchPersons()事务上下文中使用相同Connection的SingleConnectionDataSource对象提供支持。然后我将围绕DAO调用构建一个Future,它可以提交给Executor。

    问题:在Spring中有一种优雅的方式吗?或者我是否必须放弃Spring bean初始化并手动构造这些DAO,确保注入所有依赖项(jdbcTemplates等)?

    非常非常感谢您阅读这篇文章。 : - )

    Eryq

0 个答案:

没有答案