更快地使用String数组中的数据?

时间:2011-01-14 13:51:00

标签: java mysql loops

目前,我有一个表格可供阅读:

        ps = con.prepareStatement("SELECT * FROM testrow;");
        rs = ps.executeQuery();
        rs.next();
        String[] skills = rs.getString("skills").split(";");
        String[] skillInfo;
        for (int i = 0; i < skills.length; i++) {
            skillInfo = skills[i].split(",");
            newid.add(Integer.parseInt(skillInfo[0]));
            newspamt.add(Byte.parseByte(skillInfo[1]));
            mastery.add(Byte.parseByte(skillInfo[2]));
        }
        rs.close();
        ps.close();

使用StringBuilder将信息保存到数据库中,以形成需要存储的所有数字的字符串,格式为number1,number2,number3;

我编写了一个测试项目,看看这个方法是否比使用MySQL的批处理方法更快,并且它比MySQL大约3秒钟。我现在面临的唯一问题是,当我去阅读信息时,MySQL在几毫秒内完成工作,其中使用String []调用信息以“;”分割数据。字符,然后还使用String []通过“,”字符在循环内拆分信息,大约需要3到5秒。

无论如何,我可以减少使用String []或其他方法加载数据所需的时间吗?

7 个答案:

答案 0 :(得分:3)

不要将序列化数组存储在数据库字段中。使用3NF

答案 1 :(得分:1)

  

格式为number1,number2,number3

考虑规范化表格,每行给出一个数字。

答案 2 :(得分:1)

您是否比撰写信息更频繁地阅读信息?如果是这样(最有可能)那么优化写入似乎强调操作的错误结束。为什么不将信息存储在单独的列中,从而避免拆分(即规范化您的数据)?

如果你不能这样做,你可以在一个线程中加载数据,然后交给另一个线程来分割/存储信息。即你在一个线程中读取数据,并且对于每一行,将它传递给(例如)一个BlockingQueue到另一个分裂/存储的线程。

答案 3 :(得分:1)

String.split为其算法使用正则表达式。我不是它的实现方式,但是机会很重要。尝试使用char值而不是正则表达式来实现自己的split方法。

答案 4 :(得分:0)

插入时删除索引,这会使它更快。

当然,这只是批量加载的选项,而不是每秒500次的交易。

答案 5 :(得分:0)

最明显的替代方法是使用包含行和列的单独技能表,而不是单个连续值字段。我知道如果你已经有数据需要迁移,这看起来是一个很大的变化,但由于这么多原因值得努力。

答案 6 :(得分:-1)

我建议您使用预编译的正则表达式,而不是使用split方法,尤其是在循环中。