Skip to content

заметка о памяти

В вашем коде, который использует EJB, пользователи сохраняются в памяти в объекте UserServiceBean. Давайте разберем, как это работает и что это означает для хранения данных.

Как работает UserServiceBean

Вот ваш код для UserServiceBean:

@Stateless
@Remote
public class UserServiceBean implements UserService {
    private Map<Integer, String> users = new HashMap<>();
    private int userIdCounter = 0;

    @Override
    public void addUser(String username) {
        users.put(userIdCounter++, username);
    }

    @Override
    public String getUser(int id) {
        return users.get(id);
    }
}

Объяснение хранения данных

  1. Хранение в памяти:
  2. Данные о пользователях (имя пользователя и его идентификатор) хранятся в объекте users, который является экземпляром HashMap. Это означает, что все добавленные пользователи хранятся в оперативной памяти (RAM) на сервере, где запущен ваш WildFly.
  3. userIdCounter используется для генерации уникальных идентификаторов для каждого пользователя.

  4. Временное хранение:

  5. Данные будут храниться в памяти до тех пор, пока сервер WildFly работает. Если сервер перезапустится или остановится, все данные, хранящиеся в users, будут потеряны, так как они не сохраняются в постоянном хранилище (например, в базе данных).
  6. Это означает, что если вы добавите пользователей, а затем перезапустите сервер, все добавленные пользователи исчезнут.

  7. Состояние бинов:

  8. Ваш UserServiceBean помечен как @Stateless, что означает, что он не сохраняет состояние между вызовами. Каждый раз, когда вы вызываете метод addUser или getUser, вы работаете с новым экземпляром бина, который может иметь свои собственные данные в памяти, но они не сохраняются между вызовами.
  9. Однако, поскольку users и userIdCounter являются полями класса, они будут доступны в рамках одного экземпляра бина, пока этот экземпляр существует.

Как улучшить хранение данных

Если вам нужно, чтобы данные о пользователях сохранялись между перезапусками сервера, вам следует рассмотреть возможность использования базы данных. Вот несколько шагов, которые вы можете предпринять:

  1. Использование JPA (Java Persistence API):
  2. Вы можете использовать JPA для работы с реляционными базами данных. Это позволит вам сохранять данные о пользователях в базе данных, и они будут доступны даже после перезапуска сервера.
  3. Вам нужно будет создать сущность (entity) для пользователя и настроить репозиторий для работы с базой данных.

  4. Пример сущности: ```java import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id;

@Entity public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String username;

   // Геттеры и сеттеры

} ```

  1. Настройка базы данных:
  2. Вам нужно будет настроить подключение к базе данных в вашем приложении и использовать EntityManager для сохранения и извлечения пользователей.

Заключение

В текущей реализации ваши данные о пользователях хранятся в памяти и будут потеряны при перезапуске сервера. Если вам нужно постоянное хранение данных, рассмотрите возможность использования базы данных с JPA или другой технологией для управления данными. Если у вас есть дополнительные вопросы или вам нужна помощь с реализацией, не стесняйтесь спрашивать!