Получи случайную криптовалюту за регистрацию!

Java: fill the gaps

Логотип телеграм канала @java_fillthegaps — Java: fill the gaps J
Логотип телеграм канала @java_fillthegaps — Java: fill the gaps
Адрес канала: @java_fillthegaps
Категории: Технологии
Язык: Русский
Количество подписчиков: 10.33K
Описание канала:

Привет! Меня зовут Диана, и я занимаюсь java разработкой с 2013г.
Делюсь опытом/знаниями по темам:
- Java Core
- Вопросы с собеседований
- Best practices
Комплименты, вопросы, предложения: @utki_letyat

Рейтинги и Отзывы

4.50

2 отзыва

Оценить канал java_fillthegaps и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

0


Последние сообщения 20

2021-03-22 09:00:28Вопрос
Есть класс Parent с полем parentValue. У него есть наследник - класс Child с полем childValue. Класс Child помечен интерфейсом Serializable

Какими будут поля экземпляра Child после десереализации?
(щёлкните на картинку, чтобы открыть код полностью)
1.5K views06:00
Открыть/Комментировать
2021-03-22 09:00:28 В прошлый вторник вышла java 16, последний пробный шар перед главным релизом года - java 17. Чего-то совсем нового там нет, поэтому на этой неделе поговорим о сериализации. Лонгрид будет полезен начинающим разработчикам.

Часть 1: что такое сериализация, зачем она нужна, как сериализуются и десериализуются объекты
Часть 2: serialVersionUID и проблемы сериализации в Java
Часть 3: сериализация на практике
1.5K views06:00
Открыть/Комментировать
2021-03-10 09:00:04 Где посты? Канал что, умер?

Привет! Постов и правда давно не было, так как свободное время я целиком отдаю важному проекту.

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

Java Core:
Ошибки при использовании Optional
Исключения: checked и unchecked
Default методы: неудачный кейс
Будущее java: ближайшие 5-7 лет

Лонгрид про сборщики мусора
Лонгрид про коллекторы в Stream API

Intellij IDEA:
Как быстро редактировать код
Навигация по коду

Прочее:
Как найти работу без HeadHunter
Spring: статистика использования

Cпасибо, что вы ещё здесь
1.7K views06:00
Открыть/Комментировать
2021-02-19 09:00:09Intellij IDEA: Database View

Продолжая тему с БД, расскажу как можно работать с базой через Intellij IDEA.

Окошко открывается так: View → Tool Windows → Database

Подключить базу просто, самые необходимые функции есть:
Информация о таблицах, столбцах, индексах и т.д
Выполнить запрос
Выгрузить данные или метадату

Какие базы доступны:
Реляционные: Oracle, PostgreSQL, MySQL
Многие NoSQL: Mongo, Cassandra, Hive, ClickHouse, Vertica
Экзотичные: Exasol, Greenplum и Snowflake
Redis, Couchbase, HBase, CouchDB, Neo4j

Полный список баз на сегодня:
1.7K views06:00
Открыть/Комментировать
2021-02-17 09:00:05 Понятия в БД, часть 3. CAP, BASE, PACELC

Аббревиатура ACID появилась в 1983 году и относилась тогда к реляционным БД небольшого размера. В 2021 БД уже большие и распределённые. С ними связаны три понятия - CAP теорема, BASE и PACELC теорема. С ними и разберёмся в этом посте.

CAP теорема говорит, что распределённая система может обеспечить не больше двух гарантий из трёх:
Consistency. Эта целостность отличается от понятия в ACID и означает, что при каждом чтении
читается последнее значение. Неважно, один сервер в системе или тысяча.
Availability - каждый запрос возвращает ответ.
Partition tolerance - система продолжает работать несмотря на задержки в связи серверов и отказ некоторых из них.

Речь идёт о распределённых системах, так что без Partition tolerance никак. Если во время запроса пропала связь между серверами, придётся делать выбор:

Отменить запрос. Упор на консистенси - доступность снижается, зато ответ будет точным. Такие системы условно называют CP системами, к ним относятся Redis и Mongo.
Выполнить запрос, но не будут учитываться данные с опоздавших серверов. Это AP системы, среди них Apache Cassandra, Riak, Hazelcast

У целостности и доступности тоже есть градации:
Доступность считается высокой от 90% до 99.999999%
У целостности 15+ различных моделей

100% гарантий никто не даёт, и деление систем на СР и АР довольно условное. У большинства БД и месседж-брокеров можно настроить баланс между доступностью и целостностью для разных ситуаций.

Расширение CAP теоремы - теорема PACELC:
Если связь между серверами нарушается, придётся выбирать между целостностью данных и доступностью. Об этом говорится в CAP.
При нормальной работе встаёт выбор между низкими задержками(latency) и целостностью(consistency). Чем чаще синхронизируются сервера, тем выше задержки и целостность данных.

И ACID, и CAP теорема обещают больше, чем есть на деле. Более честен акроним BASE:
Basically Available - некоторые сервера могут быть недоступны, но в целом система работает.
Soft state - некоторые данные могут не сразу попасть на другие сервера.
Eventual consistency - но однажды точно попадут.

Неопределённость и слабые гарантий, но это реалии разработки распределённых систем.

Теперь ответ на вопрос перед постом. Термин "целостность" по-разному трактуется в ACID и CAP теореме. Грубо говоря:
ACID consistency - в данных нет аномалий
CAP consistency - данные на всех серверах одинаковые

Может быть ситуация, когда в БД выставлен уровень Serialazable и отличная целостность по ACID, но так себе целостность по CAP, и сервера синхронизируются раз в час. Может быть и наоборот, и в разных сочетаниях.
2.1K views06:00
Открыть/Комментировать
2021-02-15 10:01:19 Понятия в БД, часть 2. Уровни изоляции

Изоляция в ACID говорит: транзакция должна выполняется так, как будто других транзакций нет.
Единственный надёжный способ - запускать транзакции последовательно. Это медленно, поэтому БД поддерживает менее строгие модели изоляции. База работает быстрее, но возможны аномалии данных.

В этом посте углубимся в детали - что за аномалии, что за уровни изоляции, и какие проблемы они решают.

Все проблемы транзакций давно изучены: dirty reads, write skews и т.д. Чем больше проблем решает БД, тем сложнее код и тем медленнее работает БД. Уровни изоляции позволяют найти баланс между скоростью и корректностью.

В SQL стандарте их 4:
READ_UNCOMMITED
READ_COMMITED
REPEATABLE_READ
SERIALIZABLE

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

В стандарте SQL описаны три проблемы:
Dirty reads - грязные чтения

Транзакция 1 обновляет поле Х. Другие транзакции видят новое значения Х до того, как транзакция 1 завершится.

В вопросе с переводом денег как раз возникла такая ситуация. Транзакция перевода ещё не завершилась, а другая транзакция прочитала промежуточные значения.

Где возникает проблема: только на уровне READ_UNCOMMITED.

Nonrepeatable reads - неповторяющиеся чтения

Транзакция 2 читает поле X и работает с ним. В это время транзакция 3 обновляет поле Х. В итоге транзакция 2 работает с устаревшим значением.

Более формально, "неповторяющееся чтение" - когда чтение одного поля в начале и конце транзакции даёт разные результаты. Но редко кто читает одно поле дважды, на практике получается либо бесполезная транзакция с устаревшими данными, либо несогласованные данные внутри транзакции.

Проблема остро проявляется для долгих запросов - бэкапов или аналитики. Решается на уровне REPEATABLE_READ и выше.

Фантомные чтения

Транзакция 3 проверяет условие по большому количеству записей. Транзакция 4 меняет выборку, например, добавляет новую запись. Если условие в транзакции 3 перестанет выполнятся, транзакция 3 этого не заметит.

Важно, что условие касается не одного поля, а многих. В этом разница с неповторяющимся чтением - там меняется одно конкретное поле, а в фантомном чтении меняется вся выборка, по которому проверяется условие.

Проблема решается на уровне SERIALIZABLE.

Подробные примеры и схемы аномалий есть в Википедии. Я перечислила основные, но у многих проблем есть разновидности, поэтому аномалий получается больше, чем уровней изоляции.

Каждая БД сама решает, какие проблемы решать на конкретных уровнях. У MS SQL Server - 5 уровней, у Oracle - 3. Большинство NoSQL баз не поддерживают транзакции, поэтому для них указывать тип изоляции бессмысленно. В универсальных адаптерах типа JDBC, Hibernate и Spring Data уровней столько, сколько в стандарте - 4.

Ещё одна проблема, которой нет в SQL стандарте, но встречается на практике:
Потерянный апдейт
Транзакции работают с одними данными и не учитывают друг друга.

Пример: транзакция 5 и транзакция 6 одновременно прочитали значение счётчика. Каждая транзакция прибавила к значению единицу и обновила поле счётчика. Вначале они прочитали одно значение, и получается, что один инкремент потерялся.
Проблема решается не только уровнями изоляции, но и SQL конструкциями:

Атомарный апдейт:
UPDATE test SET x=x-1 where id=1;

Блокировка строки:
SELECT * FROM test WHERE id = 1 FOR UPDATE;

Итог. Как учитывать внутрянку БД в написании кода:
Выбирать уровень изоляции с учётом вероятности и критичности проблем
Уточнить в документации БД, какие проблемы решает выбранный уровень
Писать код с учётом возможных аномалий
Помнить о потерянных апдейтах
2.3K viewsedited  07:01
Открыть/Комментировать
2021-02-15 10:01:19 Пара слов о гарантиях и Consistency в ACID.

Нужно чётко понимать разницу:
Заданные внутри БД ограничения, constraints, выполняются всегда.
Пример: в таблице хранится цена товара и скидочная цена:

price numeric,
sale_price numeric CHECK(price>sale_price)

Условие "обычная цена выше скидочной" задано в пределах ОДНОЙ записи. БД контролирует это условие и выдаст ошибку при несоблюдении.

Другое дело - транзакция, в которой меняются РАЗНЫЕ записи.
Нельзя атомарно перевести 100 рублей с одного аккаунта на другой. Будет момент, когда с одного аккаунта уже сняли 100 рублей, а на другой ещё не перевели. Целостность данных ненадолго нарушится.

От уровня изоляции зависит, заметят ли несоответствие другие транзакции. Эту тему обсудим сегодня.
2.1K views07:01
Открыть/Комментировать