мое использование в статическом потоке объекта Connection безопасно?
Абсолютно нет!
Таким образом, соединение будет общим для всехзапросы, отправленные всеми пользователями и, следовательно, все запросы будут мешать друг другу.Но потокобезопасность - не единственная ваша проблема, утечка ресурсов - это и другая ваша проблема.Вы сохраняете одно соединение открытым в течение всего срока службы приложения.Средняя база данных восстанавливает соединение всякий раз, когда оно было открыто слишком долго, что обычно составляет от 30 минут до 8 часов, в зависимости от конфигурации базы данных.Поэтому, если ваше веб-приложение работает дольше, соединение теряется, и вы больше не сможете выполнять запросы.
Эта проблема также применима, когда эти ресурсы хранятся как переменные экземпляра, отличные от static
.экземпляра класса, который используется многократно.
Вы должны всегда получать и закрывать соединение, оператор и набор результатов в кратчайшей возможной области , предпочтительно внутри самойтот же try-with-resources
блок , где вы выполняете запрос в соответствии со следующей идиомой JDBC:
public User find(String username, String password) throws SQLException {
User user = null;
try (
Connection connection = dataSource.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, username, email FROM user WHERE username=? AND password=md5(?)");
) {
statement.setString(1, username);
statement.setString(2, password);
try (ResultSet resultSet = statement.executeQuery()) {
if (resultSet.next()) {
user = new User();
user.setId(resultSet.getLong("id"));
user.setUsername(resultSet.getString("username"));
user.setEmail(resultSet.getString("email"));
}
}
}
return user;
}
Обратите внимание, что вы должны не вернуть ResultSet
Вот.Вы должны немедленно прочитать его и сопоставить его с классом, отличным от JDBC, а затем вернуть его, чтобы можно было безопасно закрыть ResultSet
.
Если вы еще не в Java 7, тогда используйте *Блок 1030 *, в котором вы вручную закрываете закрываемые ресурсы в обратном порядке по мере их приобретения.Вы можете найти пример здесь: Как часто должны быть закрыты Connection, Statement и ResultSet в JDBC?
Если вы беспокоитесь о производительности соединения, тогда вам следует использовать пул соединений.Это встроено во многие серверы приложений Java EE и даже в базовые контейнеры сервлетов, такие как Tomcat.Просто создайте источник данных JNDI на самом сервере и позвольте вашему веб-приложению захватить его как DataSource
.Это прозрачно уже пул соединений.Вы можете найти пример в первой ссылке списка ниже.
См. Также: