如何在 Web 应用程序 (Spring/Vaadin) 中为每个用户创建一个 jdbc 连接



如何在不实现连接池的情况下创建一个可以在运行时处理数千个jdbc连接的应用程序?AFAIK 要建立连接池,我们需要用户名密码和所需的数据库实例 URL,但这里所有这些都将在运行时提供以连接特定的数据库,并且一次将有超过 1000 个用户连接到一组数据库。(内存密集型!
所以通常它会是这样的:

用户:用户 A、用户

B、用户 C.....用户-n
db: DB1, DB2, DB3....德布恩

任何人都可以指导我如何完成这项任务吗?
我脑子里只有一件事,即为每个会话创建单个连接,并在该用户需要的地方使用它。

我已经使用Apache Commons DBCP2进行连接池,MyBatis-Spring实现,Spring和Vaadin用于不同的应用程序,但不确定他们中是否有人会帮助我!

这是另一种方法:

Oracle 支持代理身份验证。它将像这样工作:

  1. 为应用程序设置有限权限用户(例如webgui
  2. webgui身份连接到数据库(W 连接池)
  3. 通过简单地尝试以他的身份连接password JoeSmith来验证真实用户(比如JoeSmith),也许是第二个连接
  4. 在第一次连接中将用户更改为JoeSmith(不确定 Oracle 语法是什么,在 postgres 中它是 SET ROLE)
  5. 在数据库会话结束时重置用户

EclipseLink 有一个postAcquireClientSession方法,不确定 MyBatis

如果ORM使用它,您可能需要擦除ORM中的任何缓存

最后,我不得不采用以下方法。虽然我不确定这是否是一个好方法。

我通过为DataSource提供动态用户名、密码和数据库创建了一个SqlSessionFactory

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);  

我觉得它很脏,可能会产生内存问题。 但没有找到任何其他简单的解决方案。请随时发表评论或回答。

最新更新