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

20 浏览
0 Comments

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

我正在努力理解实际中的企业应用程序(例如,使用Spring Framework的Web应用程序),谁应该管理数据源?我可以想到两种方式:

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

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

现在,我有以下问题:

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

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

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

非常感谢提供有关此问题的详细信息。

0
0 Comments

问题的原因:

- Spring-defined data source可以使你独立于容器,更容易部署应用程序。

- Container-defined data source将数据源的配置权力和责任交给服务器管理员,而不是程序员。

- 这种做法更好地分离了责任和角色。

- 它允许服务器管理员维护和更新数据源,而无需了解你的应用程序的细节。

- 它解决了常见的“不以明文形式存储数据库密码”的要求,将密码的安全性责任交给了容器而不是你。

解决方法:

- 可以在Spring配置中引用JNDI资源,这样Spring会为你执行查找,并可用于依赖注入。

- 可以使用第三方库(如Apache commons-dbcp)为Spring管理的数据源执行连接池操作。

- Spring支持使用内置的TransactionManager进行数据库事务管理。

- 根据文档,似乎只有在数据源定义在容器中时才可使用JPA。

其他内容:

- 可以从Spring配置中删除明文密码,例如使用jasypt。

- 也可以使用其他方法实现这一目标,但使用JNDI是相当方便的,是其他原因的额外奖励,个人在一些情况下就是因为这个原因使用JNDI。

问题扩展:

- 在数据源配置在Spring中的情况下,事务管理和连接池的稳健性如何?Spring本身提供这些服务的支持,还是内部使用第三方库来实现?

- Spring的事务管理是稳健的,广泛使用第三方连接池库。

- 如果想在Spring的事务管理中使用JPA,似乎只能使用容器提供的JPA。

其他解决方案:

- Atomikos和Bitronix(JTA提供者)可以轻松与Spring集成,并可以轻松与JTA集成。

以上是关于“Should Datasource be managed by Spring or web-container?”问题的原因和解决方法的整理。

0