Size: a a a

Java/Kotlin Web and more

2020 December 09

AE

Alexandr Emelyanov in Java/Kotlin Web and more
N
привет никто не сталкивался с проблемой что sql update c добавление RETURNING оператора в spring data не чистит кэш ентити менеджера по коммиту транзакции

    @Modifying(flushAutomatically = true, clearAutomatically = true)
   @Query(
           value = "UPDATE some_table " +
                   "SET  some_field = 'ACTIVE', updated_at = :updatedAt " +
                   "WHERE some_field = :state " +
                   "AND received_at < :timeToLive " +
                   "RETURNING id"
           ,
           nativeQuery = true
   )

возвращает ид колонок, но повторый запрос в базу показывает устререлые данные

В логах говорит что заапдейтл 2 rows

: HHH000117: HQL: UPDATE some_tavle SET "some_field" = 'ACTIVE', updated_at = ? WHERE "some_field" = ? AND received_at < ? RETURNING id 
time: 3ms, rows: 2
у тебя уходит запрос на изменение данных в бд, в кэшк ничего не меняется, далее при запросе сущности по id она возьметрся из кеша и там будут старые данные. никакой flush тут не поможет, надо мержить с данными из бд
источник

РН

Роман Нагаев... in Java/Kotlin Web and more
N
привет никто не сталкивался с проблемой что sql update c добавление RETURNING оператора в spring data не чистит кэш ентити менеджера по коммиту транзакции

    @Modifying(flushAutomatically = true, clearAutomatically = true)
   @Query(
           value = "UPDATE some_table " +
                   "SET  some_field = 'ACTIVE', updated_at = :updatedAt " +
                   "WHERE some_field = :state " +
                   "AND received_at < :timeToLive " +
                   "RETURNING id"
           ,
           nativeQuery = true
   )

возвращает ид колонок, но повторый запрос в базу показывает устререлые данные

В логах говорит что заапдейтл 2 rows

: HHH000117: HQL: UPDATE some_tavle SET "some_field" = 'ACTIVE', updated_at = ? WHERE "some_field" = ? AND received_at < ? RETURNING id 
time: 3ms, rows: 2
не уверен что он должен чистиить и сомневаюсь что хибер может нормально обработать returning, попробуй задетачить ентити с соответствующим id при апдейте или сделать рефреш после апдейта
источник

N

N in Java/Kotlin Web and more
Alexandr Emelyanov
у тебя уходит запрос на изменение данных в бд, в кэшк ничего не меняется, далее при запросе сущности по id она возьметрся из кеша и там будут старые данные. никакой flush тут не поможет, надо мержить с данными из бд
я в новой транзакции не вижу изменений )
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Alexandr Emelyanov
у тебя уходит запрос на изменение данных в бд, в кэшк ничего не меняется, далее при запросе сущности по id она возьметрся из кеша и там будут старые данные. никакой flush тут не поможет, надо мержить с данными из бд
почему это? flush+clear должны помогать. flush заставляет выполнить данный запрос "здесь и сейчас", а clear как раз чистит кэш энтити-менеджера, так что новый find(id) будет вынужден выполнить SELECT в БД.

если в одной и той же транзакции это все делать, конечно

а вот если в разных, то дело может быть в изоляции транзакций.
источник

РН

Роман Нагаев... in Java/Kotlin Web and more
Ruslan Stelmachenko
почему это? flush+clear должны помогать. flush заставляет выполнить данный запрос "здесь и сейчас", а clear как раз чистит кэш энтити-менеджера, так что новый find(id) будет вынужден выполнить SELECT в БД.

если в одной и той же транзакции это все делать, конечно

а вот если в разных, то дело может быть в изоляции транзакций.
clear не советую, он задетачит все ентити, в том числе те что не зафлашились, лучше детачнуть только ту что нужно
источник

AE

Alexandr Emelyanov in Java/Kotlin Web and more
Ruslan Stelmachenko
почему это? flush+clear должны помогать. flush заставляет выполнить данный запрос "здесь и сейчас", а clear как раз чистит кэш энтити-менеджера, так что новый find(id) будет вынужден выполнить SELECT в БД.

если в одной и той же транзакции это все делать, конечно

а вот если в разных, то дело может быть в изоляции транзакций.
так никто не сказал что делался clear()
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
ну поэтому я и написал flush+clear, а не просто clear.

ну да, все правильно. но обычно вы же контролируете ваш собственный код и знаете, если там что-то еще или нет
источник

AE

Alexandr Emelyanov in Java/Kotlin Web and more
N
привет никто не сталкивался с проблемой что sql update c добавление RETURNING оператора в spring data не чистит кэш ентити менеджера по коммиту транзакции

    @Modifying(flushAutomatically = true, clearAutomatically = true)
   @Query(
           value = "UPDATE some_table " +
                   "SET  some_field = 'ACTIVE', updated_at = :updatedAt " +
                   "WHERE some_field = :state " +
                   "AND received_at < :timeToLive " +
                   "RETURNING id"
           ,
           nativeQuery = true
   )

возвращает ид колонок, но повторый запрос в базу показывает устререлые данные

В логах говорит что заапдейтл 2 rows

: HHH000117: HQL: UPDATE some_tavle SET "some_field" = 'ACTIVE', updated_at = ? WHERE "some_field" = ? AND received_at < ? RETURNING id 
time: 3ms, rows: 2
а транзакции параллельные?
источник

RS

Ruslan Stelmachenko in Java/Kotlin Web and more
Alexandr Emelyanov
так никто не сказал что делался clear()
@Modifying(flushAutomatically = true, clearAutomatically = true)

так вот же. я правда не помню уже что конкретно делают эти параметры. возможно там не просто em.flush(); em.clear();, а какая-то логика. это надо доки перечитывать.
источник

N

N in Java/Kotlin Web and more
Alexandr Emelyanov
а транзакции параллельные?
Дааааааа .... вы правы, в этом вся проблема )))
источник

AE

Alexandr Emelyanov in Java/Kotlin Web and more
Ruslan Stelmachenko
@Modifying(flushAutomatically = true, clearAutomatically = true)

так вот же. я правда не помню уже что конкретно делают эти параметры. возможно там не просто em.flush(); em.clear();, а какая-то логика. это надо доки перечитывать.
а, не использовал и вижу впервые, потому и пропустил при чтении) надобности не было)
источник

AE

Alexandr Emelyanov in Java/Kotlin Web and more
N
Дааааааа .... вы правы, в этом вся проблема )))
так тогда пока коммита не будет - данные не увидишь, если только не read_uncommited стоит
источник

N

N in Java/Kotlin Web and more
Alexandr Emelyanov
так тогда пока коммита не будет - данные не увидишь, если только не read_uncommited стоит
небольшой делей в пару десятков мили сек показал что все работает )
Та думаю более правильным будет выполнять их последовательно, такая возможность есть )
Всем спасибо 😊
источник

П

Павел Сарпов... in Java/Kotlin Web and more
Привет. Кто работал с websocket?

Есть вот такой метод на сервере
@MessageMapping("/chat/room/{roomId}")
   @Throws(Exception::class)
   fun greeting(@Payload message: IncomeMessages.SendMessage, headerAccessor: SimpMessageHeaderAccessor) {
                  val msg = OutcomeMessages.SendMessage(user, message.chatId)
       messagingTemplate.convertAndSendToUser(
token, "/queue/messages", msg)
       }
   }


и вот такой на клиенте
mStompClient.topic("/user/$token/queue/messages").subscribe()

Судя по логам,я подписался на
Translated /user/18133787a34dfdaa43eb501262d01e…/queue/messages -> [/18133787a34dfdaa43eb501262d01e…/queue/messages-user5d4f9a66-3e98-ba59-8cbe-434c2b82cf6c]

Но когда сервак пытается отправить сообщение - вот такой лог
No active sessions for user destination: /user/18133787a34dfdaa43eb501262d01e…/queue/messages

Что не так делаю?
источник

PA

Pavel Artyomenko in Java/Kotlin Web and more
попробуй вот так подписаться на клиенте:
mStompClient.topic("/user/queue/messages").subscribe()
источник

П

Павел Сарпов... in Java/Kotlin Web and more
Попробовал. Не помогло
источник

PA

Pavel Artyomenko in Java/Kotlin Web and more
и вот здесь, скорее всего, нужно principal.name, а не токен указывать:
messagingTemplate.convertAndSendToUser(token, "/queue/messages", msg)
источник

П

Павел Сарпов... in Java/Kotlin Web and more
Спасибо. Сейчяас пробую именно так
источник

АМ

Артем Мартынов... in Java/Kotlin Web and more
Всем привет. Вопрос нубский, но я только начинаю) Сделал приложение на android. хочу туда подтянуть бд sqlite. Так уж получается что каждый раз при установке приложения бд заполнять оооочень долго. Нельзя ли по аналогии с MySQL просто выгрузить 1 раз готовый дамп и в приложении держать его отдельным файлом(или хз как там принято) и просто потом подключаться к нему? Если можно то как?)
источник

R

Responsibility in Java/Kotlin Web and more
Alexandr Emelyanov
По умолчанию колонки в отношении @JoinTable будут указывать на pk связываемых таблиц
Спасибо добрый человек)
источник