С 07.06 по 13.06
Предыдущий пост(с 31.05 по 06.06)
Воскресный мотивационный пост:
«Обучение Java — марафон, а не прыжок с трамплина»
Выбранная голосованием тема:
JavaMailSender в Spring Boot
Запись встреч:
Многопоточка во всей красе. Часть 2.
Обучающие статьи:
Объекты в Java
Ссылочные типы в Java — массивы
Ссылочные типы в Java — строки (String)
Введение в Flyway
Настройка и базовые команды Flyway
Пост о воспоминаниях:
Как мы писали крестики - нолики
Полезные статьи и видео:
Библиотека для кэширования Caffeine: анализ кода
Spring Data JPA и Hibernate: ориентируемся на производительность. Часть 1
Часть 1: Как я создал идеальный REST API — микросервис инцидентов на Java и Spring
Для тех кто знает английский - посмеяться
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Предыдущий пост(с 31.05 по 06.06)
Воскресный мотивационный пост:
«Обучение Java — марафон, а не прыжок с трамплина»
Выбранная голосованием тема:
JavaMailSender в Spring Boot
Запись встреч:
Многопоточка во всей красе. Часть 2.
Обучающие статьи:
Объекты в Java
Ссылочные типы в Java — массивы
Ссылочные типы в Java — строки (String)
Введение в Flyway
Настройка и базовые команды Flyway
Пост о воспоминаниях:
Как мы писали крестики - нолики
Полезные статьи и видео:
Библиотека для кэширования Caffeine: анализ кода
Spring Data JPA и Hibernate: ориентируемся на производительность. Часть 1
Часть 1: Как я создал идеальный REST API — микросервис инцидентов на Java и Spring
Для тех кто знает английский - посмеяться
Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
#memory
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!
Тема будет: StreamApi и функциональные интерфейсы
Тема будет: StreamApi и функциональные интерфейсы
Anonymous Poll
52%
Да, интересно я приду! 👌
20%
Блииин, хочу, но не могу 😭
24%
Посмотрю в записи ☺️
4%
Не, фигню рассматриваете, я ее знаю, не приду 🤫
Всем привет! 👋
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз мы рассмотрим такую нетривиальную тему как Stream API и функциональное программирование в целом.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы🧑💻
Как всегда жду всех! 🫡
Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!
В этот раз мы рассмотрим такую нетривиальную тему как Stream API и функциональное программирование в целом.
И даже если раньше вы все это знали, лишним повторить не будет.
Приходите, это хороший шанс позадавать вопросы
Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
Предлагаем темы для разбора и публикации! 📖
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢 Один человек - одна тема.
🟢 Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!
Жду Ваших предложений!👏
В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.
Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.
Примерные правила:
Жду Ваших предложений!
Please open Telegram to view this post
VIEW IN TELEGRAM
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
30%
Optional
27%
AOP
30%
JSON
13%
IO/NIO
Please open Telegram to view this post
VIEW IN TELEGRAM
Типы миграций и версионирование в Flyway
1. Структура SQL-миграций
Flyway классифицирует SQL-миграции по префиксам в именах файлов, определяя их поведение при выполнении.
1.1. Именование файлов
Версионные миграции (Versioned)
Префикс V + версия + описание:
Пример:
Повторяемые миграции (Repeatable)
Префикс R + описание:
Пример:
2. Java-миграции
Позволяют описывать миграции на Java для сложной логики, недоступной в SQL.
2.1. Реализация интерфейсов
JdbcMigration (устаревший):
JavaMigration (рекомендуемый):
2.2. Правила
Классы должны находиться в classpath (обычно src/main/java/db/migration).
Имя класса соответствует имени файла SQL-миграции (например, V2__InsertTestData.java).
3. Правила версионирования
3.1. Семантическое версионирование
Рекомендуемый формат версии:
Пример:
Преимущества:
Понятная история изменений.
Совместимость с Semantic Versioning.
3.2. Откат изменений
Flyway не поддерживает автоматический откат. Альтернативы:
Новая миграция для отмены изменений:
Callbacks (SQL-хуки):
Скрипты beforeMigrate/afterMigrate для резервного копирования.
Важно: Не изменяйте уже примененные миграции — это нарушит целостность flyway_schema_history.
4. Примеры
4.1. SQL-миграции
4.2. Java-миграция
#Java #middle #Flyway
1. Структура SQL-миграций
Flyway классифицирует SQL-миграции по префиксам в именах файлов, определяя их поведение при выполнении.
1.1. Именование файлов
Версионные миграции (Versioned)
Префикс V + версия + описание:
V<Версия>__<Описание>.sql
Пример:
-- V1__Create_users_table.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL
);
Повторяемые миграции (Repeatable)
Префикс R + описание:
R__<Описание>.sql
Пример:
-- R__Update_user_view.sql
CREATE OR REPLACE VIEW user_view AS
SELECT id, username FROM users;
2. Java-миграции
Позволяют описывать миграции на Java для сложной логики, недоступной в SQL.
2.1. Реализация интерфейсов
JdbcMigration (устаревший):
public class V2__InsertTestData implements JdbcMigration {
@Override
public void migrate(Connection connection) throws Exception {
try (Statement stmt = connection.createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('admin')");
}
}
}
JavaMigration (рекомендуемый):
public class V3__AddAdminUser implements JavaMigration {
@Override
public void migrate(Context context) throws Exception {
try (Statement stmt = context.getConnection().createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('superuser')");
}
}
}
2.2. Правила
Классы должны находиться в classpath (обычно src/main/java/db/migration).
Имя класса соответствует имени файла SQL-миграции (например, V2__InsertTestData.java).
3. Правила версионирования
3.1. Семантическое версионирование
Рекомендуемый формат версии:
V<Мажор>.<Минор>.<Патч>__<Описание>.sql
Пример:
-- V1.2.3__Fix_email_constraint.sql
ALTER TABLE users ALTER COLUMN email SET NOT NULL;
Преимущества:
Понятная история изменений.
Совместимость с Semantic Versioning.
3.2. Откат изменений
Flyway не поддерживает автоматический откат. Альтернативы:
Новая миграция для отмены изменений:
-- V3__Drop_users_table.sql
DROP TABLE users;
Callbacks (SQL-хуки):
Скрипты beforeMigrate/afterMigrate для резервного копирования.
Важно: Не изменяйте уже примененные миграции — это нарушит целостность flyway_schema_history.
4. Примеры
4.1. SQL-миграции
-- V1__Initial_schema.sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);
-- R__Update_view.sql
CREATE OR REPLACE VIEW active_users AS
SELECT * FROM users WHERE deleted_at IS NULL;
4.2. Java-миграция
public class V4__EncryptPasswords implements JavaMigration {
@Override
public void migrate(Context context) throws Exception {
try (PreparedStatement ps = context.getConnection()
.prepareStatement("UPDATE users SET password = encrypt(password)")) {
ps.executeUpdate();
}
}
}
#Java #middle #Flyway
Что выведет код?
#Tasks
import java.util.stream.IntStream;
public class Task160625 {
public static void main(String[] args) {
IntStream.rangeClosed(1, 5)
.filter(i -> i % 2 == 0)
.peek(System.out::print)
.forEachOrdered(i -> {});
}
}
#Tasks
Чем отличается ConcurrentHashMap от HashMap? 🤓
Ответ:
ConcurrentHashMap — потокобезопасная версия HashMap, предназначенная для многопоточных приложений.
Она использует сегментированную блокировку (lock striping), чтобы минимизировать конфликты. HashMap не потокобезопасна, и одновременный доступ из нескольких потоков может привести к ошибкам.
Пример:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1); // Потокобезопасно
ConcurrentHashMap не блокирует всю структуру, а только отдельные сегменты.
#собеседование
Ответ:
Она использует сегментированную блокировку (lock striping), чтобы минимизировать конфликты. HashMap не потокобезопасна, и одновременный доступ из нескольких потоков может привести к ошибкам.
Пример:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1); // Потокобезопасно
ConcurrentHashMap не блокирует всю структуру, а только отдельные сегменты.
#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM