Пул соединений с базами данных в сервлетах Java

2

Я создаю веб-приложение для системы управления сотрудниками, используя: Apache Tomcat в качестве HTTP-сервера, Oracle в качестве базы данных, апплеты для программирования на стороне клиента и сервлеты для программирования на стороне сервера. Я также хочу использовать DBCP для управления соединениями с базой данных.

Я хотел бы, чтобы сервлет выполнял запросы, чтобы использовать имя пользователя и пароль, введенные клиентом для подключения. Но до сих пор я видел, что имя пользователя и пароль для пула соединений должны быть установлены при настройке ресурса в context.xml.

Есть ли способ достичь этого и по-прежнему использовать DBCP? Или мне придется открывать соединения в doGet() и doPost() для каждого запроса?

  • 1
    Зачем клиенту предоставлять свои учетные данные для доступа к базе данных? Какова ваша мотивация здесь?
  • 0
    Вы можете создать свой собственный пул соединений и сохранить его в контексте сервлета, который будет использоваться запросами повторно.
Показать ещё 13 комментариев
Теги:
servlets
tomcat
oracle11g

2 ответа

0
Лучший ответ

Как уже упоминалось в комментариях, логика ограничения выполняется на стороне приложения, а не на стороне базы данных.

Но если вы действительно хотите использовать модель безопасности БД, вам нужно создать отдельный DataSource (ConnectionPool) для каждого зарегистрированного пользователя и сохранить его в своем сеансе. Если у вас много одновременного доступа, вы скоро обнаружите, что у вас заканчиваются ресурсы.

Например, я использую DataSource, поскольку его проще настроить, но вы можете просто использовать любую реализацию пула соединений.

В действии входа вы создаете новый DataSource (например, используя apache common: http://commons.apache.org/proper/commons-dbcp/), и вы вставляете в сеанс

BasicDataSource ds = new BasicDataSource();
...
ds.setPassword(userPassword);
ds.setUserName(login);
...

HttpSession session = request.getSession();
session.setAttribute("DBcon",ds);

и в ваших других получает/сообщения:

HttpSession session = request.getSession();
DataSource ds = (DataSource)session.getAttribute("DBcon");

Поскольку он будет одним источником данных для каждого пользователя, убедитесь, что вы используете некоторые низкие параметры пула, например size = 3, так как этого должно быть достаточно для пользователя.

0

DataSource::getConnection​(String username, String password)

Интерфейс DataSource имеет метод, специально предназначенный для вашей цели: изменение имени и пароля для каждого соединения при использовании всех других ранее установленных параметров для подключения: DataSource::getConnection​(String username, String password)

Интерфейс java.sql.ConnectionPoolDataSource содержит такой же метод getPooledConnection​(String user, String password). Так что ваша конкретная реализация пула соединений может поддерживать это.

public javax.sql.DataSource obtainDataSource() {
    org.postgresql.ds.PGSimpleDataSource dataSource = new PGSimpleDataSource() ;
    dataSource("AcmeInvoices database data source") ;
    source.setServerName( "localhost" ) ;
    source.setDatabaseName( "invoicing" ) ;
    // source.setUser( "Scott" ) ;
    // source.setPassword( "tiger" ) ;
    return dataSource ;  // Returning a reference to the object of this concrete class 'PGSimpleDataSource' as an object of the interface 'DataSource'. 
}

При выполнении какой-либо работы с базой данных:

Connection conn = myDataSource.getConnection( "Scott" , "tiger" ) ;
… run SQL
conn.close() ;  // Or better yet: Use try-with-resources syntax to automatically close the connection.

Для получения дополнительной информации см. Ответ на мой связанный вопрос.

Смотрите Oracle Tutorial on DataSource.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню