Должен ли я получать соединение и закрывать соединение каждый раз, когда я вставляю в базу данных? - PullRequest
1 голос
/ 17 апреля 2019

Я просто хочу знать, действительно ли необходимо в моем Java-приложении вызывать getConnection / closeConnection каждый раз, когда я хочу вставить в базу данных, или я могу аутентифицировать User / Pass в начале приложения и никогда не вызывать Соединение снова?

//Conn class
private static final String DRIVER = "oracle.jdbc.driver.OracleDriver";
private static final String URL = "jdbc:oracle:thin:@localhost:1521:XE";
private static final String USER = "hr";
private static final String PASS = "hr";

//Connect
public static Connection getConnection(){
    try {
        Class.forName(DRIVER);
        return DriverManager.getConnection(URL, USER, PASS);
    } catch (ClassNotFoundException | SQLException ex) {
        throw new RuntimeException("Error: RuntimeException",ex);
    }
}

//Close
public static void closeConnection(Connection con){
        try {
            if(con!=null){
            con.close();
        } 
    } catch (SQLException ex) {
            Logger.getLogger(ConnectionAcademia.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//DAO Class
//Insert product
public void createProduct(Product p){

    Connection con = ConnectionGym.getConnection();
    PreparedStatement stmt = null;

    try {

        stmt = con.prepareStatement("INSERT INTO tb_product(key_product, name, price, status) "
                                  + "VALUES(?,?,?,?)");
        stmt.setInt(1, p.getKey_Product());
        stmt.setString(2, p.getName());
        stmt.setDouble(4, p.getPrice());
        stmt.setBoolean(6, p.getStatus());

        stmt.executeUpdate();

        JOptionPane.showMessageDialog(null, "Success!");
    } catch (SQLException ex) {
        JOptionPane.showMessageDialog(null, "Error: " + ex);
    } finally{
        ConnectionAcademia.closeConnection(con, stmt);
    }
}

1 Ответ

1 голос
/ 17 апреля 2019

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

Если вы не работаете в многопоточной среде (например, веб-приложении), то вполне разумно иметь одно соединение, создайте соединение при запуске приложения и закройте его сразу после завершения.

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

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

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