目前,我有一个表格可供阅读:
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 []或其他方法加载数据所需的时间吗?
答案 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方法,尤其是在循环中。