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

     2023-03-27     78

关键词:

【中文标题】使用不同的 jdbc 驱动程序连接到多个数据库【英文标题】:connecting to multiple databases using different jdbc drivers 【发布时间】:2011-06-18 16:28:01 【问题描述】:

我需要编写一个基于守护进程的 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 个 jdbc 驱动程序放在类路径中没有问题。关于设计/模式只需将其构建为您需要的简单/复杂。两个 Connection 变量可能足以满足您的需要。 图像的链接已损坏,至少从 *** 中查看是这样。顺便说一句,你为什么更新这个问题?是验证设计吗? 是的,只是想确保这是正确的做法。图片的直接链接是i279.photobucket.com/albums/kk128/ziggy_76/… 【参考方案1】:

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

不太可能。 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 查询不同的情况。

【讨论】:

@ziggy,如果您以相同的方法连接到两个数据库,您很可能需要一个事务协调器和 XAConnections 而不是普通的连接。在您当前的设计中,如果已提交工作,则无法回滚第二个连接可能根本不会影响第一个连接。 如果我只打算在最后提交怎么办。 IE。仅从 InvoiceBD 提交且仅在对两个数据库的写入均已完成的情况下提交? 这就是我所指的过程。整个提交操作不是原子的。如果第一个成功,第二个失败,那么你必须在第一个做清洁工作。这就是为什么要构思跨多个数据源的 XA 事务或全局事务。 我对 XA 事务不是很熟悉。我将不得不阅读。你知道SQL Server (jtds) 和Oracle jdbc driver(ojdbc14) 是否都支持XA 事务。 是的,他们都有。但是您还需要获得一个 Java 事务管理器来执行这两个连接之间的实际协调。【参考方案2】:
    类路径中的两个驱动程序都没有问题。如果您需要将读取和写入作为单个事务,您可能需要考虑同时使用 XA 驱动程序。如果您需要两阶段提交,则需要同时支持这两个阶段的 XA 驱动程序。 您需要两个 DAO 实例,一个用于 Oracle 读取,另一个用于 SQL Server 写入。

【讨论】:

谢谢@duffymo。我不太明白为什么有两个 DAO 实例。不只是 URL 会有所不同吗?我添加了一个包含所有常见 jdbc 方法的 DatabaseImpl,并将特定于数据库的方法放在“*Impl”类中。见上图。

如何使用 jdbc 代码手动连接到 mysql?

...。我创建了一个使用mysql作为后端的javaweb应用程序。mysql数据库安装在与Web服务器不同的服务器上。在mysql中,我为我的Web应 查看详情

如何使用带有 TNSNames 别名语法的 JDBC 瘦驱动程序连接到 Oracle 数据库

】如何使用带有TNSNames别名语法的JDBC瘦驱动程序连接到Oracle数据库【英文标题】:HowtoconnecttotheOracledatabaseusingJDBCthindriverwithTNSNamesAliasSyntax【发布时间】:2013-01-0905:30:46【问题描述】:我正在尝试使用OracleJDBC瘦驱动程序(11.2.0.2.0... 查看详情

无法使用 jdbc 驱动程序连接到 mysql

】无法使用jdbc驱动程序连接到mysql【英文标题】:Unabletoconnecttomysqlusingjbdcdriver【发布时间】:2018-01-0517:52:22【问题描述】:我正在尝试访问mysql数据库,但出现以下错误:Nosuitabledriverfoundforjdbc:mysql//localhost:3306/...我知道已经有人... 查看详情

无法使用 19.3 JDBC 驱动程序连接到 Oracle 19.3

】无法使用19.3JDBC驱动程序连接到Oracle19.3【英文标题】:Can\'tconnecttoOracle19.3with19.3JDBCdriver【发布时间】:2019-10-1009:02:29【问题描述】:我们有一个使用Oracle19.3数据库运行的项目,以及一个使用Oracle19.3JDBC驱动程序(可在MavenCentra... 查看详情

Birt Eclipse,通过 ODBC 连接到 SQLite 数据库? Birt 是不是需要特定的 JDBC 驱动程序才能使用?

...pse,通过ODBC连接到SQLite数据库?Birt是不是需要特定的JDBC驱动程序才能使用?【英文标题】:BirtEclipse,connectingtoaSQLitedatabasethroughODBC?DoIneedaspecificJDBCdriverforBirttouse?BirtEclipse,通过ODBC连接到SQLite数据库?Birt是否需要特定的JDBC驱动... 查看详情

如何使用一个 JDBC 驱动程序提供多个数据库的列表

】如何使用一个JDBC驱动程序提供多个数据库的列表【英文标题】:HowtoprovidelistofmultipledatabaseswithoneJDBCdriver【发布时间】:2022-01-2009:46:22【问题描述】:目前我需要编写自己的Type2JDBC驱动程序。我正在编写的产品支持ODBC驱动程序... 查看详情

连接到多个 mongo db 主机并在 spring boot 中使用不同的数据库进行身份验证

】连接到多个mongodb主机并在springboot中使用不同的数据库进行身份验证【英文标题】:Connecttomultiplemongodbhostsandauthenticateusingadifferentdatabaseinspringboot【发布时间】:2018-04-0615:53:06【问题描述】:我有一个与mongodb集成的java应用程序... 查看详情

将 SQLserver jdbc 驱动程序连接到 Dataproc 集群

】将SQLserverjdbc驱动程序连接到Dataproc集群【英文标题】:ConnectingSQLserverjdbcdrivertoDataproccluster【发布时间】:2018-11-2609:57:28【问题描述】:我正在开发用于分析航空数据的PySpark应用程序。数据库是一个MSSQLServerDB。在连接到服务器... 查看详情

如何从 Jython 连接到数据库

...BC-ODBC桥:“sun.jdbc.odbc.JdbcOdbcDriver”。如果我使用本机JDBC驱动程序,我的程序将因“找不到驱动程序”异常而失败。 查看详情

如何使用jdbc将cordova应用程序连接到mysql数据库?

不建议使用JDBC直接将您的Cordova应用程序连接到MySQL数据库,因为它会带来安全风险.移动设备通常受到安全漏洞的约束,并且从移动应用程序连接到数据库会增加暴露敏感信息的风险.一种更好的方法是使用Back-最终服务(例如RESTAP... 查看详情

Tomcat 可以支持多个 JDBC 连接池吗?

...:2016-05-1209:04:11【问题描述】:我有一个连接到不同MySQL数据库的SpringBoot应用程序。我计划为这个应用程序添加连接池支持。TomcatJDBC连接池(默认Spring引导池)是否支持我的每个数据库使用多个池?【问题讨论】:你希望Tomcat... 查看详情

如何使用 JDBC 连接到 SQL Server 2008 数据库?

】如何使用JDBC连接到SQLServer2008数据库?【英文标题】:HowdoIconnecttoaSQLServer2008databaseusingJDBC?【发布时间】:2011-01-2722:57:37【问题描述】:我在本地PC上安装了MSSQL2008,我的Java应用程序需要连接到MSSQL数据库。我是MSSQL的新手,我... 查看详情

在 Spark 中使用 jdbc 驱动程序连接到 Hive

】在Spark中使用jdbc驱动程序连接到Hive【英文标题】:ConnecttoHivewithjdbcdriverinSpark【发布时间】:2021-12-0614:09:24【问题描述】:我需要使用Spark将数据从远程Hive移动到本地Hive。我尝试使用JDBC驱动程序连接到远程配置单元:\'org.apach... 查看详情

使用 jdbc Java、Android 应用程序连接到 SQL Server 数据库

...droid应用程序,它将连接到SQLServer数据库。我正在使用JDBC驱动程序并且:在项目设置->库中添加了JDBC(显示在外部库中)连接D 查看详情

无法使用 JDBC 连接到 docker 中的本地 MySQL

...从Windows环境切换到MacOS,无法使用JDBC连接到Java代码中的数据库。我可以使用MySQLWorkbench和命令行客户端连接到数 查看详情

使用 JDBC-ODBC 桥连接到 SQLServer

...写一个应用程序,原型是在MySQL上,现在正在连接到Oracle数据库。要连接到oracle数据库(已建立表结构),我所要做的就是更改连接字符串。连接到另一台机器上的SQLServerDB的格式是什么?我已经阅读了一些教程 查看详情

将 JDBC 驱动程序连接到 MSSQL 数据库时出现问题

】将JDBC驱动程序连接到MSSQL数据库时出现问题【英文标题】:ProblemsconnectingJDBCdrivertoMSSQLdatabase【发布时间】:2015-08-2519:47:18【问题描述】:我们有一个javaweb应用程序,我遇到了一些JDBC问题。去年,在Java7上,我们使用sqljdbc4.jar... 查看详情

使用 DataSource 通过 (Xerial) sqlite-jdbc 驱动程序连接到 SQLite

】使用DataSource通过(Xerial)sqlite-jdbc驱动程序连接到SQLite【英文标题】:UsingDataSourcetoconnecttoSQLitewith(Xerial)sqlite-jdbcdriver【发布时间】:2017-05-0422:56:41【问题描述】:JavaTutorial说有两种方法可以通过JDBC连接到数据库:使用DriverManager... 查看详情