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

标签 java database embedded-database

我有以下要求:

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

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

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

我面临以下限制:

  1. 这是一个嵌入式设备,只支持 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
  2. 这些设备的资源相当有限(例如,大约 20 MB RAM,具体取决于设备),因此如果可行的话,最好将它们存储在磁盘上而不是内存中。
  3. 我们对设备的访问权限有限,我们的应用程序被放置在它自己的沙箱中,这使得成熟的数据库安装变得不可行。我们在沙盒中确实可以访问磁盘。
  4. 只有单个应用程序需要访问此信息并且访问可以同步,这意味着线程安全/并发访问不一定是必需的。

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

我认为当前实现的缺点:

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

这似乎是一个简单的基于文件的嵌入式数据库是理想的情况,例如derbysqlite .然而,根据我迄今为止的研究,似乎大多数选项都涉及 JDBC 驱动程序,我没有这些驱动程序(java.sql.* 未在此设备上实现)。

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

最佳答案

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

它比较老,所以它可能会支持 pre-java2 平台。

关于不需要 JDBC 的 Java 嵌入式数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3704377/

相关文章:

rdbms - 嵌入式nosql开源java数据库

android - GreenDao无法设置数据库

java - Maven 中的嵌入式内存数据库

java - 使用Java复制流(模拟telnet)时出现严重的内存泄漏

java - Scala 中的 Jenetics HelloWorld

使用 CakePHP 2.0 进行数据库测试

MySQL/MariaDB 存储过程语法错误故障排除

mongodb - mongodb可以作为嵌入式数据库使用吗?

java - 如何以编程方式设置 imageView 的高度?

java - Lucene 按数值搜索