Как создать приложение, которое может обрабатывать тысячи соединений 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 для разных приложений, но не уверен, что кто-нибудь из них мне поможет!
Наконец, мне пришлось поселиться со следующим подходом. Хотя я не уверен, что это хороший подход.
Я создал 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);
Я чувствую, что он грязный и может создать проблему с памятью. но не нашел другого простого решения. Пожалуйста, не стесняйтесь комментировать или отвечать.
Здесь другой подход:
Oracle поддерживает прокси-аутентификацию. Это будет работать примерно так:
webgui
)webgui
(w connection pooling)JoeSmith
), просто попробовав подключиться к нему (JoeSmith
/password
), возможно, второе соединениеJoeSmith
(не уверен, какой синтаксис оракула есть, в postgres это SET ROLE) EclipseLink имеет метод postAcquireClientSession
, не уверен в MyBatis
Возможно, вам придется стереть любое кэширование в вашем ORM, если оно его использует