gpt4 book ai didi

java - 没有连接池的 Web 应用程序的数据库连接

转载 作者:行者123 更新时间:2023-12-01 12:20:28 27 4
gpt4 key购买 nike

我正在尝试了解一种从 JSF Web 应用程序建立到数据库的 JDBC 连接的正确方法。我解决此问题的常规方法是在应用程序服务器中创建一个数据源,并通过代码中的 JNDI 名称连接到它。本质上,所有用户在整个 session 期间都将通过池共享相同的数据库用户帐户。

不幸的是,我正在开发的一个新项目的要求阻止了我这样做。连接到应用程序的每个用户都必须使用唯一的凭据登录到 RDBMS。我有一个关于如何实现与此相关的代码的草图,但我对整体架构并不是 100% 清楚。应用程序服务器(Tomcat、Glassfish、WebLogic)是否具有支持此功能的功能?

现在,我似乎可以实现此目的的唯一方法是让每个用户 session 直接创建一个返回数据库的 JDBC 连接。虽然我相信这会起作用,但感觉不太对劲。

我错过了什么吗?

最佳答案

你错过了一些东西 - 我非常认为:合理的系统设计。 ;)使用数据库凭据管理用户的整个想法非常适合一种用例——管理数据库。对于其他一切,它带来的问题多于它带来的好处......所以让狗屎 Storm 开始......;)

BOT:有一个两难的境地。您基本上必须为每个用户创建一个连接池,因为否则每次数据源在连接超时时运行时,您都必须创建到数据库的连接。三向握手加上身份验证并不是一件便宜的事情 - 延迟会降低您的性能。虽然某些驱动程序可以进行相应配置,但这通常是一个坏主意,并且大多数驱动程序本身不擅长管理连接,因为所谓的“关注点分离”。另一方面,每个连接“池”只需要大约 5 个连接,因为同一用户不太可能并行执行许多操作。

注意:据我所知,唯一能够妥善管理连接和池的驱动程序是 MongoDB 的驱动程序。

现在的问题是:您无法将连接池附加到 session 。除非步行几英里,否则我怀疑这是否完全可能。

解决这个问题的一个想法是在用户登录时为其创建一个连接池,并使用 JNDI 动态注册它。问题是这不太可扩展(假设您有数百个用户)。因此,您必须确保在 session 终止(通过注销或超时)时删除池。另外,必须维护代码。

另一个想法是使用 Apache Shiro并编写一个自定义领域,它只是尝试登录数据库以检查凭据,如果失败则抛出 AuthenticationException。这里的权衡是您必须每次都初始化连接,这会产生一些延迟。您的领域甚至可能使用应用程序范围的连接池并检查数据库元数据以获取身份验证和授权数据。当然,这将需要以特权用户身份访问数据库 - 这是一个可怕的想法。

底线:无论您以哪种方式看待它,通过数据库管理应用程序身份验证和授权需求可能会消除应用程序中的身份验证和授权层,但反过来又需要额外的抽象层(您不需要想要更改服务的代码,以防某些数据库机制发生变化,是吗?),正如我们所见,会带来可扩展性问题,并将您的代码与一个数据库紧密联系在一起(当然,您不想要细粒度的权限并且可以接受“有效,无效”结果)。

关于java - 没有连接池的 Web 应用程序的数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26696497/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com