簡體   English   中英

如何有效地存儲臨時用戶數據

[英]How to efficiently store temporary userdata

我是Java的新手,我需要一些幫助。 是否有(有效)解決以下問題的方法:

我有一個機器人,玩家可以在其中“滾動”獲得金幣。 現在,每滾動一遍,數據庫就會使用用戶擁有的更新硬幣數量進行編輯...但這會給性能造成巨大損失。

我需要的:

User A rolls and wins 10 coins
User B rolls and wins 20 coins
User A rolls and loses 20 coins
User C rolls and wins 30 coins
User A rolls and wins 10 coins
--1 minute has ended--
--update database--

我現在所擁有的:

User A rolls and wins 10 coins
--update database--
User B rolls and wins 20 coins
--update database--
User A rolls and loses 20 coins
--update database--
User C rolls and wins 30 coins
--update database--
User A rolls and wins 10 coins
--update database--

是否有存儲臨時用戶數據的好方法? 我正在考慮每次新用戶滾動時都使用用戶名創建一個新的String,並使用更新后的值將int鏈接到它,並每分鍾將它們傳遞到數據庫中。

但是我覺得必須有很多更好的解決方案,我什么都沒想到。

如果有人可以指導我采取一個好的方法或舉一個例子? 不勝感激! 提前致謝!

我希望我的問題不會太笨拙。

http://www.javaworld.com/article/2075440/core-java/develop-a-generic-caching-service-to-improve-performance.html

https://commons.apache.org/proper/commons-jcs/您可以使用文件讀/寫來臨時保存數據,(僅建議)希望如此,它可能會有所幫助!

創建一個列表,您可以在其中臨時存儲數據,並且當列表的大小超過特定閾值時,然后更新數據庫。

考慮將字符串發送給函數

List<String> userEvents = new ArrayList<String>();
private final int THRESHOLD = 10;

public void saveDataToDB(String event) {
    userEvents.add(event);
    if( userEvents.size() > THRESHOLD ) {
        boolean status DBSaver.save(userEvents);
        if( status ) {
            userEvents.clear();
        } else {
            //error condition... Handle it
        }
    }
}

現在,DBSaver將是具有靜態連接對象的單例類,該類將被重用。

您可以創建一個本地緩存,其中包含每個用戶會話的數據。 在會話結束時,更新數據庫中的用戶數據。 為了實現緩存,您可以使用HashMap 密鑰將是您的用戶,值將是用戶的對象或硬幣數量。 這是您得到的:

User A rolls and wins 10 coins
User B rolls and wins 20 coins
User A rolls and loses 20 coins
User C rolls and wins 30 coins
User A rolls and wins 10 coins
--User A stops playing--
--update database for user A--
User C rolls and wins 30 coins
User B rolls and wins 20 coins
User C rolls and wins 10 coins
User B rolls and wins 10 coins      
--User B stops playing--
--update database for user B--

這是一個簡短的實現:

public class Game
{
    private static Map<String, int> users = new ConcurrentHashMap<String, int>();

    public void endGame(Sring user) {

        //do something for user
        updateDatabase(user, users.get(user));

    }
    public void roll(String user) {
        //roll implementation
    }

    private void updateDatabase(String user, int numberOfCoins) {

        //update database for user here.
    }
}

只要確保您的連接僅建立一次即可。

暫無
暫無

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

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