2014-11-26 1 views
1

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

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

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

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

+0

за идею, можно http://stackoverflow.com/a/26177079/2231632 помочь? – prabugp

+0

не получил никакой подсказки ... возможно, это объясняет то же самое в AbstractRoutingDataSource .., но неспособно понять вещь Карты. – agpt

+0

Он объясняет, что вам не нужно определять источник данных в xml (для AbstractRoutingDataSource), а определять его динамически и соответственно очищать. пример показывает привязку его к сеансу пользователя. Если вам нужно изменить имя пользователя/пароль для всего пула соединений, вам может потребоваться получить источник данных из контекста Spring, закрыть/уничтожить базовый пул и создать новый с новым именем пользователя/паролем и установить его обратно в источник данных , (действительно очень криво, люди - не обижайте меня!) Но если вы хотите сделать это для одного соединения в пуле, я не думаю, что вы можете это сделать. – prabugp

ответ

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 поддерживает proxy authentication. Она будет работать что-то вроде этого:

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

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

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

Смежные вопросы