我需要编写一个基于守护进程的java进程(不是基于web的),它将连接到Oracle 10G数据库,从中读取一些数据,然后连接到SQL Server数据库并将数据写入表中。
听起来很简单,但我对此有几个疑问。
我需要有两个 jdbc 驱动程序,即一个用于连接到 Oracle 数据库,另一个用于连接到 sql server 数据库。 sql server jdbc驱动程序是jtds jdbc驱动程序(http://jtds.sourceforge.net/ http://jtds.sourceforge.net/)对于 Oracle,我将使用标准的 oracle jdbc 驱动程序。我是否可能会遇到类路径中同时提供的两个驱动程序的任何问题?
我的猜测是,我需要的只是一个用于管理连接的 ConnectionManager 类和一个客户端 DAO 类,该类将调用相关方法来获取所需的连接,具体取决于它是从 Oracle 读取还是写入 SQL Server。这是一个合理的方法还是有更好的设计/模式?
EDIT
好吧,我尝试整合一个快速的设计解决方案。见下图
我认为我遇到的问题是如何承诺。这是处理流程
- InvoiceBD 从工厂类获取 Oracle 连接,并调用 InvoiceUploadDAO.readData 向其传递 Oracle 连接对象。
- InvoiceBD 从工厂类获取 SQL Server 连接,并调用 InvoiceUploadDAO.writeData 向其传递 SQL Server 连接对象。
- InvoiceBD 重用 Oracle 连接来调用 InvoiceUploadDAO.update status 以将 Oracle 数据库上的状态设置为“完成”。
InvoiceBD 提交 Oracle 连接。
InvoiceBD 提交 SQL Server 连接。
或者,如果出现问题,两个连接对象都会回滚。
那个听起来是对的吗?
Thanks
我是否可能会遇到类路径中同时提供的两个驱动程序的任何问题?
不太可能。这DriverManager.getConnection
方法实际上将连接的构建委托给所有向其注册的驱动程序。只有识别 JDBC URL 中的协议的驱动程序才会返回连接。 JDBC 规范指出:
当。。。的时候DriverManager
正在努力
建立连接,它调用
驱动程序的 connect 方法并传递
驱动程序的 URL。如果Driver
实现理解 URL,它
将返回一个Connection
目的;
否则它返回null
.
...
JDBC URL 的格式为:
jdbc:<subprotocol>:<subname>
对于 jTDS 和 Oracle(瘦)驱动程序,协议格式不同,因此,您永远不会遇到问题。但是,请记住不要放置同一驱动程序的多个版本。
这是一个合理的方法还是有更好的设计/模式?
您正在寻找一个DataSource
。数据源在 Java EE 环境中可用,而不是在 Java SE 应用程序中可用。但是,您可以构建自己的 DataSource 或类似的类;您不需要实现 DataSource 接口本身,但您可以执行类似的操作。在您的情况下,ConnectionManager
您的类将通过可能接受区分要连接到哪个数据库的参数来承担数据源的角色;如果您需要一个连接池,您可以考虑使用连接池(如果您只需要一个到数据库的连接,则不太可能)。
您还可以采用 @duffymo 构建 DAO 类的方法,尽管它更适合 SQL 查询不同的情况。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)