Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在Spring事务中并行这些查询时,如何使用相同的连接?_Java_Spring_Spring Jdbc_Spring Transactions_Spring 4 - Fatal编程技术网

Java 在Spring事务中并行这些查询时,如何使用相同的连接?

Java 在Spring事务中并行这些查询时,如何使用相同的连接?,java,spring,spring-jdbc,spring-transactions,spring-4,Java,Spring,Spring Jdbc,Spring Transactions,Spring 4,我们使用在Java8下运行的Spring4.1.6(MVC、TM和JDBC)来处理Oracle 12c数据库。假设现在这是一个个人数据库 我有一个无状态@Service(称为PersonService),带有@Transactional方法(称为searchPersons()),目前以以下方式使用几个注入的无状态@Repository DAO: 启动事务上下文(隐式),确保后续操作都使用相同的连接,从而使用相同的Oracle会话 清除临时人员ID中的所有记录全局临时表(每个Oracle会话有一个

我们使用在Java8下运行的Spring4.1.6(MVC、TM和JDBC)来处理Oracle 12c数据库。假设现在这是一个个人数据库

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

  • 启动事务上下文(隐式),确保后续操作都使用相同的连接,从而使用相同的Oracle会话
  • 清除临时人员ID中的所有记录全局临时表(每个Oracle会话有一个临时表)
  • 查询#1(使用某些给定的搜索条件)只搜索所需人员的ID,然后将这些ID存储在临时人员ID中。可能有多达10000个。这是本“交易”中唯一的书写
  • 查询#2,加入PERSONS#u CORE表,获取临时PERSON#u ID中所有人员的核心信息
  • 查询#3,加入PERSON_ADDRESSES表,以获取临时PERSON_ID中所有人员的地址(每个人可能有多个)
  • 执行查询#4,加入PERSON_VEHICLES表,以获取临时PERSON_ID中所有人员的车辆(可能每人多辆)
  • 执行查询#5,加入个人银行账户表,以获取临时个人ID中所有个人的银行账户(每个人可能有多个)
  • 执行查询#6#15同样地,其中每个查询将临时人员ID与不同的表连接起来,以返回非常不同的人员相关域对象集合
  • 以对应用程序有用的方式将各种与人员相关的域对象集合扔到一起,并返回它们
  • 在单线程形式中,这一切都非常好——只需15个查询,我就可以在几十个表中获得数百个属性,而不管原始查询返回多少人

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

    然而,挑战在于,如果我将给定DAO的工作委托给另一个线程,DAO(由JDBCTemplate支持,由数据源支持)将不会使用存储在Spring TM的ThreadLocal字典中的连接。因此它会看到一个不同的会话,使用错误的TEMP_PERSON_id表

    我想,我想要的是在searchPersons()方法中按需创建各种DAO,由在searchPersons()事务上下文中使用相同连接的SingleConnectionDataSource对象支持。然后,我将围绕可以提交给执行者的DAO调用构建未来


    问题:有没有一种优雅的方式在春天做到这一点?或者我必须放弃Springbean初始化并手动构造这些DAO,确保注入它们的所有依赖项(jdbcTemplates等)?

    Hi,已经解决了吗?我也有同样的问题。