#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 здравствуйте, извините за задержку с ответом, я пытался сделать то, что вы мне сказали, кстати, отличный тестовый подол, но это не сработало, потому что мне нужно сохранить в базе данных, а служба, которая делает это в потоке, в итоге жалуется, что мне нужен активный переход … я не мог продвинуться вперед в решении этой проблемы