如何在不实现连接池的情况下创建一个可以在运行时处理数千个jdbc连接的应用程序?AFAIK 要建立连接池,我们需要用户名、密码和所需的数据库实例 URL,但这里所有这些都将在运行时提供以连接特定的数据库,并且一次将有超过 1000 个用户连接到一组数据库。(内存密集型!
所以通常它会是这样的:
B、用户 C.....用户-n
db: DB1, DB2, DB3....德布恩
任何人都可以指导我如何完成这项任务吗?
我脑子里只有一件事,即为每个会话创建单个连接,并在该用户需要的地方使用它。
我已经使用Apache Commons DBCP2进行连接池,MyBatis-Spring实现,Spring和Vaadin用于不同的应用程序,但不确定他们中是否有人会帮助我!
这是另一种方法:
Oracle 支持代理身份验证。它将像这样工作:
- 为应用程序设置有限权限用户(例如
webgui
) - 以
webgui
身份连接到数据库(W 连接池) - 通过简单地尝试以他的身份连接
password
JoeSmith
来验证真实用户(比如JoeSmith
),也许是第二个连接 - 在第一次连接中将用户更改为
JoeSmith
(不确定 Oracle 语法是什么,在 postgres 中它是 SET ROLE) - 在数据库会话结束时重置用户
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);
我觉得它很脏,可能会产生内存问题。 但没有找到任何其他简单的解决方案。请随时发表评论或回答。