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

时间:2011-06-06 13:26:29

标签: 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列中的数字可能存在于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");
}

上面的例子是一个非常简单的伪代码。实际问题会让我复杂得多。

7 个答案:

答案 0 :(得分:2)

直到问题更清楚...... 处理已存储在数据库中的大量数据让我给你一个建议:无论你想在这里做什么,考虑用SQL而不是Java来解决它。或者至少用结果ResultSet编写一个SQL,之后很容易在Java中进行评估。

但直到问题不明确......

答案 1 :(得分:1)

您是否在尝试查找A值相同但B值不同的条目?

SELECT t1.a, t1.b, t2.b 
FROM MyTable t1, MyTable t2 
WHERE t1.a = t2.b AND t1.b <> t2.b

答案 2 :(得分:0)

如果您担心堆空间不足,可以尝试使用ehcache之类的持久缓存。我建议您在进入此解决方案之前检查实际内存消耗

答案 3 :(得分:0)

似乎您的问题仅限于一个非常小的域 - 为什么无法实例化bool的二维数组,并且只要两个数字的索引创建一个不受支持的组合,就将其设置为true。 / p>

使用示例:

if (forbiden[10][11] || forbiden[11][10]) 
{
   throw new Exception("pairs of '10' and '11' are not allowed");
}

您可以通过遍历数据并设置此数组,从数据库中实例化此数组。您只需将0010翻译为10即可。您将在索引0-9中获得垃圾,但您可以通过从9中减去索引来“翻译”索引来消除它。

这会影响你的问题吗?

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

澄清问题: 您有一个表,其中包含两个数字,每个记录被声明为“不兼容”。 您有一个用户的数字列表,并且您想要检查此列表是否包含“不兼容的数字”。正确?

在这里,您将使用一个简单的SQL(以评论为例):

SELECT *
FROM   incompatible
WHERE  A IN (1, 14, 67) AND B IN (1, 14, 67);

此SQL返回所有不兼容性。当结果集为空时,没有不兼容性,一切都很好。如果您只想检索此事实,则可以改为编写SELECT 1 ...。 当然,必须动态构建SQL以包含IN子句中的用户编号。

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

答案 6 :(得分:0)

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

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

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