Как создать и поддерживать одно соединение jdbc на пользователя в веб-приложении (Spring / Vaadin)?

1

Как создать приложение, которое может обрабатывать тысячи соединений jdbc во время выполнения без реализации пула соединений? AFAIK, чтобы установить пул соединений, нам нужно имя пользователя, passowrd и требуемый URL-адрес dbinstance, но здесь все они будут предоставлены во время выполнения для подключения конкретной базы данных, и одновременно будет подключено более 1000 пользователей для подключения к набору баз данных (память интенсивный!)
Так обычно это будет так:

Пользователи: User-A, User-B, User-C..... User-n
db: DB1, DB2, DB3.... DBn

Может ли кто-нибудь направить меня, как я могу достичь этой задачи?
У меня есть только одна вещь в моем сознании, т.е. Создавать одно соединение с каждым сеансом и использовать его везде, где это необходимо для этого пользователя.

Я использовал Apache Commons DBCP2 для пула соединений, реализации MyBatis-Spring, Spring и Vaadin для разных приложений, но не уверен, что кто-нибудь из них мне поможет!

  • 0
    для идеи, может помочь stackoverflow.com/a/26177079/2231632 ?
  • 0
    не получил никакой подсказки ... возможно, это объясняет то же самое в отношении AbstractRoutingDataSource ... но не может понять, что такое Map.
Показать ещё 4 комментария
Теги:
spring
mybatis
apache-commons-dbcp

2 ответа

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

Наконец, мне пришлось поселиться со следующим подходом. Хотя я не уверен, что это хороший подход.

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

public SqlSessionFactory build() throws IOException, SQLException
{       
    OracleDataSource dataSource = new OracleDataSource();
    dataSource.setURL(this.dbUrl);
    dataSource.setUser(this.dbUsername);
    dataSource.setPassword(this.dbPassword);
    dataSource.setDriverType(properties.getProperty("db.driver"));
    TransactionFactory transactionFactory = new JdbcTransactionFactory();
    Environment environment = new Environment(properties.getProperty("db.environment"), transactionFactory, dataSource);
    Configuration configuration = new Configuration(environment);
    configuration.addMappers("com.app.dao");
    SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(configuration);
    // final test connection to db
    sessionFactory.openSession().getConnection();
    return sessionFactory;
}  

Тогда я получаю один SqlSession из завода:

SqlSession session = sessionFactory.openSession();  

и я настраиваю его на сеанс Vaadin :(, так что он будет доступен на протяжении всего сеанса. Следовательно, я могу использовать его всякий раз, когда мне нужно, беря его из сеанса.

UI.getCurrent().getSession().setAttribute(SqlSession.class,session);  

Я отбрасываю его при выходе из системы:

UI.getCurrent().getSession().setAttribute(SqlSession.class, null);  

Я чувствую, что он грязный и может создать проблему с памятью. но не нашел другого простого решения. Пожалуйста, не стесняйтесь комментировать или отвечать.

0

Здесь другой подход:

Oracle поддерживает прокси-аутентификацию. Это будет работать примерно так:

  1. установить ограниченный пользователь прав для вашего приложения (скажем, webgui)
  2. подключитесь к базе данных как webgui (w connection pooling)
  3. аутентифицировать реального пользователя (скажем, JoeSmith), просто попробовав подключиться к нему (JoeSmith/password), возможно, второе соединение
  4. в первом соединении меняет пользователя на JoeSmith (не уверен, какой синтаксис оракула есть, в postgres это SET ROLE)
  5. сбросить пользователя в конце сеанса базы данных

EclipseLink имеет метод postAcquireClientSession, не уверен в MyBatis

Возможно, вам придется стереть любое кэширование в вашем ORM, если оно его использует

Ещё вопросы

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