Если вы работаете с PostgreSQL в условиях высокой нагрузки или больших объемов данных, оптимизация становится ключевым элементом успеха.
Вот несколько советов, которые помогут повысить производительность вашей базы данных:
👉 Переходите по ссылке
Please open Telegram to view this post
VIEW IN TELEGRAM
🔒 Pessimistic vs Optimistic Locking
🔵 Pessimistic Locking
- Запись недоступна для других потоков до тех пор, пока текущий поток не закончит работу с ней.
- Даже чтение данных другими потоками невозможно, пока лок не снят.
- Пример: EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.
- Минусы: снижает производительность при высоком уровне конкурентного доступа.
- Когда применять: при критической необходимости точности данных.
🔵 Optimistic Locking
- Не блокирует данные при чтении, но проверяет версию записи при сохранении.
- Пример: аннотация @Version в JPA (колонка для хранения версии).
- Если версия изменена другим потоком, выбрасывается OptimisticLockException.
- Минусы: требует обработки конфликтов.
- Когда применять: при большом количестве чтений и низкой вероятности конфликтов.
💬 Какой подход вы чаще используете в своих проектах?
- Запись недоступна для других потоков до тех пор, пока текущий поток не закончит работу с ней.
- Даже чтение данных другими потоками невозможно, пока лок не снят.
- Пример: EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.
- Минусы: снижает производительность при высоком уровне конкурентного доступа.
- Когда применять: при критической необходимости точности данных.
- Не блокирует данные при чтении, но проверяет версию записи при сохранении.
- Пример: аннотация @Version в JPA (колонка для хранения версии).
- Если версия изменена другим потоком, выбрасывается OptimisticLockException.
- Минусы: требует обработки конфликтов.
- Когда применять: при большом количестве чтений и низкой вероятности конфликтов.
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 Розыгрыш от Proglib Academy и DigitalRazor!
С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!
🎁 Призы для участников акции:
– Игровой ПК DigitalRazor ProGaming
– VIP-пакет курса Proglib Academy
💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.
Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.
📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.
Выбрать курс
С 27 ноября по 27 декабря у вас есть шанс не только прокачать свои навыки, но и выиграть ПК при покупке любого курса Академии!
🎁 Призы для участников акции:
– Игровой ПК DigitalRazor ProGaming
– VIP-пакет курса Proglib Academy
💡 Как принять участие?
Купите любой курс Proglib Academy с 27 ноября по 27 декабря и получите шанс выиграть мощный ПК.
Приобретите технику DigitalRazor — участвуйте в розыгрыше VIP курса.
📅 Вместе с DigitalRazor мы создали спецпредложение -50% на курсы до 30 ноября, чтобы вы могли начать обучение на более выгодных условиях.
Выбрать курс
Forwarded from Библиотека Go-разработчика | Golang
This media is not supported in your browser
VIEW IN TELEGRAM
⚡️ Напоминаем: у нас можно (и нужно) купить рекламу
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
→ Более 60 телеграм-каналов по всем направлениям IT
→ Почти 1,2 миллиона аудитории
→ Собственное медиа и сайт с DAU 25 000 — можем усилить продвижение
→ Классные email-рассылки
→ И, конечно же, крутые контент-менеджеры, которые сделают нативную интеграцию/придумают виральный пост/реализуют любые контентные предпочтения
Для заказа пишите сюда: @proglib_adv
🏢📊 Как сократить расходы на инфраструктуру в 20 раз: опыт внедрения мультитенантной архитектуры
Снизить затраты на инфраструктуру в десятки раз — не фантастика, а реальность. Мультитенантная архитектура помогает не только экономить деньги, но и упрощает подключение новых клиентов, масштабирование и обслуживание системы. Такой подход значительно облегчает работу и открывает новые возможности для роста.
Хотите узнать, как правильно её внедрить, избежать типичных ошибок и достичь впечатляющих результатов? Ознакомьтесь с реальным опытом, который вдохновит на изменения.🍹
🔗 Читать статью
🔗 Зеркало
Снизить затраты на инфраструктуру в десятки раз — не фантастика, а реальность. Мультитенантная архитектура помогает не только экономить деньги, но и упрощает подключение новых клиентов, масштабирование и обслуживание системы. Такой подход значительно облегчает работу и открывает новые возможности для роста.
Хотите узнать, как правильно её внедрить, избежать типичных ошибок и достичь впечатляющих результатов? Ознакомьтесь с реальным опытом, который вдохновит на изменения.
🔗 Читать статью
🔗 Зеркало
Please open Telegram to view this post
VIEW IN TELEGRAM
🤔🔥🪦 Беспощадный Frontend-тест: уволься сам, если не наберешь 7 из 10!
Эй! Среди нас есть Java-разработчики, которые считают себя фулстеком? Или те, кто хоть раз открывал HTML и CSS? Кто тут настоящий универсал, а кто только на бэк готов.
👉 Проверяем тут.
Эй! Среди нас есть Java-разработчики, которые считают себя фулстеком? Или те, кто хоть раз открывал HTML и CSS? Кто тут настоящий универсал, а кто только на бэк готов.
👉 Проверяем тут.
GraphQL — это язык запросов и среда выполнения для API. Его основная цель — предоставить клиентам возможность запрашивать только те данные, которые действительно нужны, и делать это гибко, без избыточности. Это мощная альтернатива REST API, которая делает взаимодействие между клиентом и сервером более эффективным и удобным.
Клиент сам определяет, какие данные ему нужны, задавая структуру запроса. Сервер возвращает только запрошенные поля, ничего лишнего.
Пример:
query {
user(id: "1") {
name
}
}
Ответ:
{
"data": {
"user": {
"name": "John Doe",
"email": "[email protected]"
}
}
}
В отличие от REST, где для разных операций используются разные URL (например, /users, /posts), в GraphQL всё взаимодействие происходит через единый эндпоинт, например, /graphql.
Можно запрашивать сложные связанные данные в одном запросе.
Пример:
query {
user(id: "1") {
name
posts {
title
comments {
text
}
}
}
}
Ответ:
{
"data": {
"user": {
"name": "John Doe",
"posts": [
{
"title": "My First Post",
"comments": [
{ "text": "Great post!" },
{ "text": "Very helpful, thanks!" }
]
}
]
}
}
}
GraphQL API имеет чётко описанную схему данных. Это позволяет клиентам знать, какие поля доступны, и снижает вероятность ошибок.
Пример схемы:
type User {
id: ID!
name: String!
email: String!
posts: [Post]
}
type Post {
id: ID!
title: String!
comments: [Comment]
}
type Comment {
id: ID!
text: String!
}
GraphQL поддерживает не только чтение данных, но и их изменение через мутации.
Пример мутации:
mutation {
createUser(input: { name: "Jane", email: "[email protected]" }) {
id
name
}
}
Ответ:
{
"data": {
"createUser": {
"id": "2",
"name": "Jane",
"email": "[email protected]"
}
}
}
Позволяет клиенту получать обновления в реальном времени. Это особенно полезно для чатов, уведомлений и других событий.
Пример:
subscription {
messageAdded {
id
text
}
}
- Экономия трафика: Возвращает только запрошенные данные.
- Меньше запросов: Вложенные данные можно получить за один запрос.
- Документация встроена в схему: Инструменты вроде GraphiQL позволяют изучать API прямо в процессе разработки.
- Гибкость для клиентов: Клиент управляет структурой ответа.
- Требуется больше усилий для проектирования схемы и серверной логики.
- Возможны слишком сложные запросы, которые могут перегружать сервер.
- Сложнее настроить кеширование.
Please open Telegram to view this post
VIEW IN TELEGRAM
💼🔀 «Хочу уволиться, но боюсь»: что делать
«Завтра напишу заявление об увольнении» — фраза, которую многие повторяют каждый понедельник, но так и не решаются на перемены. Сегодня поговорим о том, как перестать саботировать собственную карьеру и научиться управлять страхом перемен. Спойлер: дело не в лени и не в комфортной зарплате.
👉 Читать статью
👉 Зеркало
«Завтра напишу заявление об увольнении» — фраза, которую многие повторяют каждый понедельник, но так и не решаются на перемены. Сегодня поговорим о том, как перестать саботировать собственную карьеру и научиться управлять страхом перемен. Спойлер: дело не в лени и не в комфортной зарплате.
👉 Читать статью
👉 Зеркало
Forwarded from Библиотека собеса по Java | вопросы с собеседований
— Как определить, является ли заданное бинарное дерево деревом поиска (BST)?
- Бинарное дерево поиска (BST) — это бинарное дерево, в котором для каждого узла все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше.
- Для проверки можно использовать рекурсивный подход с отслеживанием допустимых диапазонов значений для каждого узла.
- Как изменить реализацию для работы с любыми типами данных в узлах дерева?
Реализация с числами в узлах на картинке 👆🏻
Please open Telegram to view this post
VIEW IN TELEGRAM
Откуда вы сейчас читаете нас?
Anonymous Poll
59%
Россия
7%
Беларусь
6%
Украина
6%
Казахстан
0%
Армения
1%
Грузия
1%
США
6%
Страна ЕС
2%
Солнечное Бали 🌴
12%
Другое
Фасад — это структурный паттерн, который предоставляет унифицированный интерфейс для работы с набором сложных подсистем. Он скрывает сложность системы и упрощает взаимодействие с ней, предоставляя более простой и понятный API для клиента.
Использование:
🔹 Когда система состоит из множества классов, и нужно упростить доступ к её функционалу.
🔹 Когда нужно предоставить клиенту единый интерфейс для работы с несколькими подсистемами.
🔹 Когда необходимо уменьшить зависимость между клиентом и сложной системой, скрыв внутренние детали реализации.
Преимущества:
Недостатки:
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Подпишись на нашу еженедельную email-рассылку, чтобы быть в курсе последних открытий и тенденций в мире бэкенда.
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
В еженедельных письмах ты найдешь:
● Языки программирования и фреймворки для бэкенда
● Архитектура и проектирование серверных приложений
● Базы данных и управление данными
● Безопасность и защита данных
● Облачные технологии и DevOps
● API и интеграции
● Тестирование и отладка
● Инструменты и утилиты для бэкенд-разработчиков
● Лучшие практики и паттерны проектирования
👉Подписаться👈
Forwarded from Java jobs — вакансии для java-разработчиков
#дайджест #Javadevjob
Вакансии Java разработчиков уровня Junior
▪️ Junior Java Developer
Гибрид (Санкт-Петербург), Just AI
Подробнее
▪️ Junior Java Developer
Офис (Москва) / Удалёнка, Trend Soft
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик
Офис (Москва), Газпромбанк
Подробнее
▪️ Java Developer (middle+)
Удалёнка, ОЦРВ
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java-разработчик (проект СЭД)
Офис (Москва), Гринатом
Подробнее
▪️ Java Developer + ELK
Удалёнка, Hoff Tech
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
Вакансии Java разработчиков уровня Junior
▪️ Junior Java Developer
Гибрид (Санкт-Петербург), Just AI
Подробнее
▪️ Junior Java Developer
Офис (Москва) / Удалёнка, Trend Soft
Подробнее
Вакансии Java разработчиков уровня Middle
▪️ Java-разработчик
Офис (Москва), Газпромбанк
Подробнее
▪️ Java Developer (middle+)
Удалёнка, ОЦРВ
Подробнее
Вакансии Java разработчиков уровня Senior
▪️ Java-разработчик (проект СЭД)
Офис (Москва), Гринатом
Подробнее
▪️ Java Developer + ELK
Удалёнка, Hoff Tech
Подробнее
Понравились вакансии?
❤️ — да
🤔 — нет
spb.hh.ru
Вакансия Junior Java Developer в Санкт-Петербурге, работа в компании Just AI (вакансия в архиве c 20 декабря 2024)
Зарплата: не указана. Санкт-Петербург. Требуемый опыт: не требуется. Полная. Дата публикации: 11.12.2024.
Задачи, которые требуют асинхронного выполнения, могут стать настоящей головной болью, если использовать устаревшие методы. Однако, есть мощный инструмент — CompletableFuture, который упрощает работу с параллельными вычислениями, обеспечивая гибкость, читаемость и исключение возможных ошибок в многозадачности. Статья содержит интересный пример использования этого инструмента. В ней описана реализация веб-сканера, который будет по ссылкам искать новости, посвященные хакингу.
Please open Telegram to view this post
VIEW IN TELEGRAM
volatile — это ключевое слово, которое используется для указания компилятору и JVM, что значение переменной может изменяться из нескольких потоков. Это гарантирует, что чтение и запись переменной будут происходить непосредственно в основной памяти, а не в кэше процессора, что позволяет избежать различных проблем синхронизации между потоками.
▪️ Синхронизация чтения и записи: Переменная, помеченная как volatile, всегда будет читать свое значение из основной памяти, а не из локальных кешей потоков.
▪️ Обеспечение видимости: Когда один поток изменяет значение переменной, все другие потоки немедленно видят эти изменения.
▪️ Отсутствие блокировок: В отличие от использования synchronized, volatile не блокирует выполнение потоков, что делает его более легковесным способом синхронизации.
Когда использовать volatile?
- Когда переменная должна быть доступна для записи и чтения несколькими потоками, но нет необходимости в сложной синхронизации (например, для флагов, флагов завершения, индикаторов состояний).
- В случаях, когда нужно просто гарантировать видимость изменений, но не требуется атомарность или операции с несколькими шагами (для этих случаев лучше использовать synchronized или java.util.concurrent).
Пример:
public class VolatileExample {
private static volatile boolean flag = false;
public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
try {
Thread.sleep(1000); // эмулируем задержку
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
flag = true;
System.out.println("Flag set to true");
});
Thread reader = new Thread(() -> {
while (!flag) {
}
System.out.println("Flag is now true");
});
writer.start();
reader.start();
writer.join();
reader.join();
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🧑💻 Статьи для IT: как объяснять и распространять значимые идеи
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Напоминаем, что у нас есть бесплатный курс для всех, кто хочет научиться интересно писать — о программировании и в целом.
Что: семь модулей, посвященных написанию, редактированию, иллюстрированию и распространению публикаций.
Для кого: для авторов, копирайтеров и просто программистов, которые хотят научиться интересно рассказывать о своих проектах.
👉Материалы регулярно дополняются, обновляются и корректируются. А еще мы отвечаем на все учебные вопросы в комментариях курса.
Привет, друзья! 👋
2024-й год подходит к концу, и пока LLM не написали за нас все программы, а квантовые компьютеры не взломали все пароли, самое время подвести итоги. Какие технологии действительно «выстрелили», а какие не оправдали ожиданий? Что изменилось в работе разработчиков, и какие навыки оказались самыми востребованными?
💻 Поделитесь своим мнением, и самое важное и интересное войдет в нашу статью. 🏆
2024-й год подходит к концу, и пока LLM не написали за нас все программы, а квантовые компьютеры не взломали все пароли, самое время подвести итоги. Какие технологии действительно «выстрелили», а какие не оправдали ожиданий? Что изменилось в работе разработчиков, и какие навыки оказались самыми востребованными?
💻 Поделитесь своим мнением, и самое важное и интересное войдет в нашу статью. 🏆
Forwarded from Библиотека собеса по Java | вопросы с собеседований
Проблема бриллианта (или Diamond Problem) — это ситуация, которая возникает в языках программирования с поддержкой множественного наследования. Она заключается в том, что если один класс наследует два или более класса, которые имеют общий предок, то возникает неопределенность, с какого родительского класса должны быть унаследованы члены (методы или поля).
В Java множественное наследование классов не поддерживается, но проблема все равно может возникнуть при использовании интерфейсов.
interface A {
void method();
}
interface B extends A {
@Override
default void method() {
System.out.println("Method from B");
}
}
interface C extends A {
@Override
default void method() {
System.out.println("Method from C");
}
}
class D implements B, C { }
public class Main {
public static void main(String[] args) {
D d = new D();
d.method(); // Какая версия метода будет вызвана?
}
}
Когда класс D реализует оба интерфейса B и C, которые оба предоставляют дефолтные реализации метода method(), возникает неопределенность — какую версию метода должен использовать класс D? При компиляции будет выброшен error: class D inherits unrelated defaults for method() from types B and C.
Это решается с помощью явного переопределения метода в классе D, что позволяет избежать конфликтов.
class D implements B, C {
@Override
public void method() {
B.super.method();
// или можно использовать C.super.method(), если хотите вызвать метод из C
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM