Подтвердить что ты не робот

JAVA JDBC для повторного использования соединений

У меня есть Java-программа, в которой я делаю JDBC для выбора запросов. Будет ли целесообразно вызывать testDataBase() каждый раз, когда каждый раз вызывает вызовы DBConnection(), или я должен повторно использовать одно соединение для всех запросов. Спасибо заранее.

private  void testDataBase(String query){Connection con = DBConnection();
    Statement st = null;
    ResultSet rs = null;

    try {
        st = con.createStatement();
        rs = st.executeQuery(query);
        boolean flag = true;
        while (rs.next()) {
            String resultString = "";
            for(int i = 1; i <=rs.getMetaData().getColumnCount();i++){
                resultString=resultString+" "+  rs.getString(i);
            }
            System.out.println(resultString);
        }
    } 
    catch (SQLException e) {
        e.printStackTrace();

} finally {
    if (st != null) {
        try {
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
    }
    }
    if (rs != null) {
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (con != null) {
        try {
            con.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

}               



private  Connection DBConnection() {
    final String method_name =  "DBConnection";
    Connection conn = null;
    try{
      Class.forName(driver).newInstance();
      conn = java.sql.DriverManager.getConnection(url,userName,password);

      }catch (ClassNotFoundException e) {
        System.out.println(e.getMessage());
    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (InstantiationException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    return conn;

}
4b9b3361

Ответ 1

Открытие соединения с БД - дорогостоящая операция с точки зрения совершенства. Вы должны использовать ConnectionPool для совместного использования соединений между различными запросами.

Ответ 2

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

Ответ 3

Получение соединения с базой данных - довольно дорогостоящая операция, поэтому рекомендуется, если это возможно, повторно использовать соединение. Подумайте также, используя пул соединений, который будет поддерживать несколько соединений для вас, поэтому вы можете просто взять один из пула, когда это необходимо. Вышеуказанный метод может не понадобиться изменять, это зависит от метода DBConnection(), который вы вызываете.

Ответ 4

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

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

Ответ 5

Я полностью согласен с @Amir Kost, с точки зрения производительности, открывая соединение с БД в одной из самых медленных операций, которые вы можете сделать, и если у вас ограниченные ограничения в режиме реального времени, это может быть большой проблемой. Я не знаю, используете ли вы фреймворк или нет, но хорошей практикой является публикация bean, которая объединяет пул соединений и каждый раз, когда вам нужно напрямую взаимодействовать с db, вы получаете текущее открытое соединение ( который обычно соответствует так называемому "сеансу" ). Я предлагаю вам (даже если вы не используете какие-либо рамки), чтобы воспроизвести эту техническую информацию.

Ответ 6

Если вы хотите только один экземпляр Connection, вы можете использовать шаблон Singleton, вы можете рассмотреть:

public class Connector {

private static final String URL = "jdbc:mysql://localhost/";
private static final String LOGIN = "root";
private static final String PASSWORD = "azerty";
private static final String DBNAME = "videotheque";
private static Connector connector;
private static Connection connection;

private Connector() {
}

public synchronized static Connector getInstance() {
    if (connector == null) {
        connector = new Connector();
    }
    return connector;
}

public static Connection getConnection() {
    if (connection == null) {
        Connection c = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        try {
            c = DriverManager.getConnection(URL + DBNAME, LOGIN, PASSWORD);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return c;
    }
    return connection;
}

}

И затем вы можете позвонить: Connector.getInstance().getConnection()