— Statement используется для
— PreparedStatement
Поэтому в реальных проектах почти всегда используют PreparedStatement.
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤2👏1
Денормализация — это процесс
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🔥2👏1
Это структура данных, основанная на
Основные моменты:
🔹 Хеширование:
🔹 Коллизии:
🔹 Динамическое расширение:
🔹 Балансировка дерева:
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤3😁1
ApplicationContext — это
Он является расширением
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1👏1
Memory leak, который живёт неделями и не воспроизводится локально 👇
📦 Задание — code review
Написали фильтр для аудита запросов. В продакшне через несколько дней — OutOfMemoryError.
@Component
public class AuditFilter implements Filter {
private static final ThreadLocal<AuditContext> CONTEXT =
new ThreadLocal<>();
@Override
public void doFilter(
ServletRequest request,
ServletResponse response,
FilterChain chain
) throws IOException, ServletException {
AuditContext ctx = new AuditContext(
((HttpServletRequest) request).getRequestURI(),
System.currentTimeMillis()
);
CONTEXT.set(ctx);
try {
chain.doFilter(request, response);
} finally {
auditLog(CONTEXT.get());
}
}
public static AuditContext current() {
return CONTEXT.get();
}
private void auditLog(AuditContext ctx) {
// пишем в БД...
}
}
▪️ Объясни
— Почему объекты в ThreadLocal не собираются GC, даже если запрос завершён.
— Какая одна строчка кода здесь отсутствует, и где именно она должна быть.
* Есть ли риски при использовании ThreadLocal в virtual threads (Project Loom)?
Ставьте → 🔥, если нравится формат. Если нет → 🌚
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4
😱 Если ваш продукт не умеет отдавать данные в формате, понятном AI-агенту, то вас просто не существует
Скрипт не будет кликать по красивым кнопкам в браузере, он уйдёт к конкуренту с нормальным API. Перестроить архитектуру под машинных клиентов — это уже не хайп, а необходимое условие сохранения конкурентоспособности.
Как адаптировать продукт и не исчезнуть из выдачи:
— интегрировать
— научиться контролировать стоимость (лимиты, кэш, роутинг между моделями);
— настроить AgentOps: трейсинг, логирование и отлов регрессий.
Всё это ждёт вас на обновлённом курсе «Разработка AI-агентов». Мы специально сделали фокус на утилитарном инжиниринге и production-ready решениях.
Кстати, до 29 марта можно забрать курс с большой скидкой, и стоит поторопиться — мест на потоке всё меньше.
Зафиксировать цену и начать деплоить агентов без слива бюджета 👈
Скрипт не будет кликать по красивым кнопкам в браузере, он уйдёт к конкуренту с нормальным API. Перестроить архитектуру под машинных клиентов — это уже не хайп, а необходимое условие сохранения конкурентоспособности.
Как адаптировать продукт и не исчезнуть из выдачи:
— интегрировать
MCP и A2A-взаимодействие, чтобы агенты могли вас читать;— научиться контролировать стоимость (лимиты, кэш, роутинг между моделями);
— настроить AgentOps: трейсинг, логирование и отлов регрессий.
Всё это ждёт вас на обновлённом курсе «Разработка AI-агентов». Мы специально сделали фокус на утилитарном инжиниринге и production-ready решениях.
Кстати, до 29 марта можно забрать курс с большой скидкой, и стоит поторопиться — мест на потоке всё меньше.
Зафиксировать цену и начать деплоить агентов без слива бюджета 👈
🥱2❤1
Ежемесячный опрос по грейдам. Проверим, выросло ли число senior'ов.
Ваш грейд:
🔥 — Senior
👍🏼 — Middle
❤️ — Junior
😁 — Ещё учусь
Please open Telegram to view this post
VIEW IN TELEGRAM
👍35😁25❤15🔥10
volatile — это модификатор переменной, который гарантирует:
▪️
▪️
Использовать стоит, когда:
▪️
▪️
volatile не обеспечивает атомарности, поэтому для операций «чтение-модификация-запись» нужны синхронизация или атомарные типы (AtomicInteger, AtomicReference и т.п.).
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤5
IO (Input/Output) — это
NIO (New IO) был введён в JDK 1.4 для
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
DDD (Domain-Driven Design) — подход к проектированию, при котором структура кода отражает структуру бизнес-домена.
Основные строительные блоки
Entity —
Value Object —
Aggregate —
Domain Service —
Repository —
Domain Event —
Bounded Context —
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤3🔥1
Идемпотентность означает, что
Способы реализации:
—
—
—
—
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍4🔥1
Код чистый, тесты быстрые, на реальных данных — pg_stat_activity в огне 👇
📦 Задание — code review
Ручка возвращает список заказов с информацией о товарах. Работает корректно, но DBA прибежал с графиком: каждый вызов делает тысячи запросов к БД.
@Entity
public class Order {
@Id
private Long id;
private Long userId;
private LocalDateTime createdAt;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "order")
private List<OrderItem> items;
}
@Entity
public class OrderItem {
@Id
private Long id;
@ManyToOne(fetch = FetchType.LAZY)
private Order order;
@ManyToOne(fetch = FetchType.LAZY)
private Product product;
private Integer quantity;
}
@RestController
@RequiredArgsConstructor
public class OrderController {
private final OrderRepository orderRepository;
@GetMapping("/orders")
public List<OrderDto> getOrders(@RequestParam Long userId) {
List<Order> orders = orderRepository.findByUserId(userId);
return orders.stream()
.map(order -> new OrderDto(
order.getId(),
order.getItems().stream()
.map(item -> new ItemDto(
item.getProduct().getName(),
item.getQuantity()
))
.toList()
))
.toList();
}
}
▪️ Объясни
— Точную механику N+1: где и сколько раз запросы уходят в БД в этом коде.
— Почему FetchType.EAGER «решит» проблему, но создаст другую.
— Как можно решить проблему.
Ставьте → 🔥, если нравится формат. Если нет → 🌚
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥19❤4👍4
Текущий уровень сложности вопросов?
🔥 — Слишком просто, хочу сложнее
👍🏼 — В самый раз
❤️ — Иногда сложновато
😁 — Часто не понимаю
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18❤13🔥7😁1
this — это
—
—
—
—
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤1🔥1
Event-driven architecture — это когда компоненты
// Событие:
public record UserRegistered(User user) {}
// Listener:
@Component
public class SendWelcomeEmail {
@EventListener
public void handle(UserRegistered event) {
mailer.send(event.user().email(), "Welcome!");
}
}
// Публикация события:
applicationContext.publishEvent(new UserRegistered(user));
Зачем
В Spring
— ApplicationEventPublisher для публикации
— @EventListener для подписки
— @TransactionalEventListener — если нужно дождаться коммита транзакции
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥1
@Value
@Value("${app.name}")
private String appName;
@Value("${app.timeout:30}")
private int timeout; // 30 - default значение
@Value("#{systemProperties['user.name']}")
private String userName; // SpEL выражениеПоддерживает
— property placeholders ${...}
— SpEL выражения #{...}
— значения по умолчанию через ":"
Альтернатива для группы свойств: @ConfigurationProperties.
#spring
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤1🔥1
Наследование — это механизм ООП, позволяющий создавать
Наследование реализуется с помощью ключевого слова
#core
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤1🔥1
Никаких ошибок в логах. Никаких алертов. Данные просто не сохраняются 👇
📦 Задание — code review
Сервис нотификаций: после оплаты заказа — отправить email и записать событие в БД. Оба действия независимы, сделали асинхронно.
@Service
@RequiredArgsConstructor
public class NotificationService {
private final EmailClient emailClient;
private final EventRepository eventRepository;
private final Executor taskExecutor;
public void notifyOrderPaid(Order order) {
CompletableFuture.runAsync(
() -> emailClient.sendOrderConfirmation(order),
taskExecutor
);
CompletableFuture.runAsync(
() -> {
Event event = Event.orderPaid(order.getId());
eventRepository.save(event);
},
taskExecutor
);
}
}
▪️ Объясни
— Почему исключения из runAsync полностью проглатываются и как это работает внутри.
— Чем отличается поведение runAsync от supplyAsync в контексте обработки ошибок.
— Как переписать код так, чтобы: (1) ошибки логировались, (2) один сбой не блокировал другую задачу, (3) вызывающий код мог знать об итоге.
Ставьте → 🔥, если нравится формат. Если нет → 🌚
#practise
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9❤3🤔2👍1
Основные проблемы многопоточности:
#concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4🔥1
✅
Сохраняй событие в таблицу outbox в той же транзакции, что и бизнес-данные. Отдельный процесс читает таблицу и публикует в Kafka.
На стороне консьюмера — идемпотентность: проверяй event_id перед обработкой.
#patterns
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1🔥1