如何从 运行 Web 应用程序连接到第二个、第三个、第四个等数据库?

How to connect to second, third, fourth, etc. database from a running web application?

我还没有代码,因为这是一个基于概念的问题,而不是实际的实施问题,所以我出价了你的许可。

我正在开发一个基于 Spring 的 Web 应用程序,它有自己的数据库用于访问、配置和工作。但是这个应用程序必须连接到其他数据库并执行 SQL select 查询。虽然应用程序(我们称之为主机)自己的数据库是 MySQL,但它应该能够连接到 MySQL 和 MS_SQL 数据库(我们称之为访客)。

主机应该能够实例化与来宾的连接,检索 SQL 结果集并关闭连接。

这里的问题是应该怎么做?使用 c3p0?一些连接工厂?我以前从未遇到过这样的问题,希望得到一些帮助。

应用程序与 "its" 数据库之间没有特殊关系。对于您想访问的数据库数量,您有相同的基本选项。

有一种老式的方法,使用 DriverManager, and there is the newer way, of instantiating a DataSource 的静态方法,可以从中获取连接。使用 DataSource 的一个优点是它可以为您汇集 Connections,从而为您提高性能(以一些额外的线程和内存开销为代价)。

您的应用程序很可能会频繁访问您的 "main" 数据库。除非您的 DBMS 或应用程序服务器提供自己的具有透明连接池的 DataSource 实现,否则您几乎肯定会希望通过为您提供此功能的库访问此数据库,例如 c3p0 or HikariCP.

对于其他数据库,如果您不经常访问它们并且您对它们的使用对性能不是特别敏感,您可以考虑只使用 DriverManager.getConnection(...) 或 [=10 的简单、非池化实现=] 就像 c3p0 的 DriverManagerDataSource。如果您要经常使用其他数据库,那么您将希望通过池支持的数据源访问它们。

(您可能想要选择一个池化库并坚持使用它来访问您的所有数据库。没有什么能阻止您使用 dbcp 池化访问一个 DBMS,使用 HikariCP 池化访问另一个 DBMS,另一个 c3p0 等,但你会增加无用的复杂性。)

您必须考虑的主要事情是速度和 memory/thread 开销之间的权衡。对于很少访问的数据库,通常最好不要使用连接池。对于经常访问的数据库,如果速度很重要,您几乎肯定会想要使用池库。

无论如何,您始终可以通过 DriverManagerDataSource 从您的应用程序访问任意数量的数据库。 JDBC 是一个优雅、统一的 DBMS 接口。您面临的(小)复杂性是决定使用 DataSource 的哪些实现。