JAVA:文件存在与搜索大型 xml db
Posted
技术标签:
【中文标题】JAVA:文件存在与搜索大型 xml db【英文标题】:JAVA : file exists Vs searching large xml db 【发布时间】:2012-02-15 05:53:39 【问题描述】:我是 Java 编程的新手,正在编写我的第一个桌面应用程序,这个应用程序需要一个独特的 isbn 并首先检查它是否已经准备好保存在本地数据库中,如果是,那么它只是从本地读取DB,如果不是,它会从 isbndb.com 请求数据并将其输入 DB,本地 DB 为 XML 格式。现在我想知道的是,以下两种方法中的哪一种在检查条目是否已就绪时会产生最少的开销。
方法 1.) 文件存在。
在创建所述数据库条目时,应用程序将为每个名为 isbn number.xml(即 3846504937540.xml)的 isbn 编号创建一个单独的文件,并且在检查时将使用文件存在方法来检查是否存在所有准备好的条目,使用用户提供的 isbn 。
方法 2.) SAX XML 解析器。
所有条目都将输入到一个大型 XML 文件中,当检查现有条目时,SAX XML 解析器将用于解析文件,然后将根据 XML DB 中的条目检查用户提供的 isbn 是否匹配。
注意: 随着时间的推移,生成的条目可能会达到数千个。
任何信息将不胜感激。
【问题讨论】:
你不能使用 db 和 where clausule 来检查记录是否存在? 【参考方案1】:我认为你的任何一种方法都不是那么好。我强烈建议使用 DBMS 来存储数据。如果您的系统上没有 DBMS,或者如果您想要一个可以在没有安装 DBMS 的系统上运行的应用程序,请查看使用 SQLite。您可以在 Java 中通过 David Crawshaw 的 SQLiteJDBC 使用它。
就你的两种方法而言,第一种会产生大量的文件混乱,更不用说维护和一致性问题了。一旦您拥有大量条目,第二种方法会很慢,因为您基本上必须为每个查询读取(平均)一半的数据库。使用 DBMS,您可以通过为需要快速查找的信息定义索引来避免这种情况。 DBMS 会自动维护索引。
【讨论】:
感谢大家的快速回复,我最初想不使用数据库系统,但现在我确信否则可能会使用嵌入式数据库,可能是 JavaDB (Derby)。 @CourtenayRogers JavaDB/Derby 是一个不错的产品。 SQLite 已经发布了详细的comparison between SQLite and Derby 可能会感兴趣。【参考方案2】:我不太喜欢依赖文件系统来完成该任务的想法:我不知道您的应用程序有多重要,但是这些 xml 文件可能会发生很多事情 :) 另外,如果文件夹获取非常非常大,您需要考虑将这些文件拆分为一些分层文件夹结构,以获得良好的性能。
另一方面,如果您需要经常更新,我不明白为什么要使用 xml 文件作为数据库。
我会使用关系数据库,并在表中为每个条目添加一条新记录,并在 isbn_number 列上添加一个索引。
如果您有数千条记录,您可能会选择sqlite,如果您需要它,您可以用更强大的非嵌入式数据库替换它,无需(或很少:))代码修改.
【讨论】:
【参考方案3】:扩展您的数据库表,使其不仅包括 XML 字符串,还包括 ISBN 号。 然后根据 ISBN 列选择 XML 列。
查询:Java 已转义,"select XMLString from cacheTable where isbn='"+ isbn +"'"
另一种方法是使用 ORM,例如 Hibernate。 在 ORM 中,不是将整个 XML 文档保存在一个列中,而是为每个元素和属性使用不同的不同列,甚至可以将文档拆分到多个表中,以实现更简单的长期设计。
【讨论】:
【参考方案4】:我认为你最好使用 DBMS 而不是你的 2 种方法。
【讨论】:
【参考方案5】:如果您只希望检查存在的开销最小,那么选项 1 可能就是您想要的,因为它是直接查找。每次解析 XML 进行检查都需要您在最坏的情况下遍历整个 XML 文件。虽然您可以使用选项 2 进行缓存,但这比选项 1 更复杂。
不过,使用选项 1,您需要注意在一个目录下可以存储多少文件是有限制的,因此您可能必须将 XML 文件存储在多个层(例如 /xmldb/38/46/ 3846504937540.xml)。
也就是说,从长远来看,这两种选择都不是存储数据的好方法,随着数据的增长,您会发现它们变得非常受限制且难以管理。
人们已经推荐使用 DBMS,我同意。最重要的是,我建议您将 MongoDB 等基于文档的数据库作为您的数据库。
【讨论】:
以上是关于JAVA:文件存在与搜索大型 xml db的主要内容,如果未能解决你的问题,请参考以下文章