Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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更快地检索SQL数据并搜索大型数据_Java_Sql_Hashmap - Fatal编程技术网

使用Java更快地检索SQL数据并搜索大型数据

使用Java更快地检索SQL数据并搜索大型数据,java,sql,hashmap,Java,Sql,Hashmap,我有一个包含超过10万个数据的表,这些数据由数字对组成。其示例如下所示 A B 0010 0010 0010 0011 0010 0019 0010 0056 0011 0010 0011 0011 0011 0019 0011 0040 0019 0010 0019 0058 在这里,A列中的数字在

我有一个包含超过10万个数据的表,这些数据由数字对组成。其示例如下所示

   A          B
   0010     0010 
    0010     0011 
    0010     0019 
    0010     0056
    0011     0010 
    0011     0011 
    0011     0019 
    0011     0040
    0019     0010
    0019     0058 
在这里,A列中的数字在B列中可能存在对。 说明:用户将有几个数字,范围从10到100。现在我们可以看到0010-0011和0019出现了。因此,如果用户有一个包含0010和0011的列表,则会显示一条警告,表示不允许使用该对,反之亦然

如何在Java中实现这一点? 加载包含所有数据的哈希映射似乎不是一个好的选择,尽管搜索速度会快得多

请建议。谢谢

测试用例:

num = 0010;  //value from list which user will be passing
test(num){
if(num.equals("0019")||num.equals("0011")) //compairing with database 
System.out.println("incompatible pair present");
}

上面的示例是一个非常简单的伪代码。实际问题将更加复杂。

如果您担心堆空间不足,可以尝试使用类似的持久缓存。我建议您在使用此解决方案之前检查实际消耗的内存,尽管您是否尝试查找A值相同但B值不同的条目

SELECT t1.a, t1.b, t2.b 
FROM MyTable t1, MyTable t2 
WHERE t1.a = t2.b AND t1.b <> t2.b
选择t1.a、t1.b、t2.b
从MyTable t1到MyTable t2
其中t1.a=t2.b和t1.b=t2.b

似乎您的问题仅限于一个非常小的领域-为什么不能实例化
bool
的二维数组,并在两个数字的索引创建不支持的组合时将其设置为
true

用法示例:

if (forbiden[10][11] || forbiden[11][10]) 
{
   throw new Exception("pairs of '10' and '11' are not allowed");
}
通过对数据进行一次检查并设置此数组,可以从数据库中实例化此数组。您只需将
0010
翻译为
10
。索引0-9中会有垃圾,但可以通过从
9
中减去该索引来“转换”该索引,从而消除垃圾


这符合你的问题吗?

直到问题变得更清楚。。。 处理大量已经存储在数据库中的数据,让我给你一个建议:无论你想在这里做什么,都要考虑用SQL代替java来解决它。或者至少编写一个带有结果集的SQL,该结果集很容易在以后用Java进行计算


但是,除非问题没有那么清楚……

如果我正确理解了你想做什么

t1(a,b)
上创建唯一索引。将用户的新对放入try块内的INSERT语句中。捕获密钥冲突异常(将是一个
SQLException
,可能是一个子类,具体取决于您的RDBMS),并向用户解释这是一个禁止对。

为了澄清问题: 您有一个表,每个记录包含两个声明为“不兼容”的数字。 您有一个号码的用户列表,您想检查此列表是否包含“不兼容号码”。对吧?

下面是一个简单的SQL(以注释为例):

此SQL返回所有不兼容项。当resultset为空时,就没有不兼容,一切正常。如果您只想检索此事实,则可以编写
选择1…
。 当然,SQL必须动态构建,以在子句中包含用户的编号

要加快查询速度,可以在两列上创建(唯一)索引。因此,数据库可以执行索引范围扫描(唯一)。
如果此表尚未包含主键,则应在两列上创建一个主键。

简单-绝对不是可扩展的解决方案-如果范围真的是0000-9999

只需创建一个包含999999个条目的字节表。 每个条目由简单的0表示允许,1表示不允许。 通过逻辑连接两对数字(key=first*1000+second),可以在表中找到一个条目


更具可扩展性的数据库解决方案是创建一个具有复合主键(pair1和pair2)的表,只需存在一个表示不允许的主键对的条目即可。

这个问题很有趣,但请您进一步澄清一下好吗?我很难理解你到底想做什么。关于这个应该做什么的一些测试用例如何?添加的测试用例如何。当用户输入等于“0019”或“0011”时,伪代码就会打印出“不兼容…”。这真的是你想要解决的问题吗?在测试用例中我们在哪里看到这些“对”?我真的不太明白你的问题。似乎问题还不清楚。您的输入和输出是什么?对于10种这样的组合,如果每次我需要访问数据库,响应时间将多得多。所以我想在得到所有的值之后,用java自己来解决这个问题。这就是问题所在:你的问题是关于什么的还不清楚。我认为你不必再次访问数据库进行任何组合,但是…请参阅我在最后一条评论中的解释。我已经创建了一个单独的答案。也许我终于明白你想要什么了?!请参阅我在最后添加的评论中的澄清
SELECT *
FROM   incompatible
WHERE  A IN (1, 14, 67) AND B IN (1, 14, 67);