Чем отличается блокирующее чтение от неблокирующего?
В контексте Java речь в этом вопросе идет о блокирующем/неблокирующем чтении из потоков данных.
Классы блокирующего чтения находятся в пакете java.io. Вы наверняка много раз сталкивались с ними, работая с файлами и консольным вводом-выводом (классы Reader, IOException, InputStream). При блокирующем чтении тред останавливается, пока не получит из потока необходимые данные. Для этих самых распространенных случаев использование неблокирующего чтения не несет пользы, потому что сама запись пользователем консоли и жестким диском будет последовательной.
Чтение данных из сетевого подключения – другое дело. Обычно программа обрабатывает данные быстрее, чем работает сеть. Возникают паузы, в которые поток блокирующего чтения стоит в ожидании, не принося пользы. К тому же серверное приложение работает со многими параллельными подключениями.
Блокирующее чтение можно распараллеливать на потоки, читая в пулле. Но делать это нужно вручную, а количество одновременных подключений будет всё ещё ограничено количеством потоков-обработчиков, потоки буду всё ещё останавливаться без дела.
Для случаев, когда в вашем приложении ожидается большое количество подключений, был добавлен пакет стандартной библиотеки java.nio. С помощью NIO один тред может обслуживать несколько сетевых соединений одновременно, и переключаться между ними не теряя времени на ожидание данных.
IO использует потоки. данные приходят последовательно, и сами нигде не сохраняются. Если вы не обеспечили буферизацию вручную, нет возможности откатиться назад и прочитать уже пришедшие данные еще раз.
NIO сразу читает данные в буфер. Вы можете перемещаться по этому буферу перечитывая уже прочитанную ранее информацию. Плата за это – необходимость вручную следить, что буфер заполнен достаточным объемом данных для обработки, и что он не переполнился.
В этой статье приводится показательная аналогия. Блокирующее чтение – это телефонный разговор, неблокирующее – переписка в чате. Делая телефонный звонок, вы ждете пока собеседник ответит, можете «обрабатывать» только один звонок одновременно, получаете ответы сразу и не можете переслушать услышанный но забытый ответ. В мессенджере вы ведете несколько чатов одновременно, обращаетесь к истории переписки, но ответы на ваши сообщения приходят не всегда сразу, а порядок их получения неоднозначен.
В контексте Java речь в этом вопросе идет о блокирующем/неблокирующем чтении из потоков данных.
Классы блокирующего чтения находятся в пакете java.io. Вы наверняка много раз сталкивались с ними, работая с файлами и консольным вводом-выводом (классы Reader, IOException, InputStream). При блокирующем чтении тред останавливается, пока не получит из потока необходимые данные. Для этих самых распространенных случаев использование неблокирующего чтения не несет пользы, потому что сама запись пользователем консоли и жестким диском будет последовательной.
Чтение данных из сетевого подключения – другое дело. Обычно программа обрабатывает данные быстрее, чем работает сеть. Возникают паузы, в которые поток блокирующего чтения стоит в ожидании, не принося пользы. К тому же серверное приложение работает со многими параллельными подключениями.
Блокирующее чтение можно распараллеливать на потоки, читая в пулле. Но делать это нужно вручную, а количество одновременных подключений будет всё ещё ограничено количеством потоков-обработчиков, потоки буду всё ещё останавливаться без дела.
Для случаев, когда в вашем приложении ожидается большое количество подключений, был добавлен пакет стандартной библиотеки java.nio. С помощью NIO один тред может обслуживать несколько сетевых соединений одновременно, и переключаться между ними не теряя времени на ожидание данных.
IO использует потоки. данные приходят последовательно, и сами нигде не сохраняются. Если вы не обеспечили буферизацию вручную, нет возможности откатиться назад и прочитать уже пришедшие данные еще раз.
NIO сразу читает данные в буфер. Вы можете перемещаться по этому буферу перечитывая уже прочитанную ранее информацию. Плата за это – необходимость вручную следить, что буфер заполнен достаточным объемом данных для обработки, и что он не переполнился.
В этой статье приводится показательная аналогия. Блокирующее чтение – это телефонный разговор, неблокирующее – переписка в чате. Делая телефонный звонок, вы ждете пока собеседник ответит, можете «обрабатывать» только один звонок одновременно, получаете ответы сразу и не можете переслушать услышанный но забытый ответ. В мессенджере вы ведете несколько чатов одновременно, обращаетесь к истории переписки, но ответы на ваши сообщения приходят не всегда сразу, а порядок их получения неоднозначен.
👍12❤1🔥1
Как архитектору эффективно работать с принципом инверсии зависимостей?
Узнайте на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:
▫️определение и обоснование принципа инверсии зависимостей;
▫️примеры использования принципа в различных паттернах проектирования;
▫️связь принципа инверсии зависимостей с остальными принципами SOLID;
▫️связь паттерна Адаптер, луковичной архитектуры и принципа инверсии зависимостей.
Занятие пройдёт 13 марта в 20:00 мск в рамках курса «Архитектура и шаблоны проектирования». После урока у вас будет возможность стать студентом программы по специальной цене и даже в рассрочку!
👉🏻 Пройдите короткий тест прямо сейчас, чтобы посетить бесплатный урок и получить запись: пройти тест
Узнайте на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:
▫️определение и обоснование принципа инверсии зависимостей;
▫️примеры использования принципа в различных паттернах проектирования;
▫️связь принципа инверсии зависимостей с остальными принципами SOLID;
▫️связь паттерна Адаптер, луковичной архитектуры и принципа инверсии зависимостей.
Занятие пройдёт 13 марта в 20:00 мск в рамках курса «Архитектура и шаблоны проектирования». После урока у вас будет возможность стать студентом программы по специальной цене и даже в рассрочку!
👉🏻 Пройдите короткий тест прямо сейчас, чтобы посетить бесплатный урок и получить запись: пройти тест
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru🔥4🎉3❤1👍1
Из чего состоит пакет java.nio?
Этому вопросу посвящена отдельная страница документации. Если вы никогда раньше не сталкивались с Java NIO – это хорошее место для начала знакомства. Отвечая на этот вопрос, нужно перечислить и объяснить основные понятия NIO:
Буфферы. Временные хранилища фиксированного размера для транспортируемых данных. Именно буферизация – основное отличие неблокирующего чтения от java.io.
Каналы. Реализации интерфейса Channel – сущности, представляющие соединения между разными участниками ввода-вывода (файлы, сокеты, консоль).
Селекторы. Наследники класса Selector. «Мультиплексоры» каналов – комбинируют несколько каналов в один. Регистрация канала в селекторе возвращает SelectionKey, который содержит ссылку на сам канал, и ряд его атрибутов. Селектор позволяет выбрать из набора зарегистрированных каналов подмножество готовых к работе, при необходимости блокируя выполнение на время ожидания. Каналы и селекторы располагаются в пакете java.nio.channels. Полный пример использования селекторов можно найти в статье на baeldung.
Кодировки. Charset – то, как бинарные данные будут конвертироваться в родные для Java символы UTF-16 и обратно. Классы для работы с кодировками хранятся в пакете java.nio.charset.
Этому вопросу посвящена отдельная страница документации. Если вы никогда раньше не сталкивались с Java NIO – это хорошее место для начала знакомства. Отвечая на этот вопрос, нужно перечислить и объяснить основные понятия NIO:
Буфферы. Временные хранилища фиксированного размера для транспортируемых данных. Именно буферизация – основное отличие неблокирующего чтения от java.io.
Каналы. Реализации интерфейса Channel – сущности, представляющие соединения между разными участниками ввода-вывода (файлы, сокеты, консоль).
Селекторы. Наследники класса Selector. «Мультиплексоры» каналов – комбинируют несколько каналов в один. Регистрация канала в селекторе возвращает SelectionKey, который содержит ссылку на сам канал, и ряд его атрибутов. Селектор позволяет выбрать из набора зарегистрированных каналов подмножество готовых к работе, при необходимости блокируя выполнение на время ожидания. Каналы и селекторы располагаются в пакете java.nio.channels. Полный пример использования селекторов можно найти в статье на baeldung.
Кодировки. Charset – то, как бинарные данные будут конвертироваться в родные для Java символы UTF-16 и обратно. Классы для работы с кодировками хранятся в пакете java.nio.charset.
👍8
Как узнать IP по имени хоста?
Для этого в пакете java.net стандартной библиотеки существует класс InetAddress, и два его наследника – Inet4Address и Inet6Address, для IPv4 и IPv6 соответственно.
Один хост может разрешаться в несколько адресов. Статический метод getAllByName возвращает по хосту список IP (представленных классами InetAddress). При неудачном разрешении выбрасывается UnknownHostException. Метод getByName вернет один, первый попавшийся хост. Разрешенный адрес хоста сохраняется в кэше.
На работу классов пакета java.net влияют некоторые сетевые настройки JVM. До Java 9 можно было сконфигурировать службу для разрешения имен (DNS). Обратите внимание, теперь такая возможность пропала, и всегда используется стандартная служба системы.
Для этого в пакете java.net стандартной библиотеки существует класс InetAddress, и два его наследника – Inet4Address и Inet6Address, для IPv4 и IPv6 соответственно.
Один хост может разрешаться в несколько адресов. Статический метод getAllByName возвращает по хосту список IP (представленных классами InetAddress). При неудачном разрешении выбрасывается UnknownHostException. Метод getByName вернет один, первый попавшийся хост. Разрешенный адрес хоста сохраняется в кэше.
На работу классов пакета java.net влияют некоторые сетевые настройки JVM. До Java 9 можно было сконфигурировать службу для разрешения имен (DNS). Обратите внимание, теперь такая возможность пропала, и всегда используется стандартная служба системы.
👍8👏2
Пройди тест по Java от OTUS
Проверь насколько хорошо ты знаешь Java и готов к прокачке!
Ответишь — пройдешь на продвинутый курс "Java Developer. Advanced" от OTUS по специальной цене, а также получишь доступ к записям открытых уроков курса.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Forwarded from Java библиотека
Какой результат выведет следующая программа?
Anonymous Quiz
21%
static1A
16%
static123A
22%
1
12%
123staticA
8%
1staticA
21%
staticA
👍12🤔6🔥4❤2⚡2
Готовы улучшить свое владение Java?
Присоединяйся к нашему каналу - https://t.iss.one/java_secrets 📲
Свежие советы, лучшие практики, примеры кода и обсуждения, чтобы стать настоящим профессионалом в программировании на Java.
Повышай свой уровень!
Присоединяйся к нашему каналу - https://t.iss.one/java_secrets 📲
Свежие советы, лучшие практики, примеры кода и обсуждения, чтобы стать настоящим профессионалом в программировании на Java.
Повышай свой уровень!
❤8👍2🔥1
Как написать простейшее клиент-серверное приложение?
Без применения дополнительных библиотек, основа низкоуровневого сетевого взаимодействия в Java строится на двух классах: Socket и ServerSocket.
Socket – клиентское подключение. Отправляет запросы и получает ответы с заданного порта/адреса по TCP/IP-соединению. Наследники могут реализовывать протоколы более высокого уровня сетевого стека, например SSLSocket. Похож на утилиту netcat из Unix-систем. Обслуживает одно подключение к серверу, обменивается данными через InputStream и OutputStream.
ServerSocket – сервер, приёмник подключений. Занимает на машине заданный свободный порт, и в одиночку принимает все подключения к нему. Опционально можно задать свой адрес, если текущая машина доступна по нескольким, а сокет должен быть доступен только по одному из них.
Ключевой метод серверного сокета – accept(). Вызов этого метода блокирует исполнение до тех пор, пока не придет новый запрос от клиента. Возвращает пришедший запрос в виде экземпляра класса Socket. Чтобы сделать сервер параллельным, accept() должен вызываться в параллельных потоках.
Стандартную внутреннюю реализацию сокетов можно подменить, установив для них статическую фабрику типа SocketImplFactory, методом setSocketFactory().
Для высокоуровневых (HTTP, FTP) запросов в стандартной библиотеке есть класс URLConnection и его наследники.
Полный пример клиент-серверного приложения доступен в туториале на сайте Oracle.
Без применения дополнительных библиотек, основа низкоуровневого сетевого взаимодействия в Java строится на двух классах: Socket и ServerSocket.
Socket – клиентское подключение. Отправляет запросы и получает ответы с заданного порта/адреса по TCP/IP-соединению. Наследники могут реализовывать протоколы более высокого уровня сетевого стека, например SSLSocket. Похож на утилиту netcat из Unix-систем. Обслуживает одно подключение к серверу, обменивается данными через InputStream и OutputStream.
ServerSocket – сервер, приёмник подключений. Занимает на машине заданный свободный порт, и в одиночку принимает все подключения к нему. Опционально можно задать свой адрес, если текущая машина доступна по нескольким, а сокет должен быть доступен только по одному из них.
Ключевой метод серверного сокета – accept(). Вызов этого метода блокирует исполнение до тех пор, пока не придет новый запрос от клиента. Возвращает пришедший запрос в виде экземпляра класса Socket. Чтобы сделать сервер параллельным, accept() должен вызываться в параллельных потоках.
Стандартную внутреннюю реализацию сокетов можно подменить, установив для них статическую фабрику типа SocketImplFactory, методом setSocketFactory().
Для высокоуровневых (HTTP, FTP) запросов в стандартной библиотеке есть класс URLConnection и его наследники.
Полный пример клиент-серверного приложения доступен в туториале на сайте Oracle.
👍15🔥2🥰2
Проверь насколько хорошо ты знаешь Java и готов освоить Spring!
Ответишь — пройдешь на продвинутый курс "Разработчик на Spring Framework" от OTUS по специальной цене.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1🥴1
Чем синхронный сервер отличается от асинхронного?
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
Вопрос может быть сформулирован как «сравните Jetty и Netty», или «зачем нужен Spring WebFlux».
Большинство современных Java web-серверов синхронные. Это значит, что для каждого пришедшего HTTP-запроса выделяется отдельный поток. Даже если такой поток переиспользуется с помощью пула, он остается занятым до конца обработка запроса.
Таким образом, если каждый запрос выполняется одну секунду, то при всего лишь 2000 запросов в секунду сервер расходует 2000 потоков. Потоки в ОС – ограниченный ресурс, и не важно как сконфигурирован ваш сервер – в какой-то момент производительность резко просядет.
Альтернативное решение – асинхронные сервера. В них для потоков обработки HTTP-запросов используется work stealing. В широком смысле, вызовы асинхронных функций не блокируют выполнение, а их результат вместо return value возвращается параметром коллбэка. В Java этот результат зачастую возвращается в виде объекта Future.
Чтобы вся обработка запроса стала действительно асинхронной, необходимо также избавиться от блокирующих операций. Иначе преимущество подхода с work stealing выродится в простой пул потоков. Блокирующая работа с файлами и сетью должна быть заменена на NIO, а для БД должен быть использован асинхронный драйвер.
🔥13👏4👍2🥴2
Как написать на Java UDP-сервер?
Естественно, сначала необходимо разобраться, что такое UDP. Упрощая, User Datagram Protocol – это альтернатива TCP, когда информацию нужно слать быстро, много, и при этом допустимы потери и дублирование данных. Типичные примеры использования – потоковое видео и аудио, интернет-телефония, торренты.
В Java данные, которые планируется отправить клиентам по протоколу UDP, упаковываются в объект класса DatagramPacket. В виде массива байтов их передают в конструктор.
Для отправки и получения информации используется DatagramSocket. Он похож на ServerSocket, который применяют для создания TCP-сервера. Для приёма сообщений используется блокирующий метод receive, для отправки – send. Примечательно, что оба метода принимают DatagramPacket параметром. В случае receive его байтовый массив заполняется пришедшими данными.
Для реализации клиентской стороны используется тот же самый DatagramSocket. Просто он создается несвязанным (unbound) – в его конструкторе не указывается порт. Адрес и порт, на которые нужно отправить сообщение, устанавливаются через конструктор DatagramPacket.
В Java NIO доступна версия UDP-сокета в виде канала – DatagramChannel.
Естественно, сначала необходимо разобраться, что такое UDP. Упрощая, User Datagram Protocol – это альтернатива TCP, когда информацию нужно слать быстро, много, и при этом допустимы потери и дублирование данных. Типичные примеры использования – потоковое видео и аудио, интернет-телефония, торренты.
В Java данные, которые планируется отправить клиентам по протоколу UDP, упаковываются в объект класса DatagramPacket. В виде массива байтов их передают в конструктор.
Для отправки и получения информации используется DatagramSocket. Он похож на ServerSocket, который применяют для создания TCP-сервера. Для приёма сообщений используется блокирующий метод receive, для отправки – send. Примечательно, что оба метода принимают DatagramPacket параметром. В случае receive его байтовый массив заполняется пришедшими данными.
Для реализации клиентской стороны используется тот же самый DatagramSocket. Просто он создается несвязанным (unbound) – в его конструкторе не указывается порт. Адрес и порт, на которые нужно отправить сообщение, устанавливаются через конструктор DatagramPacket.
В Java NIO доступна версия UDP-сокета в виде канала – DatagramChannel.
👍13🔥1
С бесплатного открытого урока «Многопоточность в Java» от OTUS!
На вебинаре мы:
Поговорим об организации многопоточной обработки на Java, обсудим когда ее стоит применять и какие проблемы возникают при ее использовании.
Занятие подойдет:
Тем, кто только начинает программировать на Java или думает о начале обучения программированию.
В результате:
Вы получите понимание, что такое многопоточное программирование и как это делается на языке Java
Занятие пройдёт 19 марта в 20:00 мск и будет приурочено к старту курса «Специализация Java-разработчик».
👉🏻Для бесплатного участия и получения записи урока регистрируйтесь прямо сейчас: регистрация
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2
Что такое 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 тем, что здесь логика протокола находится не на внешнем промежуточном слое, а прямо в самом драйвере.
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 тем, что здесь логика протокола находится не на внешнем промежуточном слое, а прямо в самом драйвере.
👍10🔥3
🎙Спикер Александр Царев — Tech Lead в Сбере и кандидат технических наук.
На вебинаре вы:
- узнаете, что такое дамп памяти, как его собрать и какие инструменты существуют для этих целей;
- познакомитесь с инструментом Eclipse Memory Analyzer, с помощью которого можно исследовать дампы памяти;
- получите ответы на все свои вопросы.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Как выбрать между Statement, PreparedStatement и CallableStatement?
Statement – SQL-выражение, подготовленное к выполнению в рамках определенной JDBC-сессии. Выполняется методом execute для обычного выражения, executeUpdate для модифицирующего, executeBatch для пакетного. Когда ожидаемый размер результата больше Integer.MAX_VALUE, используются версии методов executeLarge*.
После выполнения, экземпляр Statement владеет ResultSet-ом, и другими данными о результате выполнения, такими как количество обновленных записей и сгенерированные ключи.
PreparedStatement – предскомпилированная версия Statement, его наследник. Эффективнее выполняет одно и то же выражение множество раз. Входные параметры объявляются в SQL-выражении символом ?, следом сеттерами задаются их типы и значения. Делегирует обязанность экранировать введенные пользователем параметры базе данных.
CallableStatement – наследник PreparedStatement для вызова хранимых процедур. Кроме входных параметров, позволяет регистрировать выходные.
Экземпляры всех трех типов создаются методами интерфейса Connection.
Statement – SQL-выражение, подготовленное к выполнению в рамках определенной JDBC-сессии. Выполняется методом execute для обычного выражения, executeUpdate для модифицирующего, executeBatch для пакетного. Когда ожидаемый размер результата больше Integer.MAX_VALUE, используются версии методов executeLarge*.
После выполнения, экземпляр Statement владеет ResultSet-ом, и другими данными о результате выполнения, такими как количество обновленных записей и сгенерированные ключи.
PreparedStatement – предскомпилированная версия Statement, его наследник. Эффективнее выполняет одно и то же выражение множество раз. Входные параметры объявляются в SQL-выражении символом ?, следом сеттерами задаются их типы и значения. Делегирует обязанность экранировать введенные пользователем параметры базе данных.
CallableStatement – наследник PreparedStatement для вызова хранимых процедур. Кроме входных параметров, позволяет регистрировать выходные.
Экземпляры всех трех типов создаются методами интерфейса Connection.
❤7🥰1
Бесплатный практический урок 💥«Эффекты в Scala на примере ZIO»💥
🔥 Спикер Алексей Воронец — руководитель разработки в «NAUMEN». На вебинаре:
- узнаем о предпосылках и истории возникновения ZIO;
- сформируем представление, какие задачи решают так называемые «функциональные эффекты» в целом и ZIO в частности;
- попрактикуемся в создании и комбинировании ZIO-эффектов.
Занятие пройдёт 25 марта в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!
👉 Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://otus.pw/biKL/
🔥 Спикер Алексей Воронец — руководитель разработки в «NAUMEN». На вебинаре:
- узнаем о предпосылках и истории возникновения ZIO;
- сформируем представление, какие задачи решают так называемые «функциональные эффекты» в целом и ZIO в частности;
- попрактикуемся в создании и комбинировании ZIO-эффектов.
Занятие пройдёт 25 марта в 20:00 мск в рамках курса «Scala-разработчик». Доступна рассрочка на обучение!
👉 Регистрируйтесь прямо сейчас, чтобы посетить бесплатный урок и получить запись: https://otus.pw/biKL/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru👍2🔥1
Какие классы вовлечены в соединение с базой данных?
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-ом.
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-ом.
👍11👏3❤1🔥1
23 марта, в субботу, SM Lab проводит Spring Day Offer для Java-разработчиков.
📍 Программа Spring Day Offer, 23 марта:
● Тестовые задания. Проверим уровень ваших навыков.
● Техтолки. В перерывах между тестовыми заданиями с докладами выступят наши ведущие специалисты.
● Знакомство с командами. Успешные кандидаты познакомятся с командами и узнают, какие задачи им предстоит решать.
● Кульминация! Оффер! Успешно прошедшие все этапы кандидаты в этот же день получат от нас предложение о работе.
📍 Мы ждем, что вы:
● Java-разработчик с опытом работы на Spring от 3-х лет;
● стремитесь расти и развиваться;
● хотите делать качественные ИТ-продукты и развивать ритейл в России;
● понимаете важность командной работы и стремитесь к ней.
🔥 Если вам интересно — до 19 марта зарегистрируйтесь на лендинге, и с вами свяжутся.
Остались вопросы? Пишите сюда: [email protected]
erid: LjN8KPrEt
📍 Программа Spring Day Offer, 23 марта:
● Тестовые задания. Проверим уровень ваших навыков.
● Техтолки. В перерывах между тестовыми заданиями с докладами выступят наши ведущие специалисты.
● Знакомство с командами. Успешные кандидаты познакомятся с командами и узнают, какие задачи им предстоит решать.
● Кульминация! Оффер! Успешно прошедшие все этапы кандидаты в этот же день получат от нас предложение о работе.
📍 Мы ждем, что вы:
● Java-разработчик с опытом работы на Spring от 3-х лет;
● стремитесь расти и развиваться;
● хотите делать качественные ИТ-продукты и развивать ритейл в России;
● понимаете важность командной работы и стремитесь к ней.
🔥 Если вам интересно — до 19 марта зарегистрируйтесь на лендинге, и с вами свяжутся.
Остались вопросы? Пишите сюда: [email protected]
erid: LjN8KPrEt
👍5🔥2❤1
Что можно делать с классом Connection?
Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.
Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..
В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.
Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
Итак, в результате соединения JDBC драйвера создается объект Connection – сессия работы с базой данных. Это главный класс при работе с JDBC. Основная роль этого класса – исполнение SQL-выражений (Statement) и получение их результатов в виде ResultSet.
Connection предоставляет в виде класса DatabaseMetaData мета-информацию о базе данных в целом: таблицы, поддерживаемая грамматика SQL, хранимые процедуры, возможности этого соединения, и т.д..
В коннекшне задается множество настройки самого соединения. Это уровень изоляции транзакций, режим авто-коммита, ключи шардирования, и многое другое. Маппинг типов данных SQL в Java-типы задается здесь же, свойством typeMap.
Помимо выполнения выражений, Connection предоставляет средства для управления транзакциями. Его методами можно создать Savepoint, откатиться к нему, закоммитить транзакцию когда авто-коммит отключен.
👍14
🔥 Какие актуальные технологии нужно знать для разработки на Spring?
🎙 Расскажет Александр Оруджев — Senior Software Engineer. Встречаемся на бесплатном практическом уроке от OTUS, где вы вместе с опытным экспертом разберете:
📅 Занятие пройдёт 20 марта в 20:00 мск и будет приурочено к старту курса «Разработчик на Spring Framework». Доступна рассрочка на обучение!
👉 Пройдите короткий тест прямо сейчас, чтобы занять место на открытом уроке и получить запись: https://otus.pw/EHOI/
- паттерны Controller, Service и Repository;
- какую пользу они могут принести;
- особенности использования данных шаблонов в Spring.
📅 Занятие пройдёт 20 марта в 20:00 мск и будет приурочено к старту курса «Разработчик на Spring Framework». Доступна рассрочка на обучение!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruPlease open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1