java - 高效连接多个数据库

标签 java database-connection connection-string

引用类似问题:

Pattern for connecting to different databases using JDBC

我为每个数据库使用不同的连接字符串/驱动程序。这就是我正在做的事情,不太确定这是否是最有效的方法:

为每个数据库的 Connection 创建单独的类,其中包含 getConnection(String URl,String userid,String password) 方法

在主类中获取DB1、DB2、DB3的连接对象,打开连接

从 DB1 获取数据,将其写入平面文件,对 DB2 和 DB3 重复此操作

关闭所有三个连接。

注意:我读到了有关使用 Spring/Hibernate/DataSources/ConnectionPooling 的内容,但不知道什么应该是最好的选择

最佳答案

我的理解是,您希望应用程序在不同的数据库上运行一些(SELECT?)查询并转储结果。我认为这是一个更大的应用程序的一部分,否则您可能只需编写一个命令行脚本来自动执行特定数据库的客户端工具即可更快地获得结果。

Hibernate数据源(在 Java DataSource 对象意义上)和连接池不会解决您的问题 - 我猜这是Spring 也是如此,但我不知道你指的是 Spring 的哪一部分。这样做的原因是,它们都被设计为通过单个(或连接池/连接集合)抽象到单个数据库 - 连接池只是允许您保留一个到数据库的即用型 (TCP) 连接池。给定数据库以提高性能,例如通过避免连接和身份验证开销。 Hibernate 也做了同样的事情,它抽象了到单个数据库的连接(并且出于性能原因可以使用连接池)。

我建议也许采取不同的方法来思考你的问题:

既然您想在某些数据源上运行一些查询并将结果写入某个目的地,为什么不以这种方式开始您的设计:提出一个需要一个接口(interface)/类DataExtractionTask数据库连接、一组要运行的查询和一些输出流。您可以选择一些框架来让您的生活更轻松,而不是直接使用java.sql.Connection,有像Hibernate这样的重量级框架和像jdbi这样的轻量级框架。然后提出建立数据库连接的代码,决定要运行哪些查询以及要写入的输出,并将所有这些输入到您深思熟虑的 DataExtractionTask 中以运行处理逻辑(编排各个部分)。

一旦你掌握了基本的东西,你就可以在上面添加其他功能,你可以使其可配置,你可以选择并行而不是顺序运行多个DataExtractionTask,等等.

通过这种方式,您可以概括处理逻辑,然后专注于让所有内容(数据库连接、查询定义等)做好处理准备。我意识到这是一个非常宽泛的图景,但也许它会让事情变得更容易一些。

关于效率:如果您指的是高性能(相对术语!),最好的方法就是@Elliott Frisch 所写的——将所有内容保存在使用单个数据库连接的单个数据库中连接池。

关于java - 高效连接多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24654803/

相关文章:

java - 在android中创建一个随机数并将其保存到android数据库中?

mysql - Hibernate:无需用户名或密码即可连接到 MySQL

asp.net - 在页面的生命周期内保持数据库连接打开是否可以接受?

c# - MySQL 的连接字符串(asp.net 中的 C#)

java - DB2 中的 jdbc 语句获取大小

java - 如何唤醒所有等待相同条件的线程?

c# - 无法加载 native dll (C :\Users\[Username]\AppData\Local\Temp\. ..\dbdata.dll

.net-core - FluentMigrator 两个 SQL 数据库

asp.net-core - 从 asp.net core 3.1 中的 app.settings.json 文件获取 ConnectionString 值

java - 使用单个适配器显示两个不同类的项目