Пока вы не вернете тот же экземпляр Connection
при вызове getConnection()
, вам не о чем беспокоиться.Каждый вызывающий затем получит свой экземпляр.На данный момент вы создаете новое соединение при каждом вызове getConnection()
и, таким образом, не возвращаете какую-либо статическую переменную или переменную экземпляра.Так что это безопасно.
Однако такой подход неуклюж.Это не обязательно должен быть синглтон.Вспомогательный / служебный класс также отлично подойдет.Или, если вы хотите немного больше абстракции, менеджер соединений возвращается абстрактной фабрикой.Я бы изменил его, чтобы получить источник данных только один раз во время инициализации класса, а не каждый раз в getConnection()
.В любом случае, это один и тот же случай.Держите это дешево.Вот основной базовый пример:
public class Database {
private static DataSource dataSource;
static {
try {
dataSource = new InitialContext().lookup("jndifordbconc");
}
catch (NamingException e) {
throw new ExceptionInInitializerError("'jndifordbconc' not found in JNDI", e);
}
}
public static Connection getConnection() {
return dataSource.getConnection();
}
}
, который должен использоваться следующим образом в соответствии с обычной идиомой JDBC.
public List<Entity> list() throws SQLException {
List<Entity> entities = new ArrayList<Entity>();
try (
Connection connection = Database.getConnection();
PreparedStatement statement = connection.prepareStatement("SELECT id, foo, bar FROM entity");
ResultSet resultSet = statement.executeQuery();
) {
while (resultSet.next()) {
Entity entity = new Entity();
entity.setId(resultSet.getLong("id"));
entity.setFoo(resultSet.getString("foo"));
entity.setBar(resultSet.getString("bar"));
entities.add(entity);
}
}
return entities;
}
См. Также: