Помимо конкретного вопроса / проблемы, плохая практика объявляет дорогие и внешние ресурсы, такие как Connection
, Statement
и ResultSet
, как переменную экземпляра, не говоря уже о static
переменная. Эти ресурсы не имеют бесконечного срока службы, и ваше приложение может перестать работать, когда БД решит прервать соединение, поскольку оно не было возвращено в БД после использования.
Я не могу себе представить, что это делается по-другому в C # (это также было бы ошибкой в приложении), но обычная идиома JDBC заключается в том, что вы получаете и закрываете его в кратчайшем объеме, таким образом, уже внутри тот же метод блока. Э.Г.
public Entity find(Long id) throws SQLException {
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;
Entity entity = null;
try {
connection = database.getConnection();
statement = connection.prepareStatement(SQL_FIND);
statement.setLong(1, id);
resultSet = statement.executeQuery();
if (resultSet.next()) {
entity = new Entity();
entity.setProperty(resultSet.getObject("columnname"));
// etc..
}
} finally {
// Always free resources in reversed order.
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}
return entity;
}
Тем не менее, database.getConnection()
технически можно сделать статичным:
public final class Database {
static {
try {
Class.forName("com.example.jdbc.Driver");
} catch (ClassNotFoundException e) {
throw new ExceptionInInitializerError(e);
}
}
private Database() {
// No need to instantiate this class.
}
public static Connection getConnection() {
DriverManager.getConnection("jdbc:example://localhost/dbname", "user", "pass");
}
}
так что вы можете использовать его как
connection = Database.getConnection();
(который вам действительно нужно закрыть в блоке finally
после использования!)
Однако это делает источник соединения действительно статическим . Вы не можете больше пользоваться преимуществами полиморфизма и / или наследования для переключения между источниками соединений, такими как пул соединений (для повышения производительности). Чтобы получить больше идей / идей, вы можете найти эту статью полезной