数据库
首页 > 数据库> > java – 使用不同的jdbc驱动程序连接到多个数据库

java – 使用不同的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连接.

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

那个听起来是对的吗?

谢谢

解决方法:

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

不太可能. DriverManager.getConnection方法实际上将连接的构造委托给在其中注册的所有驱动程序.只有识别JDBC URL中的协议的驱动程序才会返回连接. 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(瘦)驱动程序,协议格式不同,因此,您永远不会遇到问题.但是,请记住不要放置同一驱动程序的多个版本.

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

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

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

标签:java,sql-server,oracle,jdbc,jtds
来源: https://codeday.me/bug/20190730/1577980.html