Sobes.tech
Junior

Ինչպես ճիշտ փակել տվյալների բազայի կապը?

sobes.tech AI

Պատասխան AI-ից

Օգտագործելով try-with-resources բլոկը:

// Աշխատանք ռեսուրսների հայտարարությամբ, որոնք ավտոմատ փակվելու են
try (  
    Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", ""); // Ստանում ենք Connection օբյեկտ
    Statement statement = connection.createStatement();  // Ստեղծում ենք Statement օբյեկտ
    ResultSet resultSet = statement.executeQuery("SELECT 1") // Կատարում ենք հարցում և ստանում ResultSet
) {  
    // Աշխատանք ResultSet- ի տվյալների հետ կամ այլ բազայի հետ կապված գործողություններ
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    // Հնարավոր արտահայտությունների մշակումը
    e.printStackTrace();  
}  

Այս մոտեցման առավելությունները՝

  • Ավտոմատ փակման: Ռեսուրսները (Connection, Statement, ResultSet) վստահորեն փակվում են try բլոկից դուրս գալուց հետո, նույնիսկ եթե տեղի ունենա արտահայտություն:
  • Ամենամաքուր կոդ: Չի պահանջվում բացահայտ close() կանչը finally բլոկում, ինչը նվազեցնում է բոիլերփլեյտ կոդի քանակը:
  • Արտահայտությունների մշակումը: Եթե ռեսուրսի փակման ժամանակ արտահայտություն տեղի ունենա, այն չի թաքցվի try բլոկում առաջացած արտահայտության հետ:

Ալտերնատիվ, պակաս նախընտրելի մեթոդ՝ բացահայտ փակմամբ finally բլոկում:

Connection connection = null;  
Statement statement = null;  
ResultSet resultSet = null;  

try {  
    connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");  
    statement = connection.createStatement();  
    resultSet = statement.executeQuery("SELECT 1");  
    // Տվյալների աշխատանք
    while (resultSet.next()) {  
        System.out.println(resultSet.getInt(1));  
    }  
} catch (SQLException e) {  
    e.printStackTrace();  
} finally {  
    // Բացահայտ փակել ռեսուրսները հակառակ հերթականությամբ, ինչպես ձեռք բերվել են
    if (resultSet != null) {  
        try {  
            resultSet.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    if (statement != null) {  
        try {  
            statement.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
    if (connection != null) {  
        try {  
            connection.close();  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
}  

Այս մեթոդը ավելի ծավալուն է և ավելի ենթակա սխալների, հատկապես ռեսուրսների փակման ժամանակ արտահայտությունների մշակման դեպքում: Առաջարկվում է օգտագործել try-with-resources։