Как переподключиться к базе данных в блоке try-catch? - PullRequest
0 голосов
/ 11 июля 2019

У меня есть Java-приложение, которое выполняет непрерывные непрерывные быстрые вставки в базу данных MySQL с помощью Spring JDBCTemplate. Через несколько минут, очевидно, что-то происходит с базой данных, которая разрывает соединение с БД, и я получаю исключение

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

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

Как это сделать?

РЕДАКТИРОВАТЬ: вот метод, где ловится исключение:

public int insertRecord(final String sql,final Object[] paramArray, KeyHolder keyHolder) {

        Integer retStatus = jdbcTemplate.update(new PreparedStatementCreator() { 

            public PreparedStatement createPreparedStatement(Connection con) { 
                    String[] keyColNames=new String[1];
                    PreparedStatement ps = null;
                    try {
                        ps=con.prepareStatement(sql,keyColNames); 
                        if(paramArray!=null){
                            int size=paramArray.length;
                            for(int i=0;i<size;i++){
                                ps.setObject(i+1, paramArray[i]);
                            }
                        }
                    } catch (CannotGetJdbcConnectionException e) {
                        logger.debug("caught SQLexception, now what should I do?");
                        con.reconnectToDatabase();  // this method doesnt exist but is what I need!
                    }

                    return ps; 
                } 
            }, keyHolder);  
        return retStatus;
    }

1 Ответ

0 голосов
/ 11 июля 2019

Обновление:

Если вы хотите просто переподключить базу данных, вы можете создать класс специально для этого, создать для него метод getConnection, а затем просто вернуть восстановленное соединение. например:

public class ConnectionManager {

private Connection connection;
public String driverURL = "[Your driver URL]";

    public Connection getConnection(String user, String password) {
    try {
        //SQLServerDriver or whichever you are using
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
        connection = DriverManager.getConnection(driverURL, username, password);
    }catch(ClassNotFoundException e) {
        e.printStackTrace();
    }
    catch(SQLException e) {
        e.printStackTrace();
    }
    return connection;
}

А потом:

con = new ConnectionManager().getConnection(user, pass);

Оттуда вы можете снова вызвать метод и повторить вставку или продолжить, как вам угодно.

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