参考类似的问题:
Pattern for connecting to different databases using JDBC
我为每个数据库使用不同的连接字符串/驱动程序。这就是我正在做的事情,不太确定它是否是最有效的方法:
为每个db的Connection创建单独的类,其中包含getConnection(String URl,String userid,String password)方法
在主类中获取DB1,DB2,DB3的连接对象,打开连接
从DB1获取数据,将其写入平面文件,重复DB2和DB3
关闭所有三个连接。
注意:我读过关于使用Spring / Hibernate / DataSources / ConnectionPooling的内容不知道什么是最好的选择
答案 0 :(得分:1)
我理解的方式是您希望应用程序在不同的数据库上运行一些(SELECT
?)查询并转储结果。我认为这是一个更大的应用程序的一部分,因为否则你可能只需编写一个自动化特定数据库的客户端工具的命令行脚本就可以更快地获得结果。
Hibernate ,数据源(在Java DataSource对象意义上)和连接池不会解决您的问题 - 我猜它对于 Spring 来说是一样的,但我不知道你指的是Spring的哪一部分。这样做的原因是它们都被设计为将单个(或池/连接集合)抽象到单个数据库 - 连接池只允许您将一个即用型(TCP)连接池保存到一个数据库中。给定数据库以提高性能,例如通过避免连接和身份验证开销。 Hibernate在抽象到单个数据库的连接的意义上也是这样做的(并且出于性能原因可以使用连接池)。
我建议你可以采取不同的方法来思考你的问题:
由于你想对某些数据源运行一些查询并将结果写入某个目的地,为什么不以这种方式开始你的设计:想出一个需要数据库的接口/类DataExtractionTask
连接,一组要运行的查询和一些输出流。而不是直接使用java.sql.Connection
,你可以选择一些框架来让你的生活更轻松,有像 Hibernate 这样的重量级和像 jdbi 这样的轻量级。然后提出建立数据库连接的代码,决定运行哪些查询以及要写入的输出并将所有这些输出提供到您的考虑因素DataExtractionTask
中以运行处理逻辑(编排各个部分)。
一旦你掌握了基本的东西,你可以在它上面添加其他功能,你可以使它可配置,你可以选择并行运行多个DataExtractionTask
而不是顺序运行。等等。 p>
通过这种方式,您可以概括处理逻辑,然后专注于准备好处理所有内容(数据库连接,查询定义等)。我意识到这是非常宽泛的图片,但也许它会使事情变得更容易。
关于效率:如果你的意思是高性能(相对条款!),那么最好的方法就是@Elliott Frisch所写的 - 将它全部保存在你使用单个数据库连接的单个数据库中连接池。
答案 1 :(得分:0)
您不需要仅为连接使用单独的类,只需构建一个包含所有JDBC URL并从中获取连接的util类。
除此之外,您应该考虑使用JPA,您可以在Java SE中使用JPA,也可以在Java EE中使用JPA。有了它,您可以从低级连接中抽象出来并定义一个命名数据源。请参阅示例this Oracle tutorial。