Java Developer | Backend
1.7K subscribers
136 photos
1 video
231 links
Авторский канал действующего java разработчика

Платформа: https://offercraft.ru

Сотрудничество @offercraft_support
Download Telegram
Вопрос: Что такое deadlock?
Ответ -
Состояние, которое возникает, когда два процесса ждут завершения друг друга, прежде чем продолжить. Результатом является то, что оба процесса ждут бесконечно.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🔥1
🔤 Java Logging: история кошмара

Тернист и извилист путь Java-платформы к правильному способу записи строчек в лог-файлы. История logging в Java довольно познавательна в плане изучения особенностей Open Source, в том числе его взаимодействия с корпорациями и единичными программистами.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2🔥1🤔1
Пул соединений в JDBC

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

Пример использования пула соединений

Для примера мы будем использовать библиотеку HikariCP, которая является популярным пулом соединений.

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.SQLException;

public class JdbcConnectionPoolExample {
public static void main(String[] args) {
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3000/mydatabase");
config.setUsername("username");
config.setPassword("password");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");

try (HikariDataSource ds = new HikariDataSource(config);
Connection conn = ds.getConnection()) {

// Использование соединения
System.out.println("Successfully connected to the database!");

} catch (SQLException e) {
e.printStackTrace();
}
}
}


Использование пула соединений позволяет значительно сократить время на создание соединений и повысить общую производительность приложения. HikariCP является одним из самых быстрых и эффективных пулов соединений на рынке.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍3👏21
🔤 Разработка нового статического анализатора: PVS-Studio Java

Статический анализатор PVS-Studio известен в мире C, C++ и C# как инструмент для выявления ошибок и потенциальных уязвимостей. Однако у нас мало клиентов из финансового сектора, так как выяснилось, что сейчас там востребованы Java и IBM RPG(!). Нам же всегда хотелось стать ближе к миру Enterprise, поэтому, после некоторых раздумий, мы приняли решение заняться созданием Java анализатора.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1🔥1👏1
Обработка транзакций в JDBC

Управление транзакциями — это важный аспект работы с базами данных. JDBC предоставляет возможность управлять транзакциями вручную, что позволяет контролировать операции с базой данных более точно.

Пример обработки транзакций

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "username";
String password = "password";

try (Connection conn = DriverManager.getConnection(url, user, password)) {
// Отключаем авто-коммит
conn.setAutoCommit(false);
try (Statement stmt = conn.createStatement()) {
stmt.executeUpdate("INSERT INTO users (username) VALUES ('user1')");
stmt.executeUpdate("INSERT INTO users (username) VALUES ('user2')");

// Если всё прошло успешно, коммитим изменения
conn.commit();
System.out.println("Transaction committed successfully!");

} catch (SQLException e) {
// В случае ошибки откатываем изменения
conn.rollback();
System.out.println("Transaction rolled back!");
e.printStackTrace();
}

} catch (SQLException e) {
e.printStackTrace();
}
}
}


Обработка транзакций в JDBC позволяет обеспечить целостность данных и избежать неполных операций. Убедитесь, что вы правильно обрабатываете исключения и выполняете откат в случае ошибок.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1👏1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1🔥1
Вопрос: Что такое Java Memory Model и как он влияет на многопоточность?
Ответ -
Java Memory Model (JMM) определяет, как потоки взаимодействуют друг с другом через общую память. Он гарантирует видимость изменений, сделанных одним потоком, для других потоков. JMM вводит понятия "синхронизация", "медленная и быстрая память" и "порядок выполнения", что помогает избежать проблем, таких как гонки данных. Для обеспечения корректного взаимодействия потоков используются ключевые слова volatile, synchronized и блоки Lock.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥2
Spring Boot: Конфигурация и профили

Использование профилей в Spring Boot для управления конфигурацией приложения в различных средах (например, dev, test, prod). Для указания учетных записей для подключения к базе данных в разных средах будем использовать файлы конфигураций к определенной среде. Например,

# application-dev.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/devdb
username: devuser
password: devpass

# application-prod.yml
spring:
datasource:
url: jdbc:mysql://localhost:3306/proddb
username: produser
password: prodpass


Использование профиля в коде:
@SpringBootApplication
@ActiveProfiles("dev")
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}



🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2👏2
🔤 Как мы переехали с Oracle на PostgreSQL в нагруженном сервисе без даунтайма

В этой статье рассказывается про yet-another-миграцию с базы на базу, которая заняла почти год

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
3👏2🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁3👍2🔥1
Вопрос: Каковы основные отличия между HashMap и ConcurrentHashMap?

Ответ -

*️⃣ Потокобезопасность: HashMap не является потокобезопасным и может привести к некорректному поведению при параллельном доступе. ConcurrentHashMap обеспечивает безопасный доступ из нескольких потоков.

*️⃣Разделение сегментов: ConcurrentHashMap разбивает данные на сегменты, что позволяет нескольким потокам одновременно работать с различными сегментами без блокировок.

*️⃣Производительность: ConcurrentHashMap предлагает более высокую производительность в многопоточных средах за счет меньшего времени блокировок.

🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥2
Leetcode. Задача. 1.Two Sum (easy)

Дано массив целых чисел nums и целое число target. Необходимо найти индексы двух чисел в массиве, которые в сумме дают target.

Вы можете предположить, что каждое входное значение имеет ровно одно решение, и не нужно использовать один и тот же элемент дважды. Верните индексы этих двух чисел в любом порядке.

Пример:
Вход: nums = [2, 7, 11, 15], target = 9
Выход: [0, 1]
Объяснение: nums[0] + nums[1] = 2 + 7 = 9, поэтому возвращаем [0, 1].


👨‍💻 Алгоритм:

Алгоритм решения:

1️⃣Создать хэш-таблицу (Map), чтобы отслеживать числа и их индексы.

2️⃣Пройтись по массиву nums:

*️⃣Для каждого элемента num вычислить необходимое число complement, которое нужно для достижения target (то есть complement = target - num).

*️⃣Проверить, есть ли это число в хэш-таблице.

*️⃣Если есть, вернуть текущий индекс и индекс числа из хэш-таблицы.

*️⃣Если нет, добавить текущее число и его индекс в хэш-таблицу.

😎 Решение:
import java.util.HashMap;
import java.util.Map;

public class TwoSum {
public static int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();

for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}

throw new IllegalArgumentException("No two sum solution");
}

public static void main(String[] args) {
int[] nums = {2, 7, 11, 15};
int target = 9;
int[] result = twoSum(nums, target);

System.out.println("Indices: [" + result[0] + ", " + result[1] + "]");
}
}


🖥 Java Developer | Backend | #⃣#задача #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍53🔥2
🔤 Управление памятью Java

Это глубокое погружение в управление памятью Java позволит расширить ваши знания о том, как работает куча, ссылочные типы и сборка мусора.

🔗 Ссылка на статью

🖥Java Developer | Backend |#⃣ #статья #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2👏2
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2🔥1
Асинхронное программирование в Java с использованием CompletableFuture

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

Пример использования CompletableFuture

import java.util.concurrent.CompletableFuture;

public class AsyncExample {
public static void main(String[] args) {
CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 42;
});

future.thenAccept(result -> System.out.println("Result: " + result));
System.out.println("Waiting for result...");
}
}


Обработка исключений
future.exceptionally(ex -> {
System.out.println("Error: " + ex.getMessage());
return null;
});


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

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
4👏2🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5😁32🤩2
Java Memory Management: Понимание сборщика мусора

Управление памятью в Java осуществляется автоматически с помощью сборщика мусора. Мы рассмотрим основные аспекты работы сборщика мусора.

Типы сборщиков мусора:

1⃣Serial GC: Подходит для небольших приложений.

2⃣Parallel GC: Оптимизирован для многопроцессорных систем.

3⃣CMS (Concurrent Mark-Sweep): Уменьшает паузы при сборке мусора.

4⃣G1 (Garbage-First): Современный сборщик, оптимизированный для больших кучи.

Настройка сборщика мусора

Вы можете настроить сборщик мусора через параметры JVM:
java -XX:+UseG1GC -jar yourapp.jar


Понимание работы сборщика мусора поможет вам оптимизировать производительность ваших приложений и избегать утечек памяти.

🖥Java Developer | Backend |#⃣ #обучение #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥2👏2
Вопрос: Что такое volatile в Java?
Ответ -

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


🖥 Java Developer | Backend | #⃣#вопрос #java
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥1
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1🔥1