簡體   English   中英

試圖用Java設計數據庫。 到目前為止,我有一個可序列化的對象,可以在需要時讀取和更新。 好主意還是壞主意?

[英]Trying to design a database in Java. So far I have a serializable object which I read and update when I need to. Good or bad idea?

因此,部分出於對SQL語法的沮喪,我決定嘗試實現自己的數據庫。 我不需要執行非常復雜的操作-只需要執行行查找和添加新行。 我有兩個數據結構, UserCircle 然后將它們放入Java的List中,最終的Database對象如下所示(請注意,它implements Serializable ):

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從文件中“獲取”對象。 我也有一個extends ThreadDatabaseHelper類。 該類相當長,但簡單來說,它將Database對象初始化為靜態變量。 我的問題不是關於我遇到的特定問題,實際上,我已經確認我的代碼可以按預期工作。 當程序退出甚至失敗時,數據庫將被永久保存。 我還能夠調出許多客戶端,這些客戶端都具有與數據庫的獨立連接,但也能夠看到彼此的提交。

我遇到的問題與設計有關。 每當我打開一個線程時,就會讀取整個數據庫(僅在進行提交后才會更新)。 例如,當您需要進行行查找時,企業數據庫如何工作? 整個表是否從文件讀入內存?

對於cs.stackexchange.com,這可能是一個更好的問題,但是任何指導都值得贊賞。

數據庫中的常見方法是使用內存映射文件。 這為您提供了將所有數據幾乎立即存儲在內存中的便利,而不必等待數據實際加載。

在Java中,這意味着將文件映射到堆外,並根據需要將數據帶到堆上。 一旦將數據寫出堆,它將由OS異步保存。

我有一個SharedHashMap,它設計用於無GC的序列化,跨進程/線程的並發訪問和延遲持久性。 使用內存映射文件意味着您可以通過觸摸/讀取很少的頁面來讀取鍵/值,而其余數據則不需要存儲在內存中。

自己實現數據庫不是一個好主意,因為即使是基本的分組/映射減少功能也將花費您很多時間,您肯定會更願意花在要開發的業務邏輯上。

Java為輕松訪問數據提供了許多可能性。 當然,最先進的是JPA(Java持久性API;一種正式的通用API,用於訪問幾乎任何數據庫系統而無需編寫原始SQL查詢)和Hibernate。

您可能要使用其中一種,因為它們完全實現了您想要的(對象序列化/水化),快速,可靠並且在后台使用標准RDBMS。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM