Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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中对从数据库检索到的少量数据集执行联接操作。(上下文:web应用程序)_Java_Sql_Join_Jakarta Ee - Fatal编程技术网

在Java中对从数据库检索到的少量数据集执行联接操作。(上下文:web应用程序)

在Java中对从数据库检索到的少量数据集执行联接操作。(上下文:web应用程序),java,sql,join,jakarta-ee,Java,Sql,Join,Jakarta Ee,在web应用程序的上下文中,是否适合在Java中对从数据库(从第一次查询)检索到的数据执行一些联接操作,并在第二次也是最后一次查询数据库时使用该“联接”数据来获取所需的数据。 Java是否为此类实现提供了任何内置机制,或者什么可能是最好的实现方式 (我知道,这不是最好的做法,但该数据库不是SQL数据库&不允许连接操作。) 连接操作的数据是:-一个数据集包含大约50个整数(平均值),另一个数据集包含大约150个整数(平均值)。 第一个数据集将只包含整数列表,而第二个数据集将包含整数集列表&一个“数

在web应用程序的上下文中,是否适合在Java中对从数据库(从第一次查询)检索到的数据执行一些联接操作,并在第二次也是最后一次查询数据库时使用该“联接”数据来获取所需的数据。

Java是否为此类实现提供了任何内置机制,或者什么可能是最好的实现方式

(我知道,这不是最好的做法,但该数据库不是SQL数据库&不允许连接操作。)

连接操作的数据是:-一个数据集包含大约50个整数(平均值),另一个数据集包含大约150个整数(平均值)。

第一个数据集将只包含整数列表,而第二个数据集将包含整数集列表&一个“数据整数”。如果两个数据集中的两个整数相交,则在结果列表中传递相应的“数据整数”。因此,结果将包含与相交整数对应的数据整数

例如。 列表A={21,65,93} 列表B={(2142342)、(5373242)、(9332312)}

结果={423422312}

连接操作的两组数据都可以树结构的形式实现。因此,这种连接操作可以更加有效,因为只需要比较树,而不需要比较整个列表 (执行连接时,如果两个(相似深度)节点在树中的某个节点不匹配,则将跳过其所有子节点,控件将移动到下一个顶部节点)


谢谢。

您是在问如何在Java中进行集合交叉吗?根据您对数据的定义——两个数据集,完全是整数——我的建议如下:

Set a=newhashset(第一个数据集中的元素列表) Set b=新HashSet(第二个数据集的元素列表)


集合连接=a.retainal(b);//这就是如何使用java.util.set设置交集的方法。当然,您可以在java中进行快速连接。我只知道反对这样做的三个原因:

  • 这是额外的工作
  • 不匹配的行被不必要地获取
  • 数据量可能太大,无法在内存中处理
如果没有SQL数据库,您就别无选择。因此,假设最简单的情况,即在类似于
a.x=B.x
的条件下连接,您可以通过使用
Set.retainal
计算交点来轻松实现。对于交叉点的每个成员,您需要将第一个表中的所有对应行与第二个表中的所有对应行组合在一起


假设表中没有其他有趣的列,那么就完成了。否则,您需要以某种方式附加它们。如果
x
A
B
中都是唯一的,那么您可以使用映射,否则您需要一个多集(有许多可用的实现,例如在Guava中)。

在Java中连接数据一点也不坏。在某些情况下,它可能比在数据库中进行连接更快、更明智(这取决于许多因素)。特别是如果你别无选择的话:-)

如果您可以从数据库中获得标准jdbc结果集的结果,那么您可以使用智能行集系列:JoinRowSet、FilteredRowSet等。它们从数据库中收集表格数据,然后进行连接和筛选,并在Java端对其进行序列化(有点像ado.net)。标准实现不是标准的一部分,但您可以在com.sun.rowset包中找到它们


如果您只需要进行这种单一连接,那么这可能是一种过分的做法,但是由于您使用的是一些nosql db,您可能需要标准化筛选和连接的方式。

是的,这就像是只进行交叉点。但是第一个数据集将只包含整数列表,而第二个数据集将包含整数集列表&一个“数据整数”。如果两个数据集中的两个整数相交,则在结果列表中传递相应的“数据整数”。因此,结果将包含与相交整数对应的数据整数。例如,列表A={21,65,93}列表B={(2142342),(5373242),(9332312)}结果={423422312}谢谢你!我们有以树的形式进行连接操作的数据集,因此我们甚至可以使用定制的解决方案(通过树比较提高效率),而不是通常用于简单的两个数据列表的标准连接实现。其次,您不认为在高流量web应用程序的上下文中,这可能会导致性能下降吗?我们使用这些结果来获取web应用程序主页的数据。当然,最好的方法是通过测试进行验证,但很难模拟准确的条件,因此我正在寻找专家对此的看法。正如你所说,没有测试是不可能进行验证的。但我的直觉是,在你的应用程序中,原始处理速度不应该是一个问题(我的直觉并不了解你的应用程序)。可能整个连接所花费的时间比处理html模板要少得多。没有理由认为Java在进行散列连接时比数据库慢。非常感谢Maaartinus!我们应该使用标准连接实现,还是应该设计我们自己的定制实现,因为我们的数据集更多地采用树结构(因此有可能生成更高效的算法)。我不太清楚如何使用树结构,但我会保持简单。您可以在几分钟内编写一个简单的连接,如所述。你可以测试它,看看它是否足够快。对于您提到的尺寸(50和150),这不会是一个问题。如果结果很大,它可能会变慢(理论上可能有50*150个元素),但是你对此无能为力。在第一个列表不包含额外数据的情况下,您只创建第二个列表的一个子集,对吗?然后