我需要编写一个基于守护程序的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连接。 InvoiceBD提交SQL Server连接。
如果出现问题,两个连接对象都会回滚。
这听起来是对的吗?
由于
答案 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)