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

时间:2011-06-18 16:28:01

标签: java sql-server oracle jdbc jtds

我需要编写一个基于守护程序的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连接。

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

这听起来是对的吗?

由于

2 个答案:

答案 0 :(得分:4)

  

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

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

  

DriverManager正在尝试时   建立一个连接,它称之为   驱动程序的连接方法并通过   驱动URL。如果Driver   实现了解URL,它   将返回Connection个对象;   否则返回null

     

...

     

JDBC URL的格式为:

     

jdbc:<subprotocol>:<subname>

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

  

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

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

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

答案 1 :(得分:3)

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