簡體   English   中英

具有異步連接的Java中的Getter方法需要延遲

[英]Getter methods in java with asynchronous connection needing a delay

我正在通過MySQL異步進行一系列連接,並且我有一個類,其中包含一堆易於訪問的靜態方法來更新/刪除/清除/獲取/等數據。

我面臨的問題是,getter方法將不會返回正確的值(實際上是),因為它們在異步連接有機會更新要返回的值之前返回。

例:

public static int getSomething(final UUID user)
{
    Connection c = StatsMain.getInstance().getSQL().getConnection();


    PreparedStatement ps;

    try
    {
        ps = c.prepareStatement("select something from stats where uuid=?");
        ps.setString(1, user.toString());

        ResultSet result = ps.executeQuery();
        return result.getInt("something");
    }
    catch (SQLException e)
    {
        return false;
    }
}

(不復制和粘貼,但非常接近)

我意識到我可以通過將接口傳遞給方法並執行此操作來使用“回調”效果,但是當數據庫為鍵存儲10個值時,這將變得非常繁瑣。

聽起來您正在尋找Java 6或CompletableFuture之后的 Future ,這是Java 8中的新增功能

解決方案1:

我想出的最好的方法是在其中包含一個帶有循環的線程,該線程等待MySQL返回值並響應每個值。 這很像get例程中的回調,但是只有一個循環。 當然,循環必須知道如何處理每個可能返回的數據。

這意味着需要重新考慮程序的工作方式。 取而代之的是:您有兩個完全獨立的操作,而不是提出問題,獲取答案,使用答案 首先是: 問一個問題,然后忘掉它 第二個是: 得到答案,然后, 對該問題一無所知,請使用答案 這是完全不同的方法,在使用它之前,您需要先做好准備。

(這種方法的另一個可能的優點是MySQL端現在可以發送數據而無需提示。您可以選擇將另一個用戶所做的更改實時地提供給您的用戶。)

解決方案2:

我的其他解決方案在某些方面更簡單,但是它可以讓您解雇大量線程。 只需讓您的getSomething方法塊,直到得到答案並返回即可。 為了防止程序掛起,只需將調用該方法的整個代碼塊放在其自己的線程中。

混合型:

您可以同時使用兩種解決方案。 第一個使代碼更簡潔,但是第二個讓您在收到答復時回答特定的問題。 (如果您從數據庫中獲得“客戶名稱”,並且可以輸入十二個字段,則可能會有助於知道您確實要求該字段, 並且因為用戶按下了一個按鈕而要求輸入屏幕上特定文本框中的值。)

最后:

通過使用InvokeLater將所有對數據結構的更改放在EventQueue上,可以避免很多多線程頭痛。 這樣可以很好地限制同步問題。 (另一方面,如果您想過着危險的生活,一次擁有20或30個線程可以充分利用計算機的所有核心。)

您可能希望堅持使用同步調用,但是如果您想使用異步調用,這就是我要做的。 一旦編寫了一些基本工具並讓您的大腦停止同步思考,這還不錯。

暫無
暫無

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

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