我对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链接到它,并每分钟将它们传递到数据库。
但我觉得必须有更好的解决方案,我只是想不出任何事情......
如果有人可以指导我一个好的方法或给我一个例子?将非常赞赏!提前谢谢!
我希望我的问题不会太吵闹。
答案 0 :(得分:2)
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.
}
}
只需确保您的连接只进行一次。