Java Guru 🤓
13.3K subscribers
926 photos
15 videos
781 links
Канал с вопросами и задачами с собеседований!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrSQZ

Мы на бирже: telega.in/channels/javatasks/card?r=lcDuijdm

#ZOWBB
Download Telegram
Как узнать IP по имени хоста?

Для этого в пакете java.net стандартной библиотеки существует класс InetAddress, и два его наследника – Inet4Address и Inet6Address, для IPv4 и IPv6 соответственно.

Один хост может разрешаться в несколько адресов. Статический метод getAllByName возвращает по хосту список IP (представленных классами InetAddress). При неудачном разрешении выбрасывается UnknownHostException. Метод getByName вернет один, первый попавшийся хост. Разрешенный адрес хоста сохраняется в кэше.

На работу классов пакета
java.net влияют некоторые сетевые настройки JVM. До Java 9 можно было сконфигурировать службу для разрешения имен (DNS). Обратите внимание, теперь такая возможность пропала, и всегда используется стандартная служба системы.

Java Guru🤓 #java
👍84🔥3
Как написать простейшее клиент-серверное приложение?

Без применения дополнительных библиотек, основа низкоуровневого сетевого взаимодействия в Java строится на двух классах: Socket и ServerSocket.

Socket – клиентское подключение. Отправляет запросы и получает ответы с заданного порта/адреса по TCP/IP-соединению. Наследники могут реализовывать протоколы более высокого уровня сетевого стека, например SSLSocket. Похож на утилиту netcat из Unix-систем. Обслуживает одно подключение к серверу, обменивается данными через InputStream и OutputStream.

ServerSocket – сервер, приёмник подключений. Занимает на машине заданный свободный порт, и в одиночку принимает все подключения к нему. Опционально можно задать свой адрес, если текущая машина доступна по нескольким, а сокет должен быть доступен только по одному из них.

Ключевой метод серверного сокета – accept(). Вызов этого метода блокирует исполнение до тех пор, пока не придет новый запрос от клиента. Возвращает пришедший запрос в виде экземпляра класса Socket. Чтобы сделать сервер параллельным, accept() должен вызываться в параллельных потоках.

Стандартную внутреннюю реализацию сокетов можно подменить, установив для них статическую фабрику типа SocketImplFactory, методом setSocketFactory().

Для высокоуровневых (HTTP, FTP) запросов в стандартной библиотеке есть класс URLConnection и его наследники.

Полный пример клиент-серверного приложения доступен в
туториале на сайте Oracle.

Java Guru🤓 #java
8🔥4👍2
⁉️ Монолит или микросервисы? Руководство для архитекторов, которые ценят свои нервы

Приглашаем на открытый урок.

🗓 17 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Software Architect».

📌 Что будет на вебинаре:
✔️ Как не попасть в ловушку “модных” микросервисов;
✔️ Разбор признаков, что пора выходить из монолита;
✔️ Архитектурные паттерны для перехода к микросервисам (Strangler Fig, BFF, Self-contained systems);
✔️ Организационные и технические риски — что точно пойдёт не так и как это предсказать;
✔️ Роль DevOps, CI/CD и мониторинга в выборе архитектуры.

🎯 После вебинара вы:
- Получите пошаговое руководство по выбору архитектуры под ваш проект;
- Научитесь оценивать реальные риски и стоимость микросервисов;
- Поймёте, как внедрять архитектурные изменения без сбоев и хаоса;
- Увидите, как принимать взвешенные архитектурные решения, сохраняя технический контроль и производительность команды.

💡 Идеальный вебинар для тех, кто хочет перестать "архитектурить на ощущениях" и начать действовать стратегически.

🎁 Всем участникам вебинара дарим промокод, который дает скидку на обучение - SoftwareArc_06

👉 Регистрация на вебинар: https://vk.cc/cMJ4Lo

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍3🔥2
Чем синхронный сервер отличается от асинхронного?

Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».

Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.

Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.

Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.

Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.


Java Guru🤓 #java
👍115🔥5
Как написать на Java UDP-сервер?

Естественно, сначала необходимо разобраться, что такое UDP. Упрощая, User Datagram Protocol – это альтернатива TCP, когда информацию нужно слать быстро, много, и при этом допустимы потери и дублирование данных. Типичные примеры использования – потоковое видео и аудио, интернет-телефония, торренты.

В Java данные, которые планируется отправить клиентам по протоколу UDP, упаковываются в объект класса DatagramPacket. В виде массива байтов их передают в конструктор.

Для отправки и получения информации используется DatagramSocket. Он похож на ServerSocket, который применяют для создания TCP-сервера. Для приёма сообщений используется блокирующий метод receive, для отправки – send. Примечательно, что оба метода принимают DatagramPacket параметром. В случае receive его байтовый массив заполняется пришедшими данными.

Для реализации клиентской стороны используется тот же самый DatagramSocket. Просто он создается несвязанным (unbound) – в его конструкторе не указывается порт. Адрес и порт, на которые нужно отправить сообщение, устанавливаются через конструктор DatagramPacket.

В Java NIO доступна версия UDP-сокета в виде канала – DatagramChannel.


Java Guru🤓 #java
🔥8👍43
Что такое JDBC-драйвер? Какие бывают типы?

JDBC – Java DataBase Connectivity – соединение с базами данных на Java. Это стандарт взаимодействия с БД. Его интерфейс поставляется в стандартной JDK в виде пакета java.sql. Какой бы библиотекой для работы с базой данных вы ни пользовались, в ее основе почти всегда лежит низкоуровневый JDBC.

JDBC-драйвер – реализация JDBC для определенной базы данных. В приложении может быть зарегистрировано несколько разных драйверов. При соединении к базе, нужный выбирается исходя из URL соединения. Например, для jdbc:mysql://localhost:3306/db_name будет использован MySQL JDBC драйвер (при наличии). Драйверы делятся на 4 типа:

Тип 1 – JDBC-ODBC мост. Делегирует работу с базой установленному в системе ODBC-драйверу. Платформозависимый. Не поддерживается с Java 8.

Тип 2 – Native API. Делегирует работу с базой библиотеке, установленной в системе. Платформозависимый. Библиотеки в отличие от ODBC специфичны для конкретной базы, поэтому такой драйвер обычно работает быстрее.

Тип 3 – драйвер сетевого протокола. Работает с промежуточным слоем (JavaEE сервером приложений), который транслирует запросы в сетевой протокол, с которым работает конкретная БД. Такой драйвер полностью реализован на Java.

Тип 4 – драйвер протокола БД/тонкий драйвер. Полная реализация протокола взаимодействия с базой данных. Отличается от типа 3 тем, что здесь логика протокола находится не на внешнем промежуточном слое, а прямо в самом драйвере.


Java Guru🤓 #java
👍10🔥64
Как выбрать между Statement, PreparedStatement и CallableStatement?

Statement – SQL-выражение, подготовленное к выполнению в рамках определенной JDBC-сессии. Выполняется методом execute для обычного выражения, executeUpdate для модифицирующего, executeBatch для пакетного. Когда ожидаемый размер результата больше Integer.MAX_VALUE, используются версии методов executeLarge*.

После выполнения, экземпляр Statement владеет ResultSet-ом, и другими данными о результате выполнения, такими как количество обновленных записей и сгенерированные ключи.

PreparedStatement – предскомпилированная версия Statement, его наследник. Эффективнее выполняет одно и то же выражение множество раз. Входные параметры объявляются в SQL-выражении символом ?, следом сеттерами задаются их типы и значения. Делегирует обязанность экранировать введенные пользователем параметры базе данных.

CallableStatement – наследник PreparedStatement для вызова хранимых процедур. Кроме входных параметров, позволяет регистрировать выходные.

Экземпляры всех трех типов создаются методами интерфейса Connection.


Java Guru🤓 #java
4👍3🔥3
😱 Топ 12 нововведений IntelliJ IDEA и Amplicode 2025.1

Недавно состоялись сразу два крупных обновления. И IntelliJ IDEA и Amplicode зарелизились с новыми версиями 2025.1.
 
Среди улучшений поддержка Java 24, Kotlin Notebook, DB-клиент от Amplicode, улучшения по генерации Docker Image для Spring Boot приложения и многое другое.

Подробности можно прочитать на сайте.

 Или посмотреть в удобном видео-формате.
СМОТРЕТЬ НА YOUTUBE
СМОТРЕТЬ В VK ВИДЕО
СМОТРЕТЬ НА RUTUBE 

#реклама
О рекламодателе
❤‍🔥43👍2
Какие классы вовлечены в соединение с базой данных?

DriverManager управляет всеми JDBC-драйверами в приложении. Представляет набор статических методов. Лениво загружает системным класслоадером доступные предсконфигурированные драйверы:
• По списку полных имен классов из проперти jdbc.drivers;
• Через Service Provider Interface (SPI).

Менеджер занимается созданием экземпляра Connection – ключевого класса при работе с базой данных. Альтернативный менеджеру (и даже рекомендуемый) способ соединения с источником данных – ConnectionBuilder. Билдер получают из javax.sql.DataSource – формально это часть Java EE, так что здесь не будем подробно на нем останавливаться.

Driver – главный класс реализации JDBC-драйвера. Когда загружается класслоадером, сам регистрирует себя в DriverManager. Так что кроме предсконфигурированных драйверов, дополнительные можно загрузить просто вызвав Class.forName.

Можно явно создавать Connection через драйвер, минуя менеджера и билдер. Драйвер предоставляет информацию о возможных/требуемых для своей работы свойствах в виде массива DriverPropertyInfo.

DriverAction – дополнительный интерфейс, который должен реализовывать Driver, если хочет получать уведомления о разрегистрации DriverManager-ом.


Java Guru🤓 #java
5👍2🔥2
👩‍💻 JPQL: как писать запросы, которые не сломают Hibernate

Узнайте, как писать JPQL-запросы, которые ускорят Hibernate в 5 раз, избегая критических ошибок, тормозящих 80% проектов!

Приглашаем на открытый урок

🗓 19 июня в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Professional».

🎯 О чём поговорим:
✔️- JPQL vs SQL: почему ваши запросы ломают Hibernate и как их переписать так, чтобы БД не «умирала» под нагрузкой.
✔️ Тайные ловушки: антипаттерны JPQL, генерирующие N+1 SELECT и тормозящие приложение, и методы их поиска в коде.
✔️ Оптимизация на максимум: как использовать JOIN FETCH, подзапросы и кэширование в JPQL для мгновенного ускорения Hibernate.

👥 Кому будет интересно:
Java-разработчикам, использующим Hibernate, системным архитекторам и инженерам по оптимизации производительности.

💡В результате урока вы:
Научитесь писать эффективные JPQL-запросы, избегать распространённых ошибок и значительно ускорять работу Hibernate-приложений.

🎁 Дарим промокод, который дает скидку на обучение - JAVA_06

🔗 Ссылка на регистрацию: https://vk.cc/cMJos3

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2🔥2
Что можно делать с классом Connection?

Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.

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

В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.

Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.


Java Guru🤓 #java
🔥43👍2
Какая разница между @⁠ElementCollection, @⁠OneToMany и @⁠ManyToMany?

Все эти аннотации – часть Java Persistence API. С их использованием мы регулярно сталкиваемся в реализациях JPA, таких как Hibernate.

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

@⁠OneToMany и @⁠ManyToMany хранят вложенные объекты как отдельные полноценные сущности – для них действуют всё те же требования, которые JPA выдвигает для всех
@Entity классов. Каждая из аннотаций отвечает за свое отношение.

@⁠ElementCollection создает коллекцию встраиваемых классов. Применять её можно только на коллекции, тип элементов которых помечен
@Embeddable, или входит в список стандартных встраиваемых классов (обертки примитивов, строки, даты, и т.д.).

На уровне хранения в реляционной базе, для
@ElementCollection будет также создана отдельная таблица. Технически она будет находиться в отношении one-to-many.

Но из Java кода коллекция будет выглядеть встроенной: её элементом не нужно иметь собственные id, ими нельзя манипулировать отдельно от основной сущности. Единственное, чем такая коллекция отличается от встроенного поля-примитива – её можно загружать лениво (включено по умолчанию).


Java Guru🤓 #java
👍64🔥3
Для чего служит Java KeyStore?

KeyStore и TrustStore – это хранилища криптографических публичных и приватных ключей и сертификатов. Обычно они представляются файлами формата .jks, .dks, .p12, и другими, в зависимости от типа хранилища.

Для манипуляций над файлами хранилищ в JDK поставляется специальная утилита – keytool. Отдельные ключи разных типов добавляются в хранилище под заданными именами (alias). Еще этот файл называют базой данных сертификатов. Этот файл обычно защищен паролем.

KeyStore и TrustStore устроены похоже, но служат разным целям. KeyStore хранит данные о нашем приложении, тогда как TrustStore – о других, которым мы доверяем.

По умолчанию не подключается никакой KeyStore. Подключить его можно параметрами javax.net.ssl.keyStore (расположение файла), javax.net.ssl.keyStoreType (тип) и javax.net.ssl.keyStorePassword (пароль). Добавочные можно загружать динамически, классом java.security.KeyStore.

По умолчанию в приложении подключен один TrustStore, файл jre/lib/security/cacerts. Переопределить его можно параметрами JVM javax.net.ssl.trustStore, javax.net.ssl.trustStorePassword и javax.net.ssl.trustStorePassword.

Типичный пример использования – подключить TrustStore с самоподписанным SSL сертификатом, чтобы приложение могло ходить на определенный сайт по протоколу HTTPS, не проваливая проверку безопасности. Либо же подключить KeyStore с подлинным SSL сертификатом, чтобы приложение само работало как HTTPS-сервер.


Java Guru🤓 #java
🔥7👍32
Как приложению ограничить доступ к файлу?

В целях безопасности, весь доступ приложения к определенным частям кода и ресурсам может быть ограничен. Решения о доступе к, например, Reflection API, или к файлу принимаются менеджером безопасности.

Внутри менеджера представлен набор методов check*(), которые делегируют выполнение основному методу checkPermission(). Сам доступ, права на который нужно проверить, представляется классом java.security.Permission. Так, доступ к файлу на чтение проверяет метод checkRead. Он передает в checkPermission объект FilePermission с указанным именем файла.

Экземпляр класса SecurityManager, который реализует нужную логику ограничения доступа, можно установить программно методом System.setSecurityManager, или на старте приложения флагом -Djava.security.manager. По умолчанию менеджер не установлен.

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


Java Guru🤓 #java
🔥9👍3
Как прочитать криптографический ключ?

KeyFactory – основной класс платформы Java для работы с криптографическими ключами. Набор реализаций для этой фабрики подключается с помощью механизма SPI.

Существует большое разнообразие алгоритмов шифрования: DSA, RSA, и другие. Строка-название нужного алгоритма поставляется в фабрику ключей при её создании.

KeyFactory занимается конвертацией спецификации ключа в сам публичный или приватный ключ, и обратно.

Спецификация, объект интерфейса KeySpec, – входные данные ключа. Это может быть например модуль и экспонента приватного ключа RSA.

Сами внутренние представления ключей реализуют интерфейсы PublicKey и PrivateKey – наследники общего Key.

Для каждого конкретного типа ключа используются соответствующие им классы-реализации интерфейсов.


Java Guru🤓 #java
👍8🔥54
Как создать пару публичный/приватный ключ?

Не следует путать генерацию ключей с задачей их чтения, о которой здесь писали ранее.

Для генерации ключей используется KeyPairGenerator. Архитектурно он похож на читающую ключи KeyFactory: реализации для разных алгоритмов также поставляются через SPI, доступ к ним также осуществляется через getInstance.

Перед использованием, генератор нужно инициализировать. Для этого методом initialize устанавливаются три опциональных параметра:
• Желаемый размер ключа;
• Источник случайных значений типа SecureRandom;
• Специфичные для алгоритма настройки в объекте подкласса AlgorithmParameterSpec.

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

Сам метод генерации generateKeyPair не требует параметров. Его можно вызывать повторно для генерации нескольких разных пар. Результат его вызова – объект KeyPair, который просто хранит под уже знакомыми нам интерфейсами PrivateKey и PublicKey пару инстансов специфичных для алгоритма подклассов.


Java Guru🤓 #java
🔥63👍3
В чём разница между jar и war?

jar и war – расширения платформо-независимых файлов-архивов Java-приложения. Кроме них есть еще третий формат, ear. Все эти форматы – на самом деле просто zip-архивы с классами и другими частями приложения. Вы можете переименовать такой файл в .zip, разархивировать, и посмотреть, что внутри.

JAR – Java Archive. Содержит файлы классов, ресурсы, зависимые библиотеки, и другие необходимые для приложения файлы. Может содержать точку входа, и использоваться как цель для исполнения команды java.

WAR – Web Archive. Технически имеет ту же структуру, но другую роль – архив JavaEE web-компонента. Обычно содержит jar-ы с реализацией, JSP, статические файлы фронт-энда, и мета-информацию для сервлет-контейнера (web.xml). В основном используется как деплоймент web-приложения в сервлет-контейнер. С приходом Servlet API 3.0 и embedded-контейнеров, всё больше становится принято запаковывать и web-компоненты в самодостаточные jar (Лозунг Spring Boot: Make jar, not war).

EAR – Enterprise Archive. Для разработчиков, начавших карьеру уже во времена Spring Framework, может показаться совсем экзотичным. Это собранное воедино монолитное JavaEE приложение. Содержит дескрипторы деплоймента и JavaEE модули (веб-модули, EJB, клиентские модули, адаптеры ресурсов). Деплоится в JavaEE Application Server.

Все три типа файлов собираются утилитой jar из JDK.


Java Guru🤓 #java
🔥176👍3
Как отладить удаленное приложение?

Если приложение работает не в продакшне, его паузы допустимы, а у потенциального злоумышленника нет сетевого доступа к хосту, стандартный способ отладки – непосредственно remote debug. Для этого приложение запускается с включенным протоколом удаленной отладки JDWP. Приложение принимает на указанный порт подключения отладчика. Это может быть отдельная утилита jdb, или встроенная в IDE.

В JDK поставляется набор инструментов для мониторинга. Например Java Mission Control и JConsole позволяют подключиться к приложению и посмотреть множество показателей его здоровья. Полный список инструментов специфичен для конкретной JVM, для HotSpot можно посмотреть в
документации.

Вне зависимости от обстоятельств, всегда необходимо заранее позаботиться о диагностической информации номер один – логах. Как минимум, ни один встроенный инструмент не покажет вам информацию о событиях, определяемых бизнес-логикой вашего приложения. Логироваться должен необходимый минимум, который позволит при любом инциденте понять, что произошло.

В стандартную поставку Java включен пакет для логгирования java.util.logging, позже остановимся на нём подробнее. Также существует ряд популярных библиотек: Log4j, SLF4J, Logback.


Java Guru🤓 #java
👍9🔥5
🧠 Хочешь проектировать, как архитектор, а не просто писать код? Проверь, готов ли ты!

Шаблоны проектирования и архитектура — база для опытного разработчика, который хочет строить устойчивые системы и принимать технические решения.
Пройди входной тест, оцени уровень и получи скидку на курс «Архитектура и шаблоны проектирования».

На курсе ты научишься:

Применять архитектурные и поведенческие паттерны
Делить ответственность между слоями системы
Мыслить на уровне модулей и контекстов
Выстраивать архитектуру, понятную бизнесу и команде

📍 Тест покажет, насколько ты готов выйти на новый уровень.

🎁После успешного прохождения курса отправим промокод со скидкой и онлайн курс по Git в записи

👉 Попробовать
https://vk.cc/cMSKPm

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
4👍2🔥2❤‍🔥1
Когда использовать WEB-INF, а когда META-INF?

В корне архива java-приложения часто встречаются директории WEB-INF и META-INF. Обе директории хранят в себе различные файлы с метаинформацией о программе, обычно в текстовом виде: yaml, xml, json, обычный текст.

META-INF используется в архивах всех типов. Главный файл этой директории – MANIFEST.MF, о котором уже говорили ранее. Там же хранятся
• Объявления провайдеров SPI;
• Подпись архива: файлы .SF, .DSA, .RSA;
• INDEX.LIST с подсказками о местонахождении пакетов для загрузчика.
Иногда (не часто) приложения добавляют туда свои статические ресурсы, так как эта директория попадает в classpath и доступна в рантайме.

WEB-INF используется только в web-архивах (.war). Она не заменяет, но дополняет META-INF. В ней хранится:
• Главный файл web-приложения web.xml;
• Дескрипторы тегов .TLD;
• Поддиректория classes/ с классами web-приложения;
• Поддиректория lib/ с .jar-библиотеками зависимостей;
• Поддиректория tag/ с файлами тегов.


Java Guru🤓 #java
👍76🔥3