不需要 JDBC 的 Java 嵌入式数据库

Posted

技术标签:

【中文标题】不需要 JDBC 的 Java 嵌入式数据库【英文标题】:Java embedded DB which does not require JDBC 【发布时间】:2010-09-13 20:59:51 【问题描述】:

我有以下要求:

    在磁盘上保留用户列表以供将来加载。每个用户可能有 3 或 4 个属性。数十到数百个用户是典型的,必须支持数千个用户(不需要支持超过 10,000 个)。 在磁盘上保留记录列表以供将来加载。每条记录可能有十几个属性。通常会有 0 到 10 条记录,但必须支持低至数千条记录(以处理由于网络中断等原因导致一段时间内未处理记录的情况)。李>

用户通常是成批编写的,然后定期搜索以找到具有给定属性的用户(例如,通过提供的密码对用户进行身份验证)。

记录是间歇性写入和间歇性读取的(后者由周期性任务在删除记录之前处理和传输它们)。

我面临以下限制:

    这是一款仅支持 Java 1.1.8/1.2.x 子集的嵌入式设备。包含的软件包如下: java.lang java.io java.util java.net java.lang.reflect java.util.zip java.math java.text java.security 这些设备的资源相当有限(例如,大约 20 MB RAM,具体取决于设备),因此如果可行,最好将这些资源存储在磁盘上而不是内存中。 我们限制了对设备的访问,我们的应用程序被放置在它自己的沙箱中,这使得完整的数据库安装不可行。我们的沙盒中确实有磁盘访问权限。 只有单个应用程序需要访问此信息并且访问可以同步,这意味着线程安全/并发访问不是必需的。

我们有一个类似于我正在开发的应用程序,但用于不同的设备,它使用专有文本格式作为用户名(例如哈希分隔)和一个 ObjectOutputStream 作为记录。

我看到当前实现的缺点:

整个文件是作为一个整体读取或写入的,这意味着要么必须经常读取文件,要么必须保留数据的内存副本,并且只有在数据发生更改时才将其写回磁盘。当与当前应用程序一样选择后一种选择时,这意味着内存使用量可以根据数据的大小无限增长。 当前的两种格式都是专有的,前者容易产生不良数据(当用户名中包含哈希时会发生什么?),而后者不可读(或无法通过常用工具查询)。

这似乎是一个简单的基于文件的嵌入式数据库的理想选择,例如derby 或 sqlite。然而,从我目前的研究来看,似乎大多数选项都涉及 JDBC 驱动程序,我没有可用的(java.sql.* 未在此设备上实现)。

有人知道一个适合的现有项目吗?

【问题讨论】:

【参考方案1】:

您可能会看一下JDBM,它是一个非常简单的纯 Java 键值存储。如果您需要查找其他属性,您可能需要为反向索引创建一些额外的表。

它比较老,所以它很可能支持java2之前的平台。

【讨论】:

这看起来很有希望——谢谢。我会接受它,直到我找到它不起作用的原因或出现更好的东西。 不幸的是,每当我在设备环境中使用 (get|set)NamedObject 方法时(例如,在运行 FruitBasket 示例时),我都会收到 NullPointerException。它在我机器上的 JDK 上运行良好。我已经在源代码中浏览了一下,但没有明显的发现。我想我要放弃了,暂时把一切都记在心里。我选择了这个答案,因为它是我找到的最接近我想要的答案。【参考方案2】:

专有或 GPL:

http://www.firstsql.com/prem320.html

http://zoduna.com/products/products.html

http://www.mcobject.com/j2me_database/

【讨论】:

【参考方案3】:

你试过db4o吗?它是一个嵌入式对象数据库。它在 java 1.1 上运行,不需要 jdbc。

【讨论】:

谢谢。我想我将从 JDBM 开始,因为它是免费的(GPL 对我们来说不是一个选项),但这看起来也很合理。

以上是关于不需要 JDBC 的 Java 嵌入式数据库的主要内容,如果未能解决你的问题,请参考以下文章

将 JDBC 连接池与嵌入式数据库一起使用有啥好处?

如何使用嵌入的 JPA 和 JavaDB 从 Java 代码创建数据库表?

带有 Sybase 方言的 JDBC 嵌入式数据库

安全的 Java 应用程序数据库

测试通过 Mule JDBC 传输到嵌入式 HSQLDB 的插入,后续查询不返回任何结果

Hive 通过 Jdbc 连接 HiveServer2