小编r4j*_*j1v的帖子

在多线程Web应用程序中访问请求范围的bean

场景:我们有一个在Websphere中运行的Spring托管Web应用程序.(Spring 3.0.x,WAS 7)webapp通过Spring WorkManagerTaskExecutor(配置线程池大小为10)利用Websphere的工作管理器来执行计算密集型数据库读取操作.所以基本上,一个请求来生成,比方说,生成10个不同的文档.要生成文档,只需要db读取来收集/处理数据.因此,我们基本上产生10个线程来处理10个文档,最后收集10个工作者返回的10个文档并合并它们并向客户端写回一个大响应.我们确定的是,当10个线程正在收集/处理数据时,会产生大量类似的数据库调用.所以我们想出的是围绕最常执行的db方法创建一个Aspect来缓存响应.方面配置为单例,方面使用的缓存自动连接到方面,并将范围设置为请求范围,以便每个请求都有自己的缓存.

问题:现在这个方法的问题是,当线程正在进行数据库调用而Aspect是interjects时,我们会遇到java.lang.IllegalStateException: No thread-bound request found异常.我理解的是完全有效的,因为线程正在请求上下文之外执行.

有没有办法绕过这个问题?是否可以将带有请求范围缓存的方面应用于这些线程调用的方法?

java spring multithreading

8
推荐指数
1
解决办法
1万
查看次数

Spark与众不同,然后加入给定IndexOutOfBoundsException

试图联接两个数据帧A和B。B在联接之前有一个独特的操作。同样,B中的一列与A中的两列相连。这种特定情况给出了IndexOutOfBoundsException。有人遇到过这种情况吗?

详细信息如下。提前致谢!

环境:

spark-shell standalone mode
Spark version 2.3.1
Run Code Online (Sandbox Code Playgroud)

码:

val df1 = Seq((1, "one", "one"), (2, "two", "two")).toDF("key1", "val11", "val12")
val df2 = Seq(("one", "first"), ("one", "first"), ("two", "second")).toDF("key2", "val2")
val df3 = df2.distinct
val df4 = df1.join(df3, col("val11") === col("key2") and col("val12") === col("key2"))
df4.show(false)
Run Code Online (Sandbox Code Playgroud)

例外:

java.lang.IndexOutOfBoundsException: -1
  at scala.collection.LinearSeqOptimized$class.apply(LinearSeqOptimized.scala:65)
  at scala.collection.immutable.List.apply(List.scala:84)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements$$anonfun$reorder$1.apply(EnsureRequirements.scala:233)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements$$anonfun$reorder$1.apply(EnsureRequirements.scala:231)
  at scala.collection.mutable.ResizableArray$class.foreach(ResizableArray.scala:59)
  at scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements.reorder(EnsureRequirements.scala:231)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements.org$apache$spark$sql$execution$exchange$EnsureRequirements$$reorderJoinKeys(EnsureRequirements.scala:255)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements$$anonfun$org$apache$spark$sql$execution$exchange$EnsureRequirements$$reorderJoinPredicates$1.applyOrElse(EnsureRequirements.scala:277)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements$$anonfun$org$apache$spark$sql$execution$exchange$EnsureRequirements$$reorderJoinPredicates$1.applyOrElse(EnsureRequirements.scala:273)
  at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289)
  at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformUp$1.apply(TreeNode.scala:289)
  at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
  at org.apache.spark.sql.catalyst.trees.TreeNode.transformUp(TreeNode.scala:288)
  at org.apache.spark.sql.execution.exchange.EnsureRequirements.org$apache$spark$sql$execution$exchange$EnsureRequirements$$reorderJoinPredicates(EnsureRequirements.scala:273) …
Run Code Online (Sandbox Code Playgroud)

scala indexoutofboundsexception apache-spark

5
推荐指数
1
解决办法
229
查看次数