Транзакции должны соответствовать принципу ACID:
- Atomicity (атомарность) — выполняется вся транзакция или ничего.
- Consistency (согласованность) — данные переходят из одного корректного состояния в другое.
- Isolation (изолированность) — параллельные транзакции не мешают друг другу.
- Durability (долговечность) — после коммита данные сохраняются, даже при сбое.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11💊2
В HTML теги
<dl>, <dt>, <dd> используются для создания списка определений. Этот список обычно применяется для отображения терминов и их описаний. это контейнер, в котором размещаются определения.
обозначает термин, который нужно определить.
содержит описание или расшифровку термина.
<dl>
<dt>HTML</dt>
<dd>Язык разметки для создания веб-страниц.</dd>
<dt>CSS</dt>
<dd>Язык стилей, используемый для оформления HTML-документов.</dd>
<dt>JavaScript</dt>
<dd>Язык программирования, который добавляет интерактивность на веб-страницы.</dd>
</dl>
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊17👍6🤔3
- Статическое связывание происходит во время компиляции (например, перегруженные методы).
- Динамическое связывание происходит во время выполнения (например, переопределённые методы в полиморфизме).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥1
Шардирование – это метод горизонтального разделения базы данных на несколько частей (шардов) для повышения производительности и масштабируемости.
Данные делятся по диапазону значений (например,
ID 1–1000, 1001–2000). Данные распределяются с помощью хеш-функции.
int shardNumber = userId % numberOfShards;
Данные разделяются по географическому признаку (например, Европа, Азия, США). Минимальная задержка (пользователь получает данные ближе к себе)
Некоторые регионы могут перегружаться.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Стек — это структура данных LIFO (последний вошёл — первый вышел).
В JVM стек создаётся для каждого потока и хранит:
- кадры вызова методов (stack frames);
- локальные переменные;
- информацию для возврата результата и адрес следующей инструкции.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
Это компонент, который отвечает за отправку логов в различные места назначения, такие как файлы, консоль, базы данных, сетевые сокеты или даже удаленные серверы. Каждый Appender реализует конкретный способ обработки и хранения логов.
Appender позволяет гибко управлять тем, куда и как сохраняются логи. В зависимости от требований приложения, вы можете:
Писать логи в файл.
Выводить их в консоль.
Отправлять их в удалённые хранилища или базы данных.
Логи выводятся в консоль.
Полезно для разработки и отладки.
<Appender type="Console" name="ConsoleAppender">
<Target>System.out</Target>
</Appender>
Логи записываются в файл.
Используется для длительного хранения логов.
<Appender type="File" name="FileAppender">
<FileName>logs/app.log</FileName>
<Append>true</Append>
</Appender>
Расширение FileAppender с возможностью ротации логов (ограничение размера файла, создание новых файлов при переполнении).
<Appender type="RollingFile" name="RollingFileAppender">
<FileName>logs/app.log</FileName>
<FilePattern>logs/app-%d{yyyy-MM-dd}.log</FilePattern>
<Policies>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
</Appender>
Логи записываются в файл, который ротационно создаётся каждый день.
<Appender type="DailyRollingFile" name="DailyRollingAppender">
<FileName>logs/app.log</FileName>
<DatePattern>.yyyy-MM-dd</DatePattern>
</Appender>
Отправляет логи через сеть (TCP или UDP).
Используется для централизованного логирования.
Записывает логи в базу данных.
<Appender type="JDBC" name="JDBCAppender">
<ConnectionSource>
<DriverManagerConnectionSource>
<DriverClass>org.h2.Driver</DriverClass>
<Url>jdbc:h2:mem:logdb</Url>
<User>sa</User>
</DriverManagerConnectionSource>
</ConnectionSource>
<TableName>log_table</TableName>
</Appender>
Вот пример конфигурации с использованием нескольких Appender
XML-конфигурация
<Configuration>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level: %msg%n"/>
</Console>
<File name="FileAppender" fileName="logs/app.log">
<PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss} [%t] %-5level: %msg%n"/>
</File>
</Appenders>
<Loggers>
<Root level="info">
<AppenderRef ref="ConsoleAppender"/>
<AppenderRef ref="FileAppender"/>
</Root>
</Loggers>
</Configuration>
Java-конфигурация
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class Main {
private static final Logger logger = LogManager.getLogger(Main.class);
public static void main(String[] args) {
logger.info("This is an info log");
logger.error("This is an error log");
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
С помощью:
ApplicationContext ctx = new AnnotationConfigApplicationContext(MyConfig.class);
или:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Это создаёт новый изолированный контекст, не связанный с текущим.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍4
Когда разработчик пушит код, он проходит несколько этапов перед развертыванием в продакшене. Этот процесс автоматизируется с помощью CI/CD (Continuous Integration / Continuous Deployment).
- Код отправляется в GitHub, GitLab, Bitbucket или другой репозиторий.
- Открывается Pull Request (PR) для ревью.
git add .
git commit -m "Добавлена новая фича"
git push origin feature-branch
После пуша CI-сервер (Jenkins, GitHub Actions, GitLab CI/CD, CircleCI)** запускает автоматические тесты и сборку.
Клонирование репозитория.
Сборка проекта (например,
mvn package для Java). Запуск юнит-тестов (
JUnit, Mockito). Запуск интеграционных тестов (например,
TestContainers). Анализ кода (SonarQube).
name: CI Pipeline
on:
push:
branches:
- main
- develop
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Setup Java
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Build project
run: mvn clean package
- name: Run tests
run: mvn test
После успешного CI код автоматически разворачивается в стейджинг (staging) – это тестовая среда, похожая на продакшен.
Развёртывание может происходить с помощью:
Docker + Kubernetes (K8s)
AWS CodeDeploy, GitLab CD
Terraform + Ansible
FROM openjdk:17
COPY target/app.jar /app.jar
CMD ["java", "-jar", "/app.jar"]
Проверяется чистота кода, читаемость и ошибки.
В некоторых компаниях код проходит Security Review
git merge feature-branch
git push origin main
Blue-Green Deployment – новый код разворачивается на отдельном сервере, затем трафик переключается.
Canary Release – новый код деплоится на 5-10% пользователей, если всё хорошо – на всех.
Rolling Deployment – обновление происходит поэтапно, без даунтайма.
deploy:
stage: deploy
noscript:
- kubectl apply -f deployment.yaml
only:
- main
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14🤔1💊1
Обе создают бин, но:
-
-
В плане регистрации в контексте — поведение одинаковое.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
Forwarded from easyoffer
Напоминаю, что в честь релиза запускаем акцию.
Первые 500 покупателей получат:
🚀 Скидку 50% на PRO тариф на 1 год
🎁 Подарок ценностью 5000₽ для тех, кто подписан на этот канал
🔔 Подпишитесь на этот канал: https://news.1rj.ru/str/+b2fZN17A9OQ3ZmJi
В нем мы опубликуем сообщение о релизе в первую очередь
Please open Telegram to view this post
VIEW IN TELEGRAM
Inversion of Control (IoC) — это принцип проектирования, при котором управление созданием и жизненным циклом объектов передаётся внешней системе.
Без IoC код сильно зависит от конкретных классов, что усложняет тестирование и поддержку.
class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // Прямое создание зависимости ❌
}
}С IoC (зависимость передаётся извне)
class Car {
private final Engine engine;
public Car(Engine engine) { // Зависимость передаётся через конструктор
this.engine = engine;
}
}IoC достигается через паттерны проектирования, такие как:
Dependency Injection (DI) – передача зависимостей извне (через конструктор, поле или метод).
Factory Method – создание объектов через фабрики.
Event-driven подход – реакция на события вместо явного вызова методов.
Spring реализует IoC через контейнер IoC, который управляет созданием объектов (бинов) и их зависимостями.
@Component
class Engine {}
@Component
class Car {
private final Engine engine;
@Autowired
public Car(Engine engine) { // Spring автоматически передаст нужный объект
this.engine = engine;
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Event Sourcing — это подход, при котором вся история изменений состояния хранится как последовательность событий.
Плюсы:
- можно восстановить любое состояние;
- идеален для аудита и CQRS.
Минусы:
- сложно мигрировать;
- высокая сложность чтения без проекций.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍1
Использование строк в качестве ключей в
HashMap очень распространено, потому что строки обладают рядом свойств, которые идеально подходят для этой задачи. Вот основные причины:Что это значит: После создания строка не может быть изменена (все операции над строками создают новый объект).
Почему это важно: Ключ в
HashMap должен быть неизменяемым, потому что, если ключ изменится после его добавления, это нарушит работу хэш-таблицы. Например, HashMap больше не сможет найти объект по этому ключу.HashMap<String, Integer> map = new HashMap<>();
String key = "hello";
map.put(key, 1);
// key остается "hello", ничего не ломается
Что это значит: Класс
String в Java имеет качественно реализованные методы hashCode() и equals(), которые оптимизированы для работы с большими наборами данных.Почему это важно: Эти методы определяют, куда ключ попадет в
HashMap (по хэш-коду) и сравнивают ключи (по equals), чтобы избежать коллизий.Особенность: Алгоритм
hashCode() у строки быстро вычисляет хэш-код на основе её символов.String str1 = "hello";
String str2 = "hello";
System.out.println(str1.hashCode() == str2.hashCode()); // true
Что это значит: Строки легко создавать, читать и понимать. Они часто используются для идентификаторов (например, имён, адресов, кодов).
Почему это важно: Программистам удобно использовать строки в качестве ключей, потому что их легко интерпретировать.
Что это значит* Строки могут представлять самые разные данные — от имён и кодов до сложных текстовых идентификаторов.
Почему это важно: Почти любой объект или данные можно однозначно представить в виде строки, что делает её универсальным кандидатом на роль ключа.
Что это значит: Почти все приложения и API Java оперируют строками.
Почему это важно: Это упрощает интеграцию строк как ключей в сложных системах.
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap<String, Integer> ageMap = new HashMap<>();
ageMap.put("Alice", 30);
ageMap.put("Bob", 25);
ageMap.put("Charlie", 35);
// Получаем значение по строковому ключу
System.out.println("Возраст Боба: " + ageMap.get("Bob")); // 25
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
- Dirty Read — один поток читает данные, которые другой ещё не закоммитил.
- Non-Repeatable Read — данные изменились между двумя чтениями.
- Phantom Read — изменилось количество строк, соответствующих запросу.
- Lost Update — два потока перезаписывают одно и то же без учёта изменений.
Решаются через уровни изоляции транзакций (READ COMMITTED, REPEATABLE READ, SERIALIZABLE).
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥4
В Java
List — это интерфейс, а его самые популярные реализации — ArrayList и LinkedList. Они имеют разную структуру данных, что влияет на производительность и область применения. ArrayList использует динамический массив, который хранит элементы в непрерывной области памяти. LinkedList — это двусвязный список, где каждый элемент (Node) содержит ссылку на предыдущий и следующий элементы. ArrayList требует непрерывного блока памяти, что может быть проблемой при нехватке места. LinkedList требует дополнительной памяти на хранение ссылок (prev и next), что увеличивает общий размер. Пример кода: разница в скорости вставки в середину списка
import java.util.*;
public class ListComparison {
public static void main(String[] args) {
List<Integer> arrayList = new ArrayList<>();
List<Integer> linkedList = new LinkedList<>();
int size = 100000;
// Заполнение списков
for (int i = 0; i < size; i++) {
arrayList.add(i);
linkedList.add(i);
}
// Вставка в середину
long start = System.nanoTime();
arrayList.add(size / 2, 999);
long end = System.nanoTime();
System.out.println("ArrayList вставка в середину: " + (end - start) + " нс");
start = System.nanoTime();
linkedList.add(size / 2, 999);
end = System.nanoTime();
System.out.println("LinkedList вставка в середину: " + (end - start) + " нс");
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
1. **Порождающие**: Singleton, Factory Method, Abstract Factory, Builder, Prototype.
2. **Структурные**: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy.
3. **Поведенческие**: Observer, Strategy, Command, State, Visitor, Mediator, Iterator, Chain of Responsibility, Interpreter, Memento.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2
Это процесс отладки (debugging), который позволяет выявить и исправить дефекты в коде. Ошибки в программе могут быть синтаксическими, логическими или связанными с выполнением программы.
Симптомы ошибки: Программа выдает ошибочное поведение, например, неожиданный результат, исключение или сбой.
Типы ошибок:
Синтаксические: Ошибки в написании кода (например, пропущенная точка с запятой).
Логические: Код выполняется без ошибок, но результат не соответствует ожиданиям.
Ошибки выполнения: Программа завершает работу из-за исключения (например, деление на ноль).
Компилятор/интерпретатор: Сообщает о синтаксических ошибках и указывает строку, где возникла проблема.
Стек вызовов (stack trace): Для ошибок выполнения предоставляет информацию о том, где произошла ошибка.
Пример:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.main(Main.java:5)
Прочитайте проблемный участок кода и проверьте его на соответствие логике задачи.
Ищите типичные ошибки, такие как:
Неправильное использование переменных.
Ошибки в условных операторах (
if, switch).Пропущенные или лишние элементы кода.
Отладчик (Debugger):
Отладчики встроены в IDE, такие как IntelliJ IDEA, Eclipse или NetBeans.
Позволяют ставить точки останова (breakpoints), чтобы программа останавливалась в конкретных местах.
Позволяют пошагово выполнять код и проверять значения переменных.
Логирование (Logging):
Используйте
System.out.println для вывода промежуточных данных: System.out.println("Value of x: " + x);
Пример
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Main {
private static final Logger logger = LoggerFactory.getLogger(Main.class);
public static void main(String[] args) {
int x = 10;
int y = 0;
try {
int result = x / y;
} catch (ArithmeticException e) {
logger.error("Division by zero!", e);
}
}
}
Покрытие тестами: Напишите автоматические тесты для выявления ошибки.
Используйте фреймворки, такие как JUnit или TestNG.
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class CalculatorTest {
@Test
void testAddition() {
assertEquals(5, Calculator.add(2, 3));
}
}
Если ошибка в сторонней библиотеке, проверьте документацию и известные проблемы. Убедитесь, что вы правильно используете методы и классы.
Исправьте ошибку, убедившись, что исправление не приводит к новым ошибкам. Проверьте весь код на предмет аналогичных ошибок.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
WebSocket — это сетевой протокол, который обеспечивает постоянное двустороннее соединение между клиентом и сервером. В отличие от обычного HTTP-запроса, WebSocket позволяет серверу отправлять данные клиенту без запроса с его стороны.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥2🤔1
Символ-разделитель в пути к файлу зависит от операционной системы:
Windows использует обратный слеш (
\) C:\Users\Username\Documents\file.txt
Linux / macOS используют прямой слеш (
/) /home/user/documents/file.txt
В Java есть кроссплатформенный способ получения разделителя пути:
import java.io.File;
public class PathExample {
public static void main(String[] args) {
String path = "home" + File.separator + "user" + File.separator + "file.txt";
System.out.println("Путь: " + path);
}
}
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊9👍3
Нет, не нужно. Все классы в Java неявно наследуются от Object, если явно не указано другое.
Но ты можешь переопределить его методы (equals, toString, и др.), если нужно изменить поведение.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🤔2
Spring и Spring Boot являются частью экосистемы, которая предоставляет широкий спектр инструментов для разработки современных Java-приложений. Несмотря на тесную связь, между ними есть ключевые отличия.
Это мощный и широко используемый фреймворк для разработки приложений на Java. Он предоставляет обширный набор функциональностей, включая инверсию управления (IoC) и внедрение зависимостей (DI), абстракции для работы с транзакциями, обработку исключений, поддержку аспектно-ориентированного программирования (AOP) и многое другое. Он предназначен для упрощения Java EE разработки, обеспечивая легкость создания масштабируемых и легко поддерживаемых приложений.
С другой стороны, представляет собой расширение Spring Framework, предназначенное для упрощения процесса конфигурации и развертывания Spring-приложений. Он автоматизирует многие процессы, предоставляя "готовые к использованию" настройки для быстрого старта проектов и избавления от необходимости вручную определять стандартную конфигурацию.
Spring Framework предоставляет основу для создания приложений на Java, в то время как Spring Boot предлагает конвенции и автоматическую конфигурацию для быстрого старта и развертывания приложений.
В Spring для настройки приложения часто требуется детальная конфигурация, включая XML-файлы или аннотации. Spring Boot стремится уменьшить эту сложность, автоматически конфигурируя компоненты на основе добавленных в проект зависимостей.
Spring Boot по умолчанию включает в себя встроенный сервер приложений, что упрощает развертывание и тестирование веб-приложений.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6