Могу ли я добавить соединения с базой данных в работающее приложение, используя Spring Boot? - PullRequest
0 голосов
/ 19 июня 2019

Например, у меня есть форма, в которую я собираюсь указать пользователя, пароль, порт и т. Д. Соединения с базой данных, а при отправке соединение с базой данных устанавливается и сохраняется. Обычно это делается в файле application.properties до запуска приложения, но можно ли добавить его во время выполнения в приложении? Если это возможно, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 19 июня 2019

Решением было бы создание объекта DatabaseConnection со всеми необходимыми свойствами соединения, которые вы упомянули (плюс свойство active: boolean). Используйте Spring Data, чтобы создать хранилище для этой сущности и создать компоненты верхнего уровня. Обслуживайте своих клиентов контроллером CRUD для этого объекта.

DatabaseConnectionService может предоставлять активное соединение JDBC с другими компонентами для выполнения запросов / обновлений.

1 голос
/ 19 июня 2019

Я столкнулся с подобной ситуацией в одном из моих проектов, используя spring-jdbc, будет сложно написать код и поддерживать его. Вы можете использовать обычный jdbc, чтобы получить указанный объект соединения, используя параметры соединения.

package com;

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

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;

@Component
public class DB2Connection {

private static final Logger logger = LoggerFactory.getLogger(DB2Connection.class); 

private static String DRIVER_NAME;

private static String VALID_QUERY;

@Value("${db.valid-query}")
public void setValidQuery(String query){
    VALID_QUERY = query;
}

@Value("${db.driverName}")
public void setDriverName(String driverName){
    DRIVER_NAME = driverName;
}

/**
 *  Getting the Database connection
 *  @param  url             url of the database
 *  @param  userName        username of the db
 *  @param  password        password of the db
 *  @return Connection      returns DB Connection object 
 * */
public static Connection getConnection(final String url, final String userName, final String password){

    logger.info("Getting DB Connection...");

    Assert.notNull(url, "Database URL can't be null");
    Assert.notNull(userName, "Database username can't be null");
    Assert.notNull(password, "Database password can't be null");

    Connection con = null;
    try{
        Class.forName(DRIVER_NAME);
        con = DriverManager.getConnection(url,userName,password);

        // testing for the valid connection
        if(testConnection(con)){
            logger.info("Valid DB Connection # Connection Tested...");
        }else{
            logger.info("In-Valid DB Connection...");
        }
    }catch(ClassNotFoundException cla){
        logger.error("Class Not found exception..."+ExceptionUtils.getStackTrace(cla));
    }catch(SQLException sqe){
        logger.error("SQL Exception..."+ExceptionUtils.getStackTrace(sqe));
    }catch(Exception exe){
        logger.error("Exception occured while making DB Connection..."+ExceptionUtils.getStackTrace(exe));
    }
    return con;
}


/**
 *  Closing the java.sql.Connection class object 
 *  
 *  @param  con     Connection object which need to be closed
 *  
 * */
public static void close(Connection con){

    logger.info("Closing the connection object...");
    try {
        if(con != null ){
            con.close();
        }
    } catch (SQLException e) {
        logger.error("Exception occured while closing DBConnection..."+ExceptionUtils.getStackTrace(e));
    }
}

/**
 * This method will test connection if proper or not
 * @param   con     Connection object which need to be checked
 * @return  flag    true if connection is fine, false in case of connection is wrong
 * */
public static synchronized boolean testConnection(Connection con){

    boolean flag = false;
    logger.info("Testing the connection before providing to another process...");
    ResultSet rs = null;
    Statement stmt = null;
    try{
        stmt= con.createStatement();

        // running the query for validation of the database
        rs = stmt.executeQuery(VALID_QUERY);
        while(rs.next()){
            // if we get Timestamp as return type - valid query is successfully run in the database
            Timestamp t = rs.getTimestamp(1);
            if( t != null){
                flag =true;
            }
        }
    }catch(SQLException e){
        logger.error("SQL Exception error..."+ExceptionUtils.getStackTrace(e));
    }finally{
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                logger.error("Error in closing Result Set"+ExceptionUtils.getStackTrace(e));
            }
        }if( stmt != null){
            try {
                stmt.close();
            } catch (SQLException e) {
                logger.error("Error in closing Statement"+ExceptionUtils.getStackTrace(e));
            }
        }
    }
    return flag;
}

}

Определите значения db.valid-query и db.driverName в файле application.properties. Вызовите getConnection (), чтобы получить объект подключения.

Также вы можете создать свой собственный собственный привод, который может показать вам все текущие объекты соединения, которые в данный момент находятся в приложении. Дополнительный код, необходимый для поддержки текущего объекта. БД Объект соединения.

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