java - 尝试用Java设计数据库。到目前为止,我有一个可序列化的对象,我可以在需要时读取并更新该对象。好主意还是坏主意?

标签 java database serialization

因此,部分出于对 SQL 语法的失望,我决定尝试实现我自己的数据库。我不需要执行非常复杂的操作 - 只需要进行行查找和添加新行。我有两个数据结构,UserCircle。然后将它们放入 Java 的列表中,最终的数据库对象如下所示(请注意,它实现了可序列化):

public class Database implements Serializable {
    private static final long serialVersionUID = 5790642843089065198L;

    List<User> users; 
    List<Circle> circles;

    public Database() {
        users = new ArrayList<User>();
        circles = new ArrayList<Circle>();
    }

}

每当我更新对象时,我也会使用 ObjectOutputStream 将对象“保存”为文件。每当我从数据库中读取数据时,我都会使用 ObjectInputStream 从文件中“获取”对象。我还有一个DatabaseHelper 类,它扩展了Thread。这个类相当长,但简单地说,它将Database对象初始化为静态变量。我的问题不是关于我遇到的具体问题,事实上,我已经确认我的代码可以按照我的预期工作。当程序退出甚至失败时数据库会被永久保存。我还能够启动许多客户端,它们都与数据库有独立的连接,但也能够看到彼此的提交。

我遇到的问题与设计有关。每当我打开一个线程时,都会读取整个数据库(仅在提交时才会更新)。企业数据库如何工作,比如何时需要进行行查找?整个表是从文件读入内存吗?

对于 cs.stackexchange.com 来说,这可能是一个更好的问题,但我们将不胜感激。

最佳答案

数据库中的常见方法是使用内存映射文件。这使您可以方便地将所有数据几乎立即保存在内存中,而无需等待数据实际加载。

在 Java 中,这意味着将文件映射出堆并根据需要将数据放入堆上。一旦你从堆中写出数据,它就会被操作系统异步保存。

我有一个 SharedHashMap,它是为无 GC 序列化、跨进程/线程并发访问和惰性持久性而设计的。使用内存映射文件意味着您可以通过仅触摸/读取非常少量的页面来读取键/值,其余数据不需要位于内存中。

关于java - 尝试用Java设计数据库。到目前为止,我有一个可序列化的对象,我可以在需要时读取并更新该对象。好主意还是坏主意?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24412761/

相关文章:

java - Android SDK 突然停止工作

android - 如何从服务器获取数据并用它更新数据库?

c++ - 枚举类和 boost 序列化

c++ - 将字符串、整数和 float 序列化为字符数组,以便在没有库的情况下联网

java - Java有 `::`运算符吗?

java - index.html 和 index.jsp 有什么区别?

java - 如何使用 Java 在 Raspberry Pi 3 上访问 BLE?

SQL创建语句接近自动增量的语法不正确

php - 使两个表中的同一列始终具有相同的数据?

c++ - 使用 Asio (Boost) 通过网络发送灵活数量的数据