Должен ли я открыть соединение JDBC для каждого остального вызова? - PullRequest
0 голосов
/ 18 января 2019

Я имею дело с большим трафиком в своем проекте Spring Boot, и моя цель - максимально быстро обслуживать клиентов. В этом случае у меня более 500 запросов в секунду. При каждом вызове конечной точки отдыха я должен подключить свою схему и собрать несколько данных из нескольких таблиц. Чтобы сделать это, нужно ли создавать новое соединение для каждого вызова eendpoint или создавать и закрывать перед каждым запросом базы данных?

Я написал класс соединения JDBC, но я не уверен, что это хороший способ. Может быть, вы можете дать мне некоторое мнение.

Класс соединения JDBC

@PropertySource({"classpath:application.properties"})
@Configuration
public class FraudJDBConfiguration {
    private final Logger LOGGER = LogManager.getLogger(FraudJDBConfiguration.class);

    private final Environment env;

    @Autowired
    public FraudJDBConfiguration(Environment env) {
        this.env = env;
    }

    @Bean
    public Connection getFraudConnection() {
        // Step 1: Loading or
        // registering Oracle JDBC driver class
        String connectionClass = env.getProperty("fraud.db.driver-class-name");
        try {
            Class.forName(connectionClass);
        } catch (ClassNotFoundException cnfex) {
            LOGGER.error(cnfex.getMessage());
            throw new RuntimeException("JDBC driver class'ı bulunamadı");
        }

        // Step 2: Opening database connection
        try {
            String environmentType = env.getProperty("environment");
            if (environmentType == null) {
                LOGGER.error("environment Tip Hatası (TEST - UAT - LIVE)");
                throw new RuntimeException("environment Tip Hatası (TEST - UAT - LIVE)");
            } else {
                String connectionString = null;
                String username = null;
                String password = null;
                switch (environmentType.toLowerCase()) {
                    case "dev":
                        connectionString = env.getProperty(/*someurl*/);
                        username = env.getProperty(/*someusername*/);
                        password = env.getProperty(/*somepassword*/);
                        break;
                    case "tst":
                        connectionString = env.getProperty(/*someurl*/);
                        username = env.getProperty(/*someusername*/);
                        password = env.getProperty(/*somepassword*/);
                        break;
                    case "liv":
                        connectionString = env.getProperty(/*someurl*/);
                        username = env.getProperty(/*someusername*/);
                        password = env.getProperty(/*somepassword*/);
                        break;
                    case "uat":
                        connectionString = env.getProperty(/*someurl*/);
                        username = env.getProperty(/*someusername*/);
                        password = env.getProperty(/*somepassword*/);
                        break;
                }
                // Step 2.A: Create and
                // get connection using DriverManager class
                if (connectionString == null) {
                    LOGGER.error("fraud şeması için connection string bulunamadı");
                    throw new RuntimeException("fraud şeması için connection string bulunamadı");
                }
                return DriverManager.getConnection(connectionString, username, password);
            }
        } catch (SQLException e) {
            LOGGER.error(e.getMessage());
        }
        return null;
    }
}

DAO

@Component
public interface FraudCommTransactionsDao {
    Long count();
}

DAO IMPL

@Service
public class FraudCommTransactionsDaoImpl implements FraudCommTransactionsDao {
    private final FraudJDBConfiguration fraudJDBConfiguration;

    @Autowired
    public FraudCommTransactionsDaoImpl(FraudJDBConfiguration fraudJDBConfiguration) {
        this.fraudJDBConfiguration = fraudJDBConfiguration;
    }

    @Override
    public Long count() {
        try(Connection connection = fraudJDBConfiguration.getFraudConnection()) {
            Statement stmt = connection.createStatement();
            ResultSet rs = stmt.executeQuery(/*some query*/);

            if (rs.next()) {
                return rs.getLong("transaction_id");
            } else {
                return 0L;
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        return null;
    }
}

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Нет, установление нового физического соединения с сервером базы данных является дорогостоящим. Он состоит из нескольких этапов: авторизация пользователя, установка значений по умолчанию для сеанса, распределение памяти как на клиенте, так и на сервере и т. Д. Эти издержки не следует добавлять к каждому отдельному запросу.

Обычной практикой является создание пула соединений для совместного использования физических соединений между потоками приложения. Это вводит понятие логических связей, например, Connection объект, созданный с помощью DriverManager.getConnection(), является физическим соединением, тогда как DataSource.getConnection() возвращает логическое соединение, которое является прокси.

Существует несколько библиотек пула соединений с базой данных для Java, которые вы можете использовать, например, HikariCP . Не пишите свое, это не просто .

0 голосов
/ 18 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...