1

Тема: MySQL(JDBC) i Java, чи закривати підключення кожного разу.

Доброго дня товариство.
Моя програмка використовує JDBC, і користуюсь я стандартним кодом для виконання mysql запитів:

public class Manager {
    
    static final String USERNAME = "root";
    static final String PASSWORD = "12345";
    static final String CONN_STRING = "jdbc:mysql://localhost:3306/test?autoReconnect=true&useSSL=false";
    public static Connection conn=null;
    public ResultSet rs = null;
   
     /**
     * @param String source class or method
     */
    public Manager(String source) {
   
        System.out.println(" - object Manager was created from: "+source);
        
    }//end constructor
    
    public void connectToDB(String sourge) {
        try {
            conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
            System.out.println(" - db connection established: " + conn.getCatalog() +" "+sourge);
        } catch (SQLException e) { e.printStackTrace();}

    }//end method
public class WorksSQL extends ConnectionDB{

    private String query;
    private Work work;
    
    public ArrayList<Work> getWorksObjectList(int id) {
        ArrayList<Work> works = new ArrayList<>();
        try {    
            Statement stmt = (Statement) conn.createStatement();
            query = "SELECT id_work, work_list, work_price, work_status, DATE_FORMAT(date_time_begin, '%d/%m/%Y') as date_t_b FROM works where id_unit = "+id;
            ResultSet rs = stmt.executeQuery(query);
            while(rs.next()) {
                work = new Work(Integer.parseInt(rs.getString("id_work")), rs.getString("work_list"), rs.getString("date_t_b"), rs.getString("work_price"), rs.getString("work_status"));
                works.add(work);
            }
        }catch (SQLException e) { e.printStackTrace();}
        return works;
    }//end method
}

І в класах і методах кожного разу створюється об'єкт для роботи з БД(я думаю що це проблема). В інеті пишуть що хорошою манерою є зразу ж закривати ці підключення методами conn.close(), stmt.close().
Чи це так має бути? Бо на протязі роботи з програмою, створюються 50, а то і 100 екземплярів підключення. ну я розумію що гарбеджКоллектор їх знищує... але!
Тобто як на більш професійному рівні, організовується реалізація запитів mysql?
Щиро вдячний всім за допомогу!
if (Слава Україна) : (смерть корупції)

2

Re: MySQL(JDBC) i Java, чи закривати підключення кожного разу.

colin200x написав:

І в класах і методах кожного разу створюється об'єкт для роботи з БД(я думаю що це проблема).

Так, це проблема. Якщо БД одна, то вся робота з базою має бути через 1 connection (як мінімум поки звязок не порваний).

colin200x написав:

В інеті пишуть що хорошою манерою є зразу ж закривати ці підключення методами conn.close(), stmt.close().

Підключення (connection) треба закривати тоді, коли воно більше не треба. Якщо програма дозволяє користувачу працювати з базою тривалий час, то закривати звязок (connection) треба тоді коли користувач попросить, або коли користувач закриває програму. Також закривати звязок можна через задану кількість часу від моменту останньої активності користувача (~30 сек.) у випадках коли база розміщена на віддаленому хості.

colin200x написав:

Чи це так має бути? Бо на протязі роботи з програмою, створюються 50, а то і 100 екземплярів підключення. ну я розумію що гарбеджКоллектор їх знищує... але!

Правильно мислиш. Треба організувати все через 1 connection.

colin200x написав:

Тобто як на більш професійному рівні, організовується реалізація запитів mysql?

Організувати можна дуже по різному. Багато залежить від конкретної задачі.
1 із варіантів приблизно такий:
Має бути твій клас, який буде працювати з базою (якийсь DBprovider, який буде містити connection і все необхідне для роботи з базою), а екземпляри інших класів мають смикати методи DBprovider'а щоб { дістати | запхати } їхні { обєкти | дані }.

Подякували: colin200x1

3

Re: MySQL(JDBC) i Java, чи закривати підключення кожного разу.

Зрозуміло. дякую! Щось подібне вже зробив, але як завжди хочеться оптимізувати якось.