数据源应该由 Spring 还是 web-container 管理?
Posted
技术标签:
【中文标题】数据源应该由 Spring 还是 web-container 管理?【英文标题】:Should Datasource be managed by Spring or web-container? 【发布时间】:2016-11-15 16:13:52 【问题描述】:我想了解现实生活中的企业应用程序(例如,使用 Spring Framework 的 Web 应用程序)应该由谁来管理数据源?我可以想到两种方法:
(i) Spring 配置中定义的数据源,应用程序可以根据需要从 Spring 容器中获取数据源。
(ii) 在 web-container 中定义数据源(例如),然后应用程序可以从容器中获取数据源。
现在,我有以下问题:
Q1) 在场景 (i) 中,我相信我们可以使用 Spring 的 DI 来注入数据源,因为它是由 Spring 管理的。对吗?
Q2) 在场景 (ii) 中,获取数据源的唯一方法是使用 JNDI 查找,因为数据源是在容器中配置的,因此 Spring 将无法进行 DI。对吗?
Q3) 当Data source由Spring Container管理时,是否可以处理connection pooling
、global transaction
等,如果可以,如何处理?它是否在内部使用一些第三方库来实现这一切?
非常感谢任何有关此的详细信息。
【问题讨论】:
1.是的,2. 不(你的东西<jee:jodi-lookup />
是干什么用的),3. 是的,取决于你配置的数据源(例如,参见 HikariCP)。
【参考方案1】:
基本上:
Spring定义的数据源让你独立于容器,部署应用更容易 容器定义的数据源赋予服务器管理员而不是程序员手中的数据源配置权力和责任 这可以说是更好的职责/角色分离 它允许服务器管理员在不了解应用程序详细信息的情况下维护和更新数据源 它解决了常见的“无明文数据库密码”要求,让容器代替您负责保护密码It is possible to refer to a JNDI resource in Spring configuration,因此 Spring 将为您进行查找,并且可用于 DI。
您可以使用第三方库(例如Apache commons-dbcp)为 Spring 管理的数据源进行连接池(我在企业项目中这样做过)。
Spring 使用内置的 TransactionManager 支持 DB 事务管理。根据documentation 的说法,JPA 似乎只有在容器中定义了数据源时才可用。
【讨论】:
我同意你的观点,但你可以从 spring 配置中删除明文密码(例如,使用 jasypt) 当然,还有其他方法可以做到这一点,我不认为这是唯一的方法。虽然它非常方便,但对于其他原因来说是一个很好的奖励,而且就我个人而言,这也是我多次使用 JNDI 的原因。 已编辑 - 似乎 JTA 仅适用于容器定义的数据源;我对 JTA 没有丰富的经验,所以只在此处引用文档。事务管理在 Spring 中是健壮的,第三方连接池库被广泛使用。 “JTA 绑定到容器” 不,不是。有多种独立的事务管理器。 Atomikos 和 Bitronix(JTA 提供者)很容易与 Spring 集成,并且可以很容易地与 JTA 集成。详情请参阅docs.spring.io/spring-boot/docs/current/reference/html/…。以上是关于数据源应该由 Spring 还是 web-container 管理?的主要内容,如果未能解决你的问题,请参考以下文章
在 liferay web-content 中使用 staticUtil 服务抛出 freemarker 错误
我应该先学习啥,Spring 还是 Hibernate? [关闭]
在群聊中,新消息事件(websocket)应该由客户端发送还是API发送?