我有以下要求:
- 在磁盘上保留用户列表以供将来加载。每个用户可能有 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.* 未在此设备上实现)。
有人知道一个很适合的现有项目吗?