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

数据源应该由Spring还是web容器管理?,spring,spring-mvc,Spring,Spring Mvc,我试图了解在现实生活中的企业应用程序(例如,web应用程序,使用Spring框架)中,谁应该管理数据源?我可以想出两种方法: (i)在Spring配置中定义的数据源,应用程序可以根据需要从Spring容器中获取数据源 (ii)在web容器中定义的数据源(例如),然后应用程序可以从容器中获取数据源 现在,我有以下问题: Q1)在场景(i)中,我相信我们可以使用Spring的DI注入数据源,因为它是由Spring管理的。对吗 Q2)在场景(ii)中,获取数据源的唯一方法是使用JNDI查找,因为数据源

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

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

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

现在,我有以下问题: Q1)在场景(i)中,我相信我们可以使用Spring的DI注入数据源,因为它是由Spring管理的。对吗

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

Q3)当数据源由Spring容器管理时,它是否能够处理
连接池
全局事务
等,如果是,如何处理?它是否在内部使用一些第三方库来实现这一切

非常感谢您提供这方面的详细信息。

基本上:

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

,因此Spring将为您执行查找,它将可用于DI

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


Spring支持使用内置TransactionManager进行DB事务管理。根据,似乎只有在容器中定义了数据源时,JPA才可用。

1。是的,2。不(你认为
是做什么用的),3。是的,这取决于您配置的数据源(例如,请参阅HikariCP)。我同意您的看法,但您可以从spring配置中删除明文密码(例如,使用jasypt)。当然,还有其他方法可以实现这一点,我不认为这是唯一的方法。不过它非常方便,这是对其他原因的一个很好的奖励,就我个人而言,这也是我多次使用JNDI的原因;我对JTA没有丰富的经验,所以这里只引用文档。事务管理在Spring中非常强大,第三方连接池LIB被广泛使用。有各种独立的事务管理器。Atomikos和Bitronix(JTA提供者)很容易与Spring集成,也很容易与JTA集成。有关更多详细信息,请参阅。