Параллельность в Java на практике
Как следует из названия, здесь будет только про параллельное выполнение (не путать с конкурентностью). Так же я не буду затрагивать проект Loom, который «должен убить» все остальные подходы написания параллельного кода. Надеюсь изложенное ниже позволит начинающим java программистам разобраться с разными подходами и структурировать имеющиеся знания.
https://habr.com/ru/articles/759054/
👉@BookJava
Как следует из названия, здесь будет только про параллельное выполнение (не путать с конкурентностью). Так же я не буду затрагивать проект Loom, который «должен убить» все остальные подходы написания параллельного кода. Надеюсь изложенное ниже позволит начинающим java программистам разобраться с разными подходами и структурировать имеющиеся знания.
https://habr.com/ru/articles/759054/
👉@BookJava
👍2
Совет
По умолчанию при обновлении сущности Hibernate обновляет все ее поля. Вы можете использовать аннотацию
👉@BookJava
По умолчанию при обновлении сущности Hibernate обновляет все ее поля. Вы можете использовать аннотацию
@DynamicUpdate
на объекте @Entity
и Hibernate будет обновлять только те столбцы, которые изменились.👉@BookJava
👍23👏1
Spring Boot ChatGPT Starter
Features
Base on Spring Boot 3.0+
Async with Spring Webflux
Support ChatGPT Chat Stream
Support ChatGPT functions: @ GPTFunction annotation
Prompt Management: load prompt templates from prompt.properties with @ PropertyKey, and friendly with IntelliJ IDEA
Prompt as Lambda: convert prompt template to lambda expression and call it with FP style
ChatGPT interface: Declare ChatGPT service interface with @ ChatGPTExchange and @ ChatCompletion annotations.
No third-party library: base on Spring 6 HTTP interface
GraalVM native image support
Azure OpenAI support
https://github.com/linux-china/chatgpt-spring-boot-starter
👉@BookJava
Features
Base on Spring Boot 3.0+
Async with Spring Webflux
Support ChatGPT Chat Stream
Support ChatGPT functions: @ GPTFunction annotation
Prompt Management: load prompt templates from prompt.properties with @ PropertyKey, and friendly with IntelliJ IDEA
Prompt as Lambda: convert prompt template to lambda expression and call it with FP style
ChatGPT interface: Declare ChatGPT service interface with @ ChatGPTExchange and @ ChatCompletion annotations.
No third-party library: base on Spring 6 HTTP interface
GraalVM native image support
Azure OpenAI support
https://github.com/linux-china/chatgpt-spring-boot-starter
👉@BookJava
GitHub
GitHub - linux-china/chatgpt-spring-boot-starter: Spring Boot ChatGPT Starter
Spring Boot ChatGPT Starter. Contribute to linux-china/chatgpt-spring-boot-starter development by creating an account on GitHub.
👍6
Динамическое создание слушателей в Kafka
План
Создадим шаблонный класс через реализацию интерфейса MessageListener.
Создадим KafkaListenerEndpoint с помощью шаблона.
Зарегестрируем эндпоинт в KafkaListenerEndpointRegistry.
Создадим окружение для тестирования.
Протестируем решение.
Заключение.
https://habr.com/ru/articles/758958/
👉@BookJava
План
Создадим шаблонный класс через реализацию интерфейса MessageListener.
Создадим KafkaListenerEndpoint с помощью шаблона.
Зарегестрируем эндпоинт в KafkaListenerEndpointRegistry.
Создадим окружение для тестирования.
Протестируем решение.
Заключение.
https://habr.com/ru/articles/758958/
👉@BookJava
👍4
Совет
В Hibernate 6 изменен способ чтения базового
👉@BookJava
В Hibernate 6 изменен способ чтения базового
JDBC
ResultSet
с чтения по имени на чтение по позиции. Благодаря этому изменению после обновления вы получите более чистые SQL-запросы без псевдонимов столбцов 👍.👉@BookJava
👍6
Управление памятью в Java: Введение
В языке Java управление памятью - это автоматический процесс, управляемый виртуальной машиной Java (JVM) и не требующий явного вмешательства. Java, будучи блочно-структурированным языком, использует модель, в которой память делится на два основных типа: стек и куча.
Локальные переменные и параметры методов используют память, основанную на "стеке". Эта область памяти автоматически увеличивается и уменьшается при входе и выходе из блока кода или метода соответственно. В ситуациях, когда системе запрашивается объем памяти, размер которого известен только во время выполнения программы или при создании объекта, эти запросы обычно удовлетворяются за счет области памяти процесса, называемой "динамической памятью" или "кучей". Строго говоря, бывает и так, что объект, предназначенный для кучи, записывается в стек, но мы оставим это обсуждение для более позднего документа.
https://foojay.io/today/java-memory-management/
👉@BookJava
В языке Java управление памятью - это автоматический процесс, управляемый виртуальной машиной Java (JVM) и не требующий явного вмешательства. Java, будучи блочно-структурированным языком, использует модель, в которой память делится на два основных типа: стек и куча.
Локальные переменные и параметры методов используют память, основанную на "стеке". Эта область памяти автоматически увеличивается и уменьшается при входе и выходе из блока кода или метода соответственно. В ситуациях, когда системе запрашивается объем памяти, размер которого известен только во время выполнения программы или при создании объекта, эти запросы обычно удовлетворяются за счет области памяти процесса, называемой "динамической памятью" или "кучей". Строго говоря, бывает и так, что объект, предназначенный для кучи, записывается в стек, но мы оставим это обсуждение для более позднего документа.
https://foojay.io/today/java-memory-management/
👉@BookJava
Аудит пользователей Spring Data JPA
Задача: в БД необходимо фиксировать кто создал сущность, кто её обновил, и кто её удалил.
Все знают, как взять пользователя из контекста и сунуть его в сущность. Допустим, на уровне сервиса в методе извлечь информацию о нём и «засетать» его в нужные поля (придётся везде таскать этот кусок кода по сервису), а с аспектами как‑то выглядит не явно и накладывает ряд обязательств (например, развешивание аннотаций над методами всякий раз, когда мы что‑то пытаемся сделать с сущностью (новые участники команды могут не знать о такой неявной практике, а старые забыть о ней)).
https://habr.com/ru/companies/nlmk/articles/757866/
👉@BookJava
Задача: в БД необходимо фиксировать кто создал сущность, кто её обновил, и кто её удалил.
Все знают, как взять пользователя из контекста и сунуть его в сущность. Допустим, на уровне сервиса в методе извлечь информацию о нём и «засетать» его в нужные поля (придётся везде таскать этот кусок кода по сервису), а с аспектами как‑то выглядит не явно и накладывает ряд обязательств (например, развешивание аннотаций над методами всякий раз, когда мы что‑то пытаемся сделать с сущностью (новые участники команды могут не знать о такой неявной практике, а старые забыть о ней)).
https://habr.com/ru/companies/nlmk/articles/757866/
👉@BookJava
👍6❤2
Forwarded from Книги по Java | Books Java 📚
Изучаем Java EE. Современное программирование для больших предприятий
Себастьян Дашнер (2018)
Java EE 8 - современная версия популярной платформы для программирования корпоративных приложений на языке Java. Новая версия платформы оптимизирована с учетом многочисленных технологических нововведений, среди которых - работа с контейнерами, улучшенные API для обеспечения безопасности, возможности работы с облачными хранилищами и микросервисной архитектурой. Java EE обеспечивает широкие возможности предметно-ориентированного проектирования (DDD), непрерывную интеграцию, работу по принципу DevOps, взаимодействие с Docker и Kubernetes.
Скачать
👉 @java_360
Себастьян Дашнер (2018)
Java EE 8 - современная версия популярной платформы для программирования корпоративных приложений на языке Java. Новая версия платформы оптимизирована с учетом многочисленных технологических нововведений, среди которых - работа с контейнерами, улучшенные API для обеспечения безопасности, возможности работы с облачными хранилищами и микросервисной архитектурой. Java EE обеспечивает широкие возможности предметно-ориентированного проектирования (DDD), непрерывную интеграцию, работу по принципу DevOps, взаимодействие с Docker и Kubernetes.
Скачать
👉 @java_360
👍4
Чем отличаются JRE, JVM И JDK?
JRE кратко - для работы. Java Runtime Environment (сокр. JRE) - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Состоит из виртуальной машины - Java Virtual Machine и библиотеки Java-классов.
JDK кратко - для программирования. Java Development Kit (сокращенно JDK) - бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).
Java Virtual Machine (сокращенно Java VM, JVM) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования.
👉@BookJava
JRE кратко - для работы. Java Runtime Environment (сокр. JRE) - минимальная реализация виртуальной машины, необходимая для исполнения Java-приложений, без компилятора и других средств разработки. Состоит из виртуальной машины - Java Virtual Machine и библиотеки Java-классов.
JDK кратко - для программирования. Java Development Kit (сокращенно JDK) - бесплатно распространяемый компанией Oracle Corporation (ранее Sun Microsystems) комплект разработчика приложений на языке Java, включающий в себя компилятор Java (javac), стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему Java (JRE).
Java Virtual Machine (сокращенно Java VM, JVM) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java интерпретирует Байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM может также использоваться для выполнения программ, написанных на других языках программирования.
👉@BookJava
👍4
Какие бывают проблемы с арифметикой в Java?
Переполнения.
Числа примитивных типов в Java хранятся в дискретной оперативной памяти компьютера и занимают фиксированный объем. Из этого вытекает ограничение диапазона возможных значений. Когда результат арифметической операции выпадает из диапазона, значение идет по кругу – максимальное становится минимальным, либо наоборот. Такая ситуация называется переполнение (underflow/overflow).
Решение: если опасность переполнения значима, помогут методы с суффиксом
Платформо-зависимые округления.
По умолчанию JVM производит арифметические вычисления насколько это возможно точно. Пределы точности могут зависеть от аппаратного обеспечения. Это неприемлемо для программ, к которым предъявляют строгие требования переносимости, когда результат вычислений должен быть одним и тем же на любом железе.
Решение: модификатор
ArithmeticException.
Операторы могут выбрасывать исключение. Это происходит, например, при делении на ноль. Это же исключение бросают безопасные методы из
Решение: неожиданное исключение обычно указывает на логическую ошибку. Лучший способ предотвратить логические ошибки – покрыть код Unit-тестами.
👉@BookJava
Переполнения.
Числа примитивных типов в Java хранятся в дискретной оперативной памяти компьютера и занимают фиксированный объем. Из этого вытекает ограничение диапазона возможных значений. Когда результат арифметической операции выпадает из диапазона, значение идет по кругу – максимальное становится минимальным, либо наоборот. Такая ситуация называется переполнение (underflow/overflow).
Решение: если опасность переполнения значима, помогут методы с суффиксом
*Exact
из классе Math. Это безопасные аналоги арифметических операций, которые бросают исключение в случае переполнения.Платформо-зависимые округления.
По умолчанию JVM производит арифметические вычисления насколько это возможно точно. Пределы точности могут зависеть от аппаратного обеспечения. Это неприемлемо для программ, к которым предъявляют строгие требования переносимости, когда результат вычислений должен быть одним и тем же на любом железе.
Решение: модификатор
strictfp
в объявлении класса или метода приводит точность вычислений к единой спецификации IEEE 754. За это может ухудшиться производительность и уменьшиться точность значений.ArithmeticException.
Операторы могут выбрасывать исключение. Это происходит, например, при делении на ноль. Это же исключение бросают безопасные методы из
Math
.Решение: неожиданное исключение обычно указывает на логическую ошибку. Лучший способ предотвратить логические ошибки – покрыть код Unit-тестами.
👉@BookJava
👍5
Совет
👉@BookJava
show-sql
- это самый простой (но не самый лучший!) способ увидеть SQL, сгенерированный Hibernate. Вы можете немного улучшить его, включив форматирование, показ JPQL-запроса, сгенерировавшего запрос, и включив подсветку, которая добавляет некоторый цвет к выводу.👉@BookJava
👍17
В чём преимущества и недостатки Spring Boot?
Основные сущности фреймворка Spring Boot – это стартеры. Зависимости с названиями вида s
Например, spring-boot-starter-data-jpa даст вам готовый комплект всего необходимого для использования JPA: драйвер, совместимую с ним версию Hibernate, библиотеки Persistence API и Spring Data. В контексте приложения появятся все нужные для JPA репозиториев бины.
Таким образом Spring Boot ускоряет и упрощает разработку, дает возможность избавиться от boilerplate-кода в проекте и сфокусироваться на бизнес-задачах. Это бывает особенно важно в микросервисной архитектуре, когда создается большое количество приложений.
С другой стороны, такая избыточность естественно приводит к большей тяжеловесности и медлительности приложения.
👉@BookJava
Основные сущности фреймворка Spring Boot – это стартеры. Зависимости с названиями вида s
pring-boot-starter-xxx
выполняют две основных задачи. Во-первых, они добавляют набор типичных сторонних библиотек-зависимостей; во-вторых, регистрируют типичные бины и их конфигурации. Кроме того, со Spring Boot в проекте появляется ряд таких полезностей, как embedded-сервер, конфигурация web-приложения без web.xml
, метрики, properties вынесенные из кода во внешние файлы.Например, spring-boot-starter-data-jpa даст вам готовый комплект всего необходимого для использования JPA: драйвер, совместимую с ним версию Hibernate, библиотеки Persistence API и Spring Data. В контексте приложения появятся все нужные для JPA репозиториев бины.
Таким образом Spring Boot ускоряет и упрощает разработку, дает возможность избавиться от boilerplate-кода в проекте и сфокусироваться на бизнес-задачах. Это бывает особенно важно в микросервисной архитектуре, когда создается большое количество приложений.
С другой стороны, такая избыточность естественно приводит к большей тяжеловесности и медлительности приложения.
👉@BookJava
👍5
Нельзя так просто взять и вычислить абсолютное значение
Кажется, задача вычисления абсолютного значения (или модуля) числа совершенно тривиальна. Если число отрицательно, давайте сменим знак. Иначе оставим как есть. На Java это будет выглядеть примерно так:
https://bookflow.ru/nelzya-tak-prosto-vzyat-i-vychislit-absolyutnoe-znachenie/
👉@BookJava
Кажется, задача вычисления абсолютного значения (или модуля) числа совершенно тривиальна. Если число отрицательно, давайте сменим знак. Иначе оставим как есть. На Java это будет выглядеть примерно так:
public static double abs(double value) {
if (value < 0) {
return -value;
}
return value;
}
https://bookflow.ru/nelzya-tak-prosto-vzyat-i-vychislit-absolyutnoe-znachenie/
👉@BookJava
👍4
Совет 💡
Добавьте в JDBC URL свойство
👉@BookJava
Добавьте в JDBC URL свойство
ApplicationName
(зависит от БД, не в каждой БД оно есть!). Таким образом, в списке сессий вместо имени JDBC-драйвера будет отображаться имя набора. Это поможет при поиске неисправностей, когда несколько приложений подключаются к одной и той же БД.👉@BookJava
👍8❤1👎1
Полиморфизм в java
Словарное определение полиморфизма относится к принципу биологии, в соответствии с которым организм или вид может иметь множество различных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и в то же время разделять некоторые функциональные возможности родительского класса.
https://bookflow.ru/polimorfizm-v-java/
👉@BookJava
Словарное определение полиморфизма относится к принципу биологии, в соответствии с которым организм или вид может иметь множество различных форм или стадий. Этот принцип также может быть применен к объектно-ориентированному программированию и таким языкам, как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и в то же время разделять некоторые функциональные возможности родительского класса.
https://bookflow.ru/polimorfizm-v-java/
👉@BookJava
👍3
14 советов по высокопроизводительной персистентности в Java
В этой статье я расскажу вам о различных советах по оптимизации высокопроизводительной Java Persistence, которые помогут вам получить максимальную отдачу от уровня доступа к данным.
Для создания высокопроизводительного уровня доступа к данным требуется много знаний о внутреннем устройстве баз данных, JDBC, JPA, Hibernate, и в этой статье обобщены некоторые из наиболее важных приемов, которые можно использовать для оптимизации корпоративного приложения.
https://vladmihalcea.com/14-high-performance-java-persistence-tips/
👉@BookJava
В этой статье я расскажу вам о различных советах по оптимизации высокопроизводительной Java Persistence, которые помогут вам получить максимальную отдачу от уровня доступа к данным.
Для создания высокопроизводительного уровня доступа к данным требуется много знаний о внутреннем устройстве баз данных, JDBC, JPA, Hibernate, и в этой статье обобщены некоторые из наиболее важных приемов, которые можно использовать для оптимизации корпоративного приложения.
https://vladmihalcea.com/14-high-performance-java-persistence-tips/
👉@BookJava
👍8❤1
Используем Neovim в качестве IDE для Java
Впервые я познакомился с Vim в университете, и с тех пор он был желанным спутником на протяжении большей части моей карьеры разработчика. Работа с программами на Python и Go казалась мне естественной с Vim, и я всегда чувствовал себя продуктивным. А вот Java была другим зверем. Когда появлялась возможность поработать с Java, я сначала пробовал Vim, но возвращался к IntelliJ и плагину IdeaVim, чтобы воспользоваться богатыми возможностями языка, которые открывает полноценная IDE.
К сожалению, у IntelliJ есть свои проблемы. В случайные, а иногда и в неподходящие моменты она просто перестаёт работать, пока не будут восстановлены все кэши, перезагружены проекты и не будет проведено полдня или больше за работой по устранению её неполадок. Пройдя через всю эту песню несколько месяцев назад, и глядя на прогресс в Vim, Neovim, спецификации протокола языкового сервера (Language Server Protocol, LSP) и их различных реализаций, я подумал, что, возможно, пришло время ещё раз взглянуть на использование Neovim в качестве Java IDE.
Возможно ли это? Да. Рекомендую ли я это делать? Возможно. Сошел ли я с ума? Возможно.
Поехали.
Rus https://habr.com/ru/articles/760234/
Eng https://sookocheff.com/post/vim/neovim-java-ide/
👉@BookJava
Впервые я познакомился с Vim в университете, и с тех пор он был желанным спутником на протяжении большей части моей карьеры разработчика. Работа с программами на Python и Go казалась мне естественной с Vim, и я всегда чувствовал себя продуктивным. А вот Java была другим зверем. Когда появлялась возможность поработать с Java, я сначала пробовал Vim, но возвращался к IntelliJ и плагину IdeaVim, чтобы воспользоваться богатыми возможностями языка, которые открывает полноценная IDE.
К сожалению, у IntelliJ есть свои проблемы. В случайные, а иногда и в неподходящие моменты она просто перестаёт работать, пока не будут восстановлены все кэши, перезагружены проекты и не будет проведено полдня или больше за работой по устранению её неполадок. Пройдя через всю эту песню несколько месяцев назад, и глядя на прогресс в Vim, Neovim, спецификации протокола языкового сервера (Language Server Protocol, LSP) и их различных реализаций, я подумал, что, возможно, пришло время ещё раз взглянуть на использование Neovim в качестве Java IDE.
Возможно ли это? Да. Рекомендую ли я это делать? Возможно. Сошел ли я с ума? Возможно.
Поехали.
Rus https://habr.com/ru/articles/760234/
Eng https://sookocheff.com/post/vim/neovim-java-ide/
👉@BookJava
👍4💩2
This media is not supported in your browser
VIEW IN TELEGRAM
Сортировка слиянием через рекурсию
В этот раз мы применим рекурсию для создания алгоритма сортировки слиянием.
В сети легко найти множество вариаций решения данной задачи. Код, который мы рассмотрим в этой статье, будет написан так, чтобы быть максимально простым для понимания начинающих разработчиков.
Освежим в памяти суть сортировки слиянием:
Изначальный массив делится пополам до тех пор, пока длина "половинок" не станет равна 1. Это - базовый случай. Затем элементы двух "половинок" сравниваются и заносятся в результирующий массив в порядке возрастания.
https://habr.com/ru/articles/710620/
👉@BookJava
В этот раз мы применим рекурсию для создания алгоритма сортировки слиянием.
В сети легко найти множество вариаций решения данной задачи. Код, который мы рассмотрим в этой статье, будет написан так, чтобы быть максимально простым для понимания начинающих разработчиков.
Освежим в памяти суть сортировки слиянием:
Изначальный массив делится пополам до тех пор, пока длина "половинок" не станет равна 1. Это - базовый случай. Затем элементы двух "половинок" сравниваются и заносятся в результирующий массив в порядке возрастания.
https://habr.com/ru/articles/710620/
👉@BookJava
👍7❤1
Как измерить производительность метода?
Если вы собираетесь оптимизировать код, или же выбрать лучшее с точки зрения производительности готовое решение, выбор необходимо подтвердить тестом производительности до и после. Такие тесты называются benchmark.
Первый вариант который приходит в голову – измерить время до, выполнить метод, посмотреть сколько времени прошло. У такого подхода есть ряд нюансов. Каждый последующий замер может случайным образом сильно отличаться от предыдущего. В реальном приложении результат будет совсем отличным от тестового, потому что виртуальная машина будет «прогретой»: заполнятся различные системные кэши, произойдут JIT-оптимизации горячего кода, память наполнится мусором.
Наивный подход может показать приблизительную производительность долгих операций: ввода-вывода, системных вызовов, или пользовательских сценариев на развернутом тестовом стенде. При тестировании кусков Java кода (в микробенчмарках) время выполнения очень мало, поэтому упомянутые нюансы вносят значительный вклад в результат.
Самое правильное решение – использовать готовый инструмент из JDK, JMH. Для этого его библиотеки добавляются в зависимости, а тестовый метод помечается аннотацией
👉@BookJava
Если вы собираетесь оптимизировать код, или же выбрать лучшее с точки зрения производительности готовое решение, выбор необходимо подтвердить тестом производительности до и после. Такие тесты называются benchmark.
Первый вариант который приходит в голову – измерить время до, выполнить метод, посмотреть сколько времени прошло. У такого подхода есть ряд нюансов. Каждый последующий замер может случайным образом сильно отличаться от предыдущего. В реальном приложении результат будет совсем отличным от тестового, потому что виртуальная машина будет «прогретой»: заполнятся различные системные кэши, произойдут JIT-оптимизации горячего кода, память наполнится мусором.
Наивный подход может показать приблизительную производительность долгих операций: ввода-вывода, системных вызовов, или пользовательских сценариев на развернутом тестовом стенде. При тестировании кусков Java кода (в микробенчмарках) время выполнения очень мало, поэтому упомянутые нюансы вносят значительный вклад в результат.
Самое правильное решение – использовать готовый инструмент из JDK, JMH. Для этого его библиотеки добавляются в зависимости, а тестовый метод помечается аннотацией
@Benchmark
. Тесты можно запускать в виде исполняемого jar-файла, либо вызовом специальных программных методов библиотеки. Итоги тестирования будут выведены в виде таблицы в консоль.👉@BookJava
👍4
Микросервисы на основе событий с Kafka Streams и Spring Boot
Всем привет! Это моя первая статья на Habr, так что не судите строго за стиль, а вот по содержанию буду рад любой конструктивной критике.
Статья основана на публикациях Confluent о том, как можно реализовать микросервисную архитектуру на основе событий с помощью Kafka Streams и KSQL.
https://habr.com/ru/articles/775900/
👉@BookJava
Всем привет! Это моя первая статья на Habr, так что не судите строго за стиль, а вот по содержанию буду рад любой конструктивной критике.
Статья основана на публикациях Confluent о том, как можно реализовать микросервисную архитектуру на основе событий с помощью Kafka Streams и KSQL.
https://habr.com/ru/articles/775900/
👉@BookJava
👍5