在Java中插入和搜索大量数据

在Java中插入和搜索大量数据,java,xml,Java,Xml,我正在用Java编写一个程序,跟踪棒球卡的数据。我正在尝试决定如何持久地存储数据。我一直倾向于将数据存储在XML文件中,但我不熟悉XML API。(我已经阅读了一些在线教程,并开始尝试javax.xml层次结构中的类。) 该软件必须满足以下主要使用情形:用户将能够添加卡和搜索卡 当用户添加卡时,我希望立即将数据提交到持久性存储器。标准API是否允许我以随机访问方式插入数据(甚至可以附加数据) 当用户搜索卡片时(例如,通过玩家的名字),我希望从存储器中加载一个列表,而不必加载整个文件 我最担心的是

我正在用Java编写一个程序,跟踪棒球卡的数据。我正在尝试决定如何持久地存储数据。我一直倾向于将数据存储在XML文件中,但我不熟悉XML API。(我已经阅读了一些在线教程,并开始尝试
javax.xml
层次结构中的类。)

该软件必须满足以下主要使用情形:用户将能够添加卡和搜索卡

当用户添加卡时,我希望立即将数据提交到持久性存储器。标准API是否允许我以随机访问方式插入数据(甚至可以附加数据)

当用户搜索卡片时(例如,通过玩家的名字),我希望从存储器中加载一个列表,而不必加载整个文件

我最担心的是,我需要存储大量独特卡的数据(大约数千张,可能更多)。我不想在程序打开时存储内存中所有卡的列表。我没有运行过任何测试,但我相信我可以很容易地满足内存限制

XML可能不是最好的解决方案。但是,我想让它的安装尽可能简单,所以我试图避免使用JDBC或任何第三方库构建一个完整的数据库


所以我想我是在问我是否朝着正确的方向前进,如果是的话,我可以从哪里了解更多关于以我想要的方式使用XML的信息。如果没有,是否有人对我可以使用哪些其他类型的存储来完成这项任务提出了建议?

虽然我当然不反对使用XML,但在您的上下文中它确实有一些缺点

“标准API是否允许我以随机访问方式插入数据”

是的,在记忆中。不过,您必须将整个模型保存回文件

“当用户搜索卡片时(例如,通过玩家的名字),我想从存储器中加载一个列表,而不必加载整个文件”

除非您希望多个用户读取/写入文件,否则我可能会在加载时将整个文件/模型拉入内存,并将其保留在内存中,直到您想要保存为止(在后台定期写入仍然是一个好主意)

我不想在程序打开时存储内存中所有卡的列表。我没有运行过任何测试,但我相信我可以很容易地达到内存限制

那将是我关心的问题。但是,可以使用SAX解析器将文件读入自定义模型。这将减少内存开销(因为DOM解析器可能有点贪心内存)

“但是,我想使它的安装尽可能简单,因此我试图避免使用JDBC实现全面的数据库”

我会在这方面做更多的研究。我(个人)使用和大量存储大量数据。这些是小型的个人数据库系统,不需要任何额外的安装(链接到程序的Jar文件)或特殊的服务器/服务

它们使得在数据存储中构建复杂的搜索变得非常容易,否则您需要自己创建这些数据存储

如果您使用XML,我可能会做以下三件事之一

1-如果要在内存中维护XML文档,我会熟悉XPath (&)用于搜索

2-我将使用对象创建数据的“模型”来表示各种节点,并使用SAX读取数据。写作可能有点棘手

3-使用一个简单的SQL数据库(和对象模型)-它将简化整个流程(IMHO)

附加的

好像我对你倾吐的还不够;)

如果您真的想要XML(并且,我不会阻止您),您可以考虑查看XML数据库样式解决方案< /P> (显然已退休)

或者你可以看看其他人的想法


例如;)

虽然我当然不反对使用XML,但它在您的上下文中确实有一些缺点

“标准API是否允许我以随机访问方式插入数据”

是的,在记忆中。不过,您必须将整个模型保存回文件

“当用户搜索卡片时(例如,通过玩家的名字),我想从存储器中加载一个列表,而不必加载整个文件”

除非您希望多个用户读取/写入文件,否则我可能会在加载时将整个文件/模型拉入内存,并将其保留在内存中,直到您想要保存为止(在后台定期写入仍然是一个好主意)

我不想在程序打开时存储内存中所有卡的列表。我没有运行过任何测试,但我相信我可以很容易地达到内存限制

那将是我关心的问题。但是,可以使用SAX解析器将文件读入自定义模型。这将减少内存开销(因为DOM解析器可能有点贪心内存)

“但是,我想使它的安装尽可能简单,因此我试图避免使用JDBC实现全面的数据库”

我会在这方面做更多的研究。我(个人)使用和大量存储大量数据。这些是小型的个人数据库系统,不需要任何额外的安装(链接到程序的Jar文件)或特殊的服务器/服务

它们使得在数据存储中构建复杂的搜索变得非常容易,否则您需要自己创建这些数据存储

如果您使用XML,我可能会做以下三件事之一

1-如果要在内存中维护XML文档,我会熟悉XPath (&)用于搜索

2-我将使用对象创建数据的“模型”来表示各种节点,并使用SAX读取数据。写作可能有点棘手

3-使用一个简单的SQL DB(和对象模型)-它将简化整个过程