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

我需要编写一个基于守护进程的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 Server。 这是一种合理的方法还是有更好的设计/模式?

编辑

好吧,我试图整理一个快速的设计解决方案。 见下图

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

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

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

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

那个听起来是对的吗?

谢谢

我可能会遇到类路径中可用的两个驱动程序的任何问题吗?

不太可能。 DriverManager.getConnection方法实际上将连接的构造委托给在其中注册的所有驱动程序。 只有识别JDBC URL中的协议的驱动程序才会返回连接。 JDBC规范声明:

DriverManager尝试建立连接时,它会调用该驱动程序的connect方法并将驱动程序传递给URL。 如果Driver实现了解URL,它将返回一个Connection对象; 否则返回null

JDBC URL的格式为:

jdbc::

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

这是一种合理的方法还是有更好的设计/模式?

您正在寻找一个DataSource 。 DataSources可以在Java EE环境中使用,而不是在Java SE应用程序中使用。 但是,您可以构建自己的DataSource或类似的类; 您不需要自己实现DataSource接口,但您可以执行类似的操作。 在您的上下文中,您的ConnectionManager类将通过接受区分要连接的数据库的参数来承担DataSource的角色; 您可以考虑使用连接池以防万一(如果您只需要一个连接到数据库)。

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

  1. 类路径中的两个驱动程序都没有问题。 如果您需要将读取和写入作为单个事务,则可能需要考虑为两者使用XA驱动程序。 如果您需要两阶段提交,那么您将需要两个XA驱动程序。
  2. 您需要两个DAO实例,一个用于Oracle读取,另一个用于SQL Server写入。