Size: a a a

2021 January 26

A

Alex in pro.jvm
тогда конкретная имплементация будет отвечать за ту сущность, например UserVersionImpl implements Version<User>
источник

VP

Vladimir Petrakovich in pro.jvm
Alex
тогда может быть интерфейс Version<T> extends Comparable<T> { int getVersion(); } что-то такое
Это уже какой-то Versioned
источник

A

Alex in pro.jvm
🤷‍♂️ тут сложно делать предположения, непонятна вся логика
источник

A

Alex in pro.jvm
возможно такое решение подойдет, возможно нет
источник

PC

Pavel Churzin in pro.jvm
Alex
тогда может быть интерфейс Version<T> extends Comparable<T> { int getVersion(); } что-то такое
Подумаю, интересный вариант
источник

A

Alex in pro.jvm
во всяком случае если нужно решить вопрос "как уйти от каста" - данное решение эту проблему закрывает, вопрос лишь в том допустима ли такая логика
источник

AG

Alexey Genus in pro.jvm
Pavel Churzin
Скажем у меня класс

class VersionImpl implements Version {
 
private int v;

VersionImpl(int v) {
  this.v = v;
}

compareTo(Version other) {
 return Integer.compare(v, ((VersionImpl)other) .v)
}
}


Прошу прощения за форматирование, с телефона не очень
Как насчёт такого?
class VersionImpl implements Version<VersionImpl> {

 @Override
 public int compareTo(VersionImpl o) {
   return 0;
 }
}

interface Version<T extends Version<T>> extends Comparable<T> {}
источник

PC

Pavel Churzin in pro.jvm
Alexey Genus
Как насчёт такого?
class VersionImpl implements Version<VersionImpl> {

 @Override
 public int compareTo(VersionImpl o) {
   return 0;
 }
}

interface Version<T extends Version<T>> extends Comparable<T> {}
А чтобы использовать нужно будет тогда делать что-то в духе:

class ItemWithVersion<T extends Version<T>> {

private T version;

}

В общем буду пробовать варианты, благо предложили достаточно

Спасибо
источник

A

Anton in pro.jvm
Артём Курилко
но это вроде тоже самое что и бесконечный цикл с задержкой
Это лучше, чем бесконечный цикл в смысле (while (true) { ... Thread.sleep(); }), т.к. будет использовать поток из пула потоков, вместо блокировки потока.
источник

А

Артём Курилко... in pro.jvm
Anton
Это лучше, чем бесконечный цикл в смысле (while (true) { ... Thread.sleep(); }), т.к. будет использовать поток из пула потоков, вместо блокировки потока.
Я понял, спасибо
источник

P

Parra in pro.jvm
How can I convert a jna PointerByReference into Array[Pointer] ?

I tried to declare it inside the callback but I get an IllegalArgumentException, it works with PointerByReference but I want to access it like an array:
https://github.com/metacall/core/blob/51a7b042ea9b81d458e3d251852eee313aae2530/source/ports/scala_port/src/test/scala/MetaCallSpec.scala#L228

The source is in Scala but I'm ok with Java.
источник

AG

Alexey Genus in pro.jvm
Вот есть такой вопросик по hibernate + spring-data.
Я две одинаковые транзакции в разных потоках и в них делаю findById.
Потом делаю тоже самое, но с PESSIMISTIC_WRITE-локом (т.е. select for update). Одна транзакция выигрывает, вторая зависает на локе.
Далее в первой транзакции делаю update и commit транзакции.
Тут лок отпускается и во второй транзакции получаю объект, но со старым значением (до update), потому что entity уже есть в persistence context. Делаю update и теряю предыдущий update.

Это ожидаемое поведение? Можно ли как-то настроить hibernate, чтобы второй select for update обновлял мою entity?
источник

SP

Sergey Potekhin in pro.jvm
А не проще ли использовать уровень изоляции Repeatable Read. Он не даст другой транзакции прочитать, если в первой было обновление.
источник

AG

Alexey Genus in pro.jvm
Да, это вариант, но тогда придётся повторять транзакции в таких случаях, а для этого не хочется городить логику.
источник

AG

Alexey Genus in pro.jvm
Вот, запилил минимальный код
https://gist.github.com/genuss/4bbb5c1fa4e0ae297e1abe3bb1229763
источник

AG

Alexey Genus in pro.jvm
Всё ломает первый findById. Если его убрать, то всё будет работать, как и планировалось.
Думаю, что в реальном коде я его просто уберу у себя, это должно быть не очень сложно, но интересно, почему так работает?
источник

SP

Sergey Potekhin in pro.jvm
Дело в том, что с явными блокировками можно нарваться на эскалацию. Например, MSSQL любит заблокировать не только определенные записи, но и всю таблицу, потому что ему так проще
источник

SP

Sergey Potekhin in pro.jvm
Это плохой путь
источник

AG

Alexey Genus in pro.jvm
Это правда, явные блокировки могут быть так реализованы, что будут блокировать лишнее. Тут ещё и с индексами могут быть проблемы, если будут insert/delete
источник

GM

Gerr Mes in pro.jvm
Alexey Genus
Всё ломает первый findById. Если его убрать, то всё будет работать, как и планировалось.
Думаю, что в реальном коде я его просто уберу у себя, это должно быть не очень сложно, но интересно, почему так работает?
Достаточно "хрупкий" код получается, кто то другой залезет и сломает - сделайте лучше на оптимистических блокировках - повторите проигравшую транзакцию ничего страшного
источник