gpt4 book ai didi

java - 使用不同的 jdbc 驱动程序连接到多个数据库

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:33:32 27 4
gpt4 key购买 nike

我需要编写一个基于守护程序的 java 进程(不是基于 Web 的),它将连接到 Oracle 10G 数据库,从中读取一些数据,然后连接到 SQL Server 数据库并将数据写入表。

听起来很简单,但我对此有几个疑问。

  • 我需要两个 jdbc 驱动程序,一个用于连接 Oracle 数据库,另一个用于连接 sql server 数据库。 sql server jdbc 驱动程序是 jtds jdbc 驱动程序(http://jtds.sourceforge.net/),对于 Oracle,我将使用标准的 oracle jdbc 驱动程序。我是否可能会同时遇到类路径中可用的两个驱动程序的任何问题?

  • 我的猜测是,我只需要一个 ConnectionManager 类来管理连接和一个客户端 DAO 类,该类将调用相关方法来获取所需的连接,具体取决于它是从 Oracle 读取还是写入 SQL服务器。这是一种合理的方法还是对此有更好的设计/模式?

编辑

好的,我已经尝试组合出一个快速的设计解决方案。见下图

我认为我遇到的问题是如何提交。下面是处理流程

  • InvoiceBD 从工厂类获取一个 Oracle 连接并调用 InvoiceUploadDAO.readData 将 Oracle 连接对象传递给它。
  • InvoiceBD 从工厂类获取 SQL Server 连接并调用 InvoiceUploadDAO.writeData 将 SQL Server 连接对象传递给它。
  • InvoiceBD 重新使用 Oracle 连接调用 InvoiceUploadDAO.update 状态,将 Oracle 数据库上的状态设置为“完成”。

InvoiceBD 提交 Oracle 连接。InvoiceBD 提交 SQL Server 连接。

或者如果出现问题,两个连接对象都会回滚。

听起来对吗?

谢谢

最佳答案

Am i likely to come across any problems with both drivers available in the classpath together?

不太可能。 DriverManager.getConnection方法实际上将连接的构建委托(delegate)给向其注册的所有驱动程序。只有识别 JDBC URL 中的协议(protocol)的驱动程序才会返回连接。 JDBC 规范指出:

When the DriverManager is trying to establish a connection, it calls that driver’s connect method and passes the driver the URL. If the Driver implementation understands the URL, it will return a Connection object; otherwise it returns null.

...

The format of a JDBC URL is :

jdbc:<subprotocol>:<subname>

对于 jTDS 和 Oracle(瘦)驱动程序,协议(protocol)格式不同,因此您永远不会遇到问题。但是,切记不要放置同一驱动程序的多个版本。

Is this a reasonable approach or is there a better design/pattern for this?

您正在寻找 DataSource . DataSources 在 Java EE 环境中是可用的,而不是在 Java SE 应用程序中。但是,您可以构建自己的 DataSource 或类似的类;您不需要自己实现 DataSource 接口(interface),但您可以做类似的事情。在您的上下文中,ConnectionManager你的类将通过可能接受一个区分要连接到哪个数据库的参数来承担数据源的角色;您可以考虑使用连接池以备不时之需(如果您只需要一个数据库连接,则不太可能)。

您也可以采用@duffymo 构建 DAO 类的方法,尽管它更适合 SQL 查询不同的情况。

关于java - 使用不同的 jdbc 驱动程序连接到多个数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6397342/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com