【问题标题】:How to efficiently store temporary userdata如何有效地存储临时用户数据
【发布时间】:2016-05-03 09:35:25
【问题描述】:

我对 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--

有存储临时用户数据的好方法吗?我正在考虑每次新用户滚动时使用用户名创建一个新字符串,并将一个 int 与更新的值链接到它,然后每分钟将它们传递到数据库中。

但我觉得必须有很多更好的解决方案,我就是想不出任何东西..

如果有人可以指导我一个好的方法或给我一个例子?将不胜感激!提前致谢!

我希望我的问题不是太笨拙..

【问题讨论】:

  • 数据库很快,你可能在做一些低效的事情,比如每次需要更新时都创建一个新连接。
  • @Kayaman 这就是我正在做的事情!我应该只在 main(){} 中打开一次连接还是?
  • 是的,基本上,只要玩家在玩,您就希望保持连接打开。通过这样做,您可以创建播放会话,在会话开始时打开连接并在结束时关闭它。
  • 使用 StringBuffer 或 StringReader。您可以将值附加到它。
  • 是的,请确保您只建立一次连接,如下面的答案所示。

标签: java database sql-update updates


【解决方案1】:

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

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

【讨论】:

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

    【讨论】:

      【解决方案3】:

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

      只需确保您的连接只建立一次即可。

      【讨论】:

      • 我使用了您的答案,现在可以完美运行!非常感谢! :-)
      猜你喜欢
      • 2016-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2015-10-01
      • 2018-03-09
      相关资源
      最近更新 更多