Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用不同的jdbc驱动程序连接到多个数据库_Java_Sql Server_Oracle_Jdbc_Jtds - Fatal编程技术网

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

Java 使用不同的jdbc驱动程序连接到多个数据库,java,sql-server,oracle,jdbc,jtds,Java,Sql Server,Oracle,Jdbc,Jtds,我需要编写一个基于守护进程的java进程(不是基于web的),该进程将连接到Oracle 10G数据库,从中读取一些数据,然后连接到SQL Server数据库并将数据写入表 听起来很简单,但我有几个问题 我需要两个jdbc驱动程序,一个用于连接Oracle数据库,另一个用于连接sql server数据库。sql server jdbc驱动程序是jtds jdbc驱动程序(),对于Oracle,我将使用标准的Oracle jdbc驱动程序。在类路径中同时使用两个驱动程序时,我可能会遇到任何问题吗

我需要编写一个基于守护进程的java进程(不是基于web的),该进程将连接到Oracle 10G数据库,从中读取一些数据,然后连接到SQL Server数据库并将数据写入表

听起来很简单,但我有几个问题

  • 我需要两个jdbc驱动程序,一个用于连接Oracle数据库,另一个用于连接sql server数据库。sql server jdbc驱动程序是jtds jdbc驱动程序(),对于Oracle,我将使用标准的Oracle jdbc驱动程序。在类路径中同时使用两个驱动程序时,我可能会遇到任何问题吗

  • 我的猜测是,我所需要的只是一个ConnectionManager类来管理连接,以及一个客户端DAO类,该类将调用相关方法来获取它所需的连接,具体取决于它是从Oracle读取还是写入SQL Server。这是一种合理的方法还是有更好的设计/模式

编辑 好的,我已经尝试了一个快速的设计解决方案。见下图

我认为我面临的问题是如何承诺。下面是处理流程

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

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

听起来是这样吗

谢谢

  • 类路径中的两个驱动程序都没有问题。如果需要将读写作为一个事务,您可能需要考虑对这两个事务使用XA驱动程序。如果您需要两阶段提交,您将需要两个阶段都使用XA驱动程序
  • 您将需要两个DAO实例,一个用于Oracle读取,另一个用于SQL Server写入
  • 在类路径中同时使用两个驱动程序时,我可能会遇到任何问题吗

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

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

    JDBC URL的格式为:

    jdbc::

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

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

    您正在寻找
    数据源
    。数据源在JavaEE环境中是可用的,而不是在JavaSE应用程序中。但是,您可以构建自己的数据源或类似的类;您不需要实现数据源接口本身,但可以做类似的事情。在您的上下文中,您的
    ConnectionManager
    类将承担数据源的角色,可能会接受一个参数来区分要连接到哪个数据库;如果需要连接池,可以考虑使用连接池(如果只需要一个数据库连接,则不太可能)


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

    将两个jdbc驱动程序放在一起没有问题。关于设计/模式,只需根据需要简单/复杂地构建它即可。两个连接变量足以满足您的需要。图像链接已断开,至少从StackOverflow查看时是这样。顺便问一下,你为什么要更新这个问题?是为了验证设计吗?是的,只是想确保这是正确的方法。到映像的直接链接是@ziggy,如果您使用相同的方法连接到两个数据库,则很可能需要事务协调器和XAConnections,而不是普通连接。在您当前的设计中,如果工作已经提交,第二个连接上的回滚失败可能根本不会影响第一个连接。如果我只计划在最后提交呢。也就是说,仅从Invoiced提交,并且仅当对两个数据库的两次写入都已完成时?这就是我所指的过程。整个提交操作不是原子的。如果第一个成功,第二个失败,那么你必须在第一个阶段做清洁工作。这就是XA事务或跨多个数据源的全局事务被构思出来的原因。我对XA事务不是很熟悉。我得仔细阅读一下。您知道SQL Server(jtds)和Oracle jdbc驱动程序(ojdbc14)是否都支持XA事务吗?是的,它们都支持。但是您还需要一个Java事务管理器来执行这两个连接之间的实际协调。我不太明白为什么有两个DAO实例。不仅仅是URL会有所不同吗?我添加了一个DatabaseImpl,它具有所有常见的jdbc方法,并将特定于数据库的方法放在“*Impl”类中。见上图。