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) {  
    // Коркарди эҳтимолии истиснои SQLException
    e.printStackTrace();  
}  

Фоидаҳои ин усул:

  • Автоматӣ баста мешавад: Захираҳо (Connection, Statement, ResultSet) пас аз баромадан аз блоки try ба таври кафолатнок баста мешаванд, ҳатто агар истисно рух диҳад.
  • Коди тоза: Намехоҳад даъвати ошкоро close() дар блоки finally, ки миқдори boilerplate-ро кам мекунад.
  • Коркарди истисно: Агар дар вақти баста шудани захира истисно рух диҳад, он аз истиснои дар дохили 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 ба кор бурда шавад.