数据源应该由Spring还是Web容器来管理?
数据源应该由Spring还是Web容器来管理?
我正在努力理解实际中的企业应用程序(例如,使用Spring Framework的Web应用程序),谁应该管理数据源?我可以想到两种方式:
(i)在Spring配置中定义数据源,应用程序可以根据需要从Spring容器获取数据源。
(ii)在Web容器(例如)中定义数据源,然后应用程序可以从容器中获取数据源。
现在,我有以下问题:
Q1)在情景(i)中,我相信我们可以使用Spring的DI来注入数据源,因为它由Spring管理。这样对吗?
Q2)在情景(ii)中,获取数据源的唯一方法是使用JNDI查找,因为数据源是在容器中配置的,因此Spring无法进行DI。这样对吗?
Q3)当数据源由Spring容器管理时,它是否能够处理连接池、全局事务等?如果是这样,它是如何做到的?它在内部使用某些第三方库来实现所有这些吗?
非常感谢提供有关此问题的详细信息。
问题的原因:
- 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?”问题的原因和解决方法的整理。