如何有效地存储临时用户数据

时间:2016-05-03 09:35:25

标签: java database sql-update updates

我对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链接到它,并每分钟将它们传递到数据库。

但我觉得必须有更好的解决方案,我只是想不出任何事情......

如果有人可以指导我一个好的方法或给我一个例子?将非常赞赏!提前谢谢!

我希望我的问题不会太吵闹。

3 个答案:

答案 0 :(得分:2)

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

https://commons.apache.org/proper/commons-jcs/ 您可以使用文件读/写来暂时保存数据,(仅建议) 希望,这可能会有所帮助!

答案 1 :(得分:2)

创建一个列表,您可以在其中临时存储数据,当列表大小超过特定阈值时,然后更新数据库。

考虑将字符串发送到函数

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将是一个带有静态连接对象的单例类,可以重复使用。

答案 2 :(得分:1)

您可以创建包含每个用户会话数据的本地缓存。在会话结束时更新数据库中的用户数据。对于缓存的实现,您可以使用 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.
    }
}

只需确保您的连接只进行一次。