数据源应该由 Spring 还是 Web 容器管理?

Cur*_*ind 3 spring spring-mvc

我试图了解现实生活中的企业应用程序(例如,使用 Spring 框架的 Web 应用程序)谁应该管理数据源?我可以想到两种方法:

(i) Spring配置中定义的数据源,应用程序可以根据需要从Spring容器获取数据源。

(ii)在 web-container 中定义数据源(例如),然后应用程序可以从容器中获取数据源。

现在,我有以下问题:

Q1)在场景(i)中,我相信我们可以使用 Spring 的 DI 来注入数据源,因为它是由 Spring 管理的。这是对的吗?

Q2)在场景(ii)中,获取数据源的唯一方法是使用JNDI查找,因为数据源是在容器中配置的,因此Spring将无法进行DI。正确吗?

Q3)当数据源由Spring容器管理时,它是否能够处理等等connection poolingglobal transaction如果可以,如何处理?它内部是否使用一些第三方库来实现这一切?

任何有关此的详细信息都非常感谢。

Jir*_*sek 5

基本上:

  • Spring定义的数据源使您独立于容器,更轻松地部署您的应用程序
  • 容器定义的数据源将数据源配置的权力和责任交给服务器管理员而不是程序员
    • 这可以说是更好的责任/角色分离
    • 它允许服务器管理员在不知道应用程序详细信息的情况下维护和更新数据源
    • 它解决了常见的“无明文数据库密码”要求,使容器代替您负责保护密码

可以在 Spring 配置中引用 JNDI 资源,因此 Spring 将为您进行查找,并且该资源可用于 DI。

您可以使用第三方库(例如Apache commons-dbcp)为 Spring 管理的数据源进行连接池(我已经在企业项目中这样做了)。

Spring使用内置的TransactionManager支持DB事务管理。根据文档,似乎 JPA 仅在数据源在容器中定义时才可用。

  • 我同意你的观点,但是你可以从 spring 配置中删除明文密码(例如,使用 jasypt) (3认同)
  • _“JTA 与容器绑定”_ 不,不是。有多种独立的事务管理器。 (2认同)
  • Atomikos和Bitronix(JTA提供者)很容易与Spring集成,并且可以轻松与JTA集成。有关更多详细信息,请参阅http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-jta.html。 (2认同)