Как сохранить объект в сокете java

#java #sockets #jpa #persistence #serversocket

Вопрос:

У меня возникли проблемы с сохранением данных в базе данных, когда я использую сокет java. Я покажу вам ниже …

Этот класс вызывается для создания соединения, когда соединение с клиентом завершено, вызывается прослушиватель

  public Response connect(int port) throws IOException {
    
    this.port = port;
    
    serverSocket = new ServerSocket(this.port);     
    clientSocket = serverSocket.accept();
    
    this.listenClient();        
}
 

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

 private void listenClient() throws IOException {

    BufferedReader in = new BufferedReader( new InputStreamReader( 
   clientSocket.getInputStream() ) );

    String line = in.readLine();
    
    while( this.running() amp;amp; !serverSocket.isClosed() )
    {
        if (line != null) {
            
            String msgDecript = decryptData(line);
                        
            Entity entity = new Entity()
            entity.setName(msgDecript);
            entityService.persist(entity);

            line = in.readLine();
        }
    }
}
 

Когда я пытаюсь сохранить объект в списке, это не работает, видите, что я пытаюсь запустить сохранение в прослушивателе, я не знаю, может ли это повлиять на эту проблему.

Если я попытаюсь сохранить эту же сущность где-либо еще в классе, настойчивость работает, только в слушателе настойчивость не работает, только когда я пытаюсь выполнить это действие в слушателе, я не могу сохранить, кто-нибудь имеет представление, что это может быть?

Ошибки на стороне java нет, сохранение, по-видимому, завершено, идентификатор сущности сгенерирован, и запрос выполнен, но база данных застряла на некоторое время, я не могу открыть таблицу в базе данных, затем публикуется ошибка тайм-аута.

Если я вызову EntityManager и попытаюсь сохранить, произойдет та же проблема

 this.entityManager.persist(entity);
this.entityManager.flush();
 

Комментарии:

1. Для чего вы используете in.readLine() после сохранения, и как вы думаете, что он делает?

2. @BeUndead Итак, пока я подключен к клиенту, пока он вызывается, строка = in.readLine(); используется для отображения конца чтения этой отправки с клиента на сервер, если я возьму строку=in.readLine(); Я больше не могу читать содержимое клиента, читая сообщения клиента строка за строкой.

3. Просто предположение, но может случиться так, что поток может быть заблокирован от завершения блокирующим вызовом ввода-вывода, который влияет на базу данных. Вы можете проверить эту гипотезу, создав новый поток для сохранения. Это быстрая задача, чтобы попробовать

4. @g00se здравствуйте, извините за задержку с ответом, я пытался сделать то, что вы мне сказали, кстати, отличный тестовый подол, но это не сработало, потому что мне нужно сохранить в базе данных, а служба, которая делает это в потоке, в итоге жалуется, что мне нужен активный переход … я не мог продвинуться вперед в решении этой проблемы