Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在服务器';s使用HashMap重新启动_Java_Spring_Spring Mvc_Spring Boot_Java Threads - Fatal编程技术网

Java 在服务器';s使用HashMap重新启动

Java 在服务器';s使用HashMap重新启动,java,spring,spring-mvc,spring-boot,java-threads,Java,Spring,Spring Mvc,Spring Boot,Java Threads,我刚刚对我编写的后端Spring Boot应用程序进行了一些代码审查,虽然我理解了其中的大部分内容,但我不能只考虑一条注释。即: 应用程序的状态在非线程安全HashMap中持久化,因此在服务器重新启动后没有持久性 代码涉及将数据存储在FakeDatabase中,所以我只创建了数据库接口,并使FakeDatabase实现了数据库。FakeDatabase正在HashMap中存储信息。完整代码如下: @Component public class FakeDatabase implements Da

我刚刚对我编写的后端Spring Boot应用程序进行了一些代码审查,虽然我理解了其中的大部分内容,但我不能只考虑一条注释。即:

应用程序的状态在非线程安全HashMap中持久化,因此在服务器重新启动后没有持久性

代码涉及将数据存储在FakeDatabase中,所以我只创建了数据库接口,并使FakeDatabase实现了数据库。FakeDatabase正在HashMap中存储信息。完整代码如下:

@Component
public class FakeDatabase implements Database {

private HashMap<String, Player> db;

public FakeDatabase() {
    db = new HashMap<>();
}

public void clearDb() {
    db = new HashMap<>();
}

@Override
public Player getPlayer(String username) {
    return db.get(username);
}

@Override
public Player createNewPlayer(String username) {
    db.put(username, PlayerFactory.createPlayer(username));
    return db.get(username);
}

@Override
public void updatePlayer(Player player) {
    db.put(player.getUsername(), player);
}

@Override
public HashMap<String, Player> getDatabase() {
    return db;
}

@Override
public Game getOngoingGame(Player player) {
    return db.get(player.getUsername()).getCurrentGame();
}
@组件
公共类FakeDatabase实现数据库{
私有HashMap数据库;
公共伪造数据库(){
db=新的HashMap();
}
public void clearDb(){
db=新的HashMap();
}
@凌驾
公共播放器getPlayer(字符串用户名){
返回db.get(用户名);
}
@凌驾
公共播放器createNewPlayer(字符串用户名){
db.put(用户名,PlayerFactory.createPlayer(用户名));
返回db.get(用户名);
}
@凌驾
公共无效更新层(玩家){
db.put(player.getUsername(),player);
}
@凌驾
公共HashMap getDatabase(){
返回分贝;
}
@凌驾
公共游戏getOngoingGame(玩家){
返回db.get(player.getUsername()).getCurrentGame();
}
}


简单地将HashMap更改为ConcurrentHashMap可以吗?我想我根本不明白,当数据存储在非线程安全的集合中时,服务器重启后为什么没有持久性?

为什么不问问审阅者?但是,呃,为什么要用hashmap呢?通常我们使用H2作为假数据库。这是我申请的职位的代码审查,这是我收到的反馈。它也不是直接来自评论者,而是通过中间人。是的,我从来没有使用过H2,只是觉得hashmap足以存储简单的“名称,对象”数据。也许这就是你的问题。他们可能想看看您将如何持久化数据,而通过使用非线程安全hashmap而不是标准的JPA层,您犯了一个错误。但是,数据是否仍然保持不变?我的意思是,我确实理解Hashmap不是线程安全的,但它如何连接到服务器的重启?对于JPA和H2数据库,数据不会通过重启而持久化。但是,由于您使用JPA,您只需将H2切换为其他内容(即Hibernate),然后突然,在不更改代码的情况下,数据被持久化。这里的要点是,您可以通过更改配置使其持久化。为什么不问问审阅者呢?但是,呃,为什么要用hashmap呢?通常我们使用H2作为假数据库。这是我申请的职位的代码审查,这是我收到的反馈。它也不是直接来自评论者,而是通过中间人。是的,我从来没有使用过H2,只是觉得hashmap足以存储简单的“名称,对象”数据。也许这就是你的问题。他们可能想看看您将如何持久化数据,而通过使用非线程安全hashmap而不是标准的JPA层,您犯了一个错误。但是,数据是否仍然保持不变?我的意思是,我确实理解Hashmap不是线程安全的,但它如何连接到服务器的重启?对于JPA和H2数据库,数据不会通过重启而持久化。但是,由于您使用JPA,您只需将H2切换为其他内容(即Hibernate),然后突然,在不更改代码的情况下,数据被持久化。这里的要点是,您只需更改配置即可使其持久化。