fa
Feedback
Java Geek

Java Geek

رفتن به کانال در Telegram

Практичные советы, лайфхаки и код для Java-разработчиков. Каждый пост — реальная польза. Учим Java на примерах. По всем вопросам @evgenycarter

نمایش بیشتر
2 449
مشترکین
اطلاعاتی وجود ندارد24 ساعت
+27 روز
+530 روز
جذب مشترکین
ژوئن '26
ژوئن '260
در 0 کانال‌ها
مه '26
+23
در 0 کانال‌ها
Get PRO
آوریل '26
+12
در 0 کانال‌ها
Get PRO
مارس '26
+18
در 0 کانال‌ها
Get PRO
فوریه '26
+21
در 0 کانال‌ها
Get PRO
ژانویه '26
+16
در 0 کانال‌ها
Get PRO
دسامبر '25
+11
در 0 کانال‌ها
Get PRO
نوامبر '25
+43
در 32 کانال‌ها
Get PRO
اکتبر '25
+31
در 0 کانال‌ها
Get PRO
سپتامبر '25
+55
در 37 کانال‌ها
Get PRO
اوت '25
+40
در 0 کانال‌ها
Get PRO
ژوئیه '25
+60
در 28 کانال‌ها
Get PRO
ژوئن '25
+61
در 20 کانال‌ها
Get PRO
مه '25
+71
در 45 کانال‌ها
Get PRO
آوریل '25
+102
در 37 کانال‌ها
Get PRO
مارس '25
+96
در 38 کانال‌ها
Get PRO
فوریه '25
+81
در 32 کانال‌ها
Get PRO
ژانویه '25
+98
در 34 کانال‌ها
Get PRO
دسامبر '24
+86
در 35 کانال‌ها
Get PRO
نوامبر '24
+75
در 33 کانال‌ها
Get PRO
اکتبر '24
+89
در 30 کانال‌ها
Get PRO
سپتامبر '24
+121
در 29 کانال‌ها
Get PRO
اوت '24
+49
در 18 کانال‌ها
Get PRO
ژوئیه '24
+45
در 0 کانال‌ها
Get PRO
ژوئن '24
+68
در 24 کانال‌ها
Get PRO
مه '24
+65
در 19 کانال‌ها
Get PRO
آوریل '24
+48
در 0 کانال‌ها
Get PRO
مارس '24
+78
در 21 کانال‌ها
Get PRO
فوریه '24
+85
در 18 کانال‌ها
Get PRO
ژانویه '24
+154
در 24 کانال‌ها
Get PRO
دسامبر '23
+111
در 24 کانال‌ها
Get PRO
نوامبر '23
+92
در 17 کانال‌ها
Get PRO
اکتبر '23
+111
در 18 کانال‌ها
Get PRO
سپتامبر '23
+108
در 0 کانال‌ها
Get PRO
اوت '23
+73
در 0 کانال‌ها
Get PRO
ژوئیه '23
+99
در 0 کانال‌ها
Get PRO
ژوئن '23
+95
در 0 کانال‌ها
Get PRO
مه '23
+115
در 0 کانال‌ها
Get PRO
آوریل '23
+114
در 0 کانال‌ها
Get PRO
مارس '23
+29
در 0 کانال‌ها
Get PRO
فوریه '23
+67
در 0 کانال‌ها
Get PRO
ژانویه '23
+124
در 0 کانال‌ها
Get PRO
دسامبر '22
+161
در 0 کانال‌ها
Get PRO
نوامبر '22
+107
در 0 کانال‌ها
Get PRO
اکتبر '22
+277
در 0 کانال‌ها
Get PRO
سپتامبر '22
+1 189
در 0 کانال‌ها
تاریخ
رشد مشترکین
اشارات
کانال‌ها
03 ژوئن0
02 ژوئن0
01 ژوئن0
پست‌های کانال
Что такое стек-трейс? Стек-трейс (stack trace) представляет собой список вызовов методов в обратном хронологическом порядке,
Что такое стек-трейс? Стек-трейс (stack trace) представляет собой список вызовов методов в обратном хронологическом порядке, начиная с метода, в котором произошло исключение. Стек-трейс позволяет отследить, какие методы были вызваны перед возникновением исключения, и предоставляет информацию о местоположении, где произошло исключение. 👉 @java_geek

2
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
127
3
Можно ли перегружать метод main() в Java? Да, метод main() может быть перегружен, но JVM или виртуальная машина Java вызывает только исходный метод main(). 👉 @java_geek
240
4
🔴 Завтра тестовое собеседование с Java-разработчиком 27 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседов
🔴 Завтра тестовое собеседование с Java-разработчиком 27 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Сергею Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.
265
5
Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? Для этого в LinkedList есть обратный
Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)? Для этого в LinkedList есть обратный итератор, который можно получить, вызвав метод descendingIterator(). 👉 @java_geek
240
6
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП
97
7
Array vs ArrayList Выбор между Array (стандартным Java-массивом) и ArrayList зависит от специфики задачи на Java, которую тре
Array vs ArrayList Выбор между Array (стандартным Java-массивом) и ArrayList зависит от специфики задачи на Java, которую требуется решить. Помните о следующих особенностях этих типов: ☕️ Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayList может динамически изменяться; ☕️ Массивы Java работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы; ☕️ При работе с Array велика вероятность получить ошибку ArrayIndexOutOfBoundsException; ☕️ У ArrayList только одно измерение, а вот массивы Java могут быть многомерными. 👉 @java_geek
355
8
Какова цель ключевого слова final, когда оно используется с переменной? Ключевое слово final в Java — это модификатор, который может применяться к переменным, методам и классам. Когда оно используется с переменной, это делает её неизменяемой, другими словами — константой. Например, переменная PI объявлена как final в классе ниже: public class CircleCalculator { private final double PI = 3.14159; public double calculateArea(double radius) { return PI * radius * radius; } } 👉 @java_geek
337
9
☕ Java Tip: Как работает var в Java С версии Java 10 появился ключевое слово var. Оно упрощает код, автоматически выводя тип переменной: var list = new ArrayList<String>(); list.add("Hello"); list.add("Java"); // Компилятор понимает, что list -> ArrayList<String> ✅ Удобно: меньше шаблонного кода. ❌ Важно: var не значит "динамическая типизация"! Тип фиксируется при компиляции. 📌 Используй var, если тип переменной очевиден - код станет чище. 👉 @java_geek
461
10
Collections.nCopies() Collections.nCopies() создаёт неизменяемый список, содержащий заданное количество копий одного и того ж
Collections.nCopies() Collections.nCopies() создаёт неизменяемый список, содержащий заданное количество копий одного и того же объекта. Это полезно для инициализации, заглушек и создания шаблонных коллекций. 👉 @java_geek
466
11
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
403
12
Что такое перегрузка методов в Java? Перегрузка методов — это мощный приём, который позволяет классу иметь несколько методов с одинаковым именем, но разными параметрами. Это даёт объектам класса возможность обрабатывать близкие (почти одинаковые) задачи, но с разными входными данными. Вот очень короткий пример, демонстрирующий перегрузку методов: class Calculator { int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } } В этом примере класс Calculator имеет два метода add: один принимает два целых числа (int) и возвращает сумму в виде целого числа, а другой — два числа с плавающей запятой (double) и возвращает сумму в виде double. Имя метода одинаковое, но параметры различаются, что позволяет вызывать подходящий метод в зависимости от типов аргументов. 👉 @java_geek
318
13
Разница между операторами break и continue. break и continue — это важные ключевые слова для управления потоком выполнения циклов в Java. Оператор break используется для немедленного завершения всего цикла, игнорируя оставшийся код в нём. Он полезен, когда нужно досрочно прервать цикл при выполнении определённого условия. Например, я использую break для отладки, чтобы выполнить только одну итерацию длинного цикла. Оператор continue используется для пропуска оставшейся части текущей итерации и немедленного перехода к следующей. Он удобен, когда нужно проходить по последовательности и пропускать отдельные элементы при выполнении определённого условия. Пример кода: for (int i = 0; i < 5; i++) { if (i == 2) { continue; // Skip iteration when i is 2 } if (i == 4) { break; // Exit loop when i is 4 } System.out.println(i); } 👉 @java_geek
325
14
Объясните концепцию наследования в Java на примерах Наследование — один из ключевых принципов объектно-ориентированного программирования в Java. Оно позволяет одному классу наследовать свойства и методы другого класса, что способствует повторному использованию кода и устанавливает отношение «родитель–потомок» между классами. Например, класс Car может наследоваться от общего класса Vehicle. В этом случае Car может вести себя так же, как Vehicle, с точки зрения атрибутов и методов: - Класс Vehicle имеет такие члены, как year и make, а Car добавляет дополнительный член transmission. - Класс Vehicle имеет метод move, а Car переопределяет move, добавляя поведение, характерное для автомобилей. 👉 @java_geek
309
15
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
281
16
🧠 Ленивая инициализация @Component в Spring Boot По умолчанию Spring инициализирует все бины при старте приложения. Это удобно, но может замедлить запуск, особенно если есть тяжёлые компоненты — например, коннекторы к внешним сервисам, парсеры, или тяжёлые кэши. 📌 Решение — использовать ленивую инициализацию (@Lazy): @Component @Lazy public class HeavyComponent { public HeavyComponent() { System.out.println("HeavyComponent инициализирован"); } } Теперь бин будет создан только при первом обращении. Можно также внедрять лениво: @Component public class SomeService { private final HeavyComponent heavy; public SomeService(@Lazy HeavyComponent heavy) { this.heavy = heavy; } } 💡 Если у вас много таких компонентов — можно включить ленивую инициализацию глобально: spring: main: lazy-initialization: true ⚠️ Осторожно: это может скрыть ошибки конфигурации до первого использования бина, что усложняет отладку. Используйте осознанно. Идеально подходит для: — микросервисов с быстрым стартом — CLI-инструментов на Spring Boot — задач с heavy startup logic 👉 @java_geek
286
17
🧠 Неожиданный анти-паттерн в Spring Boot: @EventListener как тихий убийца производительности В Spring удобно использовать @EventListener для реактивных действий — казалось бы, удобно и "чисто". Но есть нюанс. 📌 По умолчанию все @EventListener вызываются синхронно и в том же потоке, где был опубликован ивент через ApplicationEventPublisher. Это значит: @Component public class OrderService { @Autowired private ApplicationEventPublisher publisher; public void createOrder(Order order) { // 1. Сохраняем заказ orderRepository.save(order); // 2. Публикуем ивент publisher.publishEvent(new OrderCreatedEvent(order)); // 3. До выхода из метода все @EventListener уже будут выполнены } } А теперь представим, что слушатель делает что-то тяжёлое: @EventListener public void sendEmail(OrderCreatedEvent event) { emailService.sendConfirmation(event.getOrder()); } ⚠️ Если sendConfirmation висит на внешнем SMTP или уходит в сеть — метод createOrder будет ждать его завершения! 💡 Решение: сделать обработку асинхронной. Просто добавьте @Async: @Async @EventListener public void sendEmail(OrderCreatedEvent event) { emailService.sendConfirmation(event.getOrder()); } ✅ И не забудьте включить поддержку @Async: @EnableAsync @Configuration public class AsyncConfig {} 📌 Теперь @EventListener будет исполняться в отдельном потоке из TaskExecutor, и createOrder не будет блокироваться. 👉 @java_geek
304
18
🔥 Spring Native Image vs. Обычное Spring-приложение: В чем разница и зачем это нужно? Разбираемся, как нативные образы меняют правила игры для Spring-приложений! 👇 Обычное Spring-приложение (JVM-based): Когда вы запускаете классический Spring Boot на Java Virtual Machine (JVM), происходит следующее: 🔵JVM запускается первой: Прежде чем ваш код заработает, JVM должна инициализироваться и загрузить классы. Это занимает время. 🔵Динамическая природа: JVM позволяет динамически загружать классы и использовать рефлексию в рантайме. Это гибко, но ресурсозатратно. 🔵"Прогрев" (Warm-up): Для пиковой производительности JVM нужно время на JIT-компиляцию кода. 🔵Большой объем памяти: JVM сама по себе требует значительного объема RAM. 🔵Размер артефакта: JAR-файл содержит байт-код, который JVM затем обрабатывает. Spring Native Image (с GraalVM Native Image): Это компиляция вашего Spring-приложения в самостоятельный нативный исполняемый файл, не требующий JVM! 🔵Компиляция AOT (Ahead-of-Time): Весь код (включая Spring и JDK) компилируется в машинный код на этапе сборки. Все оптимизации происходят заранее. 🔵Мгновенный старт: Нет JVM и "прогрева"! Нативные образы стартуют мгновенно (от долей секунды). Идеально для: 🔵Серверлес-функций (Lambda, FaaS): Быстрый старт снижает задержки и стоимость. 🔵Микросервисов: Для быстрого масштабирования. 🔵Batch-задач: Быстрый запуск и завершение. 🔵Низкое потребление памяти: Отсутствие JVM значительно сокращает RAM. Экономия облачных ресурсов и возможность запускать больше приложений на сервере. 🔵Меньший размер образа: Включается только используемый код без JVM, что упрощает развертывание в контейнерах. 🔵Статический анализ: GraalVM глубоко анализирует код, исключая неиспользуемые части. Недостатки (куда без них?): 🔵Длительное время сборки: AOT-компиляция занимает значительно больше времени. 🔵Сложности с динамикой: Рефлексия и прокси требуют дополнительных настроек (runtime hints), хотя Spring Boot 3 упрощает это. 🔵Отсутствие некоторых инструментов мониторинга: Привычные JVM-инструменты (JMX, JFR) не поддерживаются напрямую. 🔵Специфичность платформы: Нужен отдельный образ для каждой ОС и архитектуры. Когда стоит использовать Spring Native Image? 🔵Когда время старта и потребление памяти критичны. 🔵Для микросервисов, серверлес-функций и batch-задач. 🔵Для контейнеров и облачных сред с оплатой по потреблению. 👉 @java_geek
292
19
🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии 📌 https://max.ru/progjob Вакансии в IT Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы
252
20
🧠 Зачем использовать @Transactional(readOnly = true)? Многие добавляют @Transactional(readOnly = true) на сервисные методы просто по привычке. Но давайте разберёмся, что на самом деле даёт этот флаг, и где он реально ускоряет выполнение. 📌 Что делает readOnly = true? * Подсказывает JPA провайдеру (например, Hibernate), что изменения в сущностях можно не отслеживать (skip dirty checking). * В некоторых БД может выставить read-only transaction flag, который предотвращает нежелательные изменения (например, в PostgreSQL). * Может ускорить выборки, особенно при больших графах сущностей. 💡 Пример: @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; @Transactional(readOnly = true) public UserDto getUser(Long id) { User user = userRepository.findById(id) .orElseThrow(() -> new EntityNotFoundException("User not found")); return UserDto.from(user); } } ⚠️ Важно: * readOnly = true не блокирует изменения в БД, если вы явно вызываете save() — это НЕ защита от дурака. * Hibernate всё равно создаст транзакцию — это не аннотация "без транзакций". ✅ Когда использовать: * Методы, которые только читают данные и не модифицируют сущности. * Большие выборки без нужды в lazy-инициализации через сессию. * Там, где критична производительность чтения. ❌ Когда НЕ нужно: * Если вы всё равно модифицируете сущности внутри метода. * Если работаете с @Modifying запросами — Spring их игнорирует при readOnly = true. 📎 Документация Spring @Transactional 👉 @java_geek
373