Java 8中移除JDBC ODBC桥接器

37

从Java 8开始,JDBC-ODBC桥将不再包含在JDK中。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // classNotFoundException is thrown

有没有其他连接JDBC-ODBC桥的解决方案?


有人可以帮我吗? - Karthik
2
http://www.easysoft.com/blog/java-8.html - Ricky Mutschlechner
2
你可以随时从JDK 7中提取驱动程序。 - BAR
@RickyMutschlechner 为什么选择EasySoft?它们似乎价格过高... - BAR
1
@BAR,我只是从谷歌上随便找到的建议。lol - Ricky Mutschlechner
你可以在jre8中使用来自jre7的jdbc odbc类 - 请参见https://dev59.com/XZLea4cB1Zd3GeqPzDBe#34617075 - Frank M.
5个回答

32
我们仍然可以在Java 8中使用JDBC-ODBC桥,只需按照以下简单步骤操作:
  1. 下载JDK 7或JRE 7。
  2. 进入JRE\lib文件夹并找到rt.jar。
  3. 解压它(如果您已经安装了WinRAR或7zip),或者您可以将其重命名为rt.zip并解压它。
  4. 将sun \ jdbc和sun \ security \ action文件夹复制出来,并保留文件夹结构。也就是说,您的文件夹结构应该像下面这样:

    Sun --> Security --> Action
        --> JDBC
    
  5. 打开CMD窗口。 进入Sun文件夹的父文件夹。 运行命令:jar -cvf jdbc.jar sun

  6. 上述命令将创建名为jdbc.jar的文件
  7. 将JDBC.jar复制到JDK8或JRE8的lib文件夹中。 如果不起作用,请尝试lib\ext文件夹。
  8. 将JRE 7安装的JRE \ bin中的jdbcodbc.dll复制到JRE 8安装的JRE \ bin中。
  9. 重新启动JVM。

如何在JDK 8中启用JDBC-ODBC桥接器


2
点赞这个解决方案,因为它对我有效。但是请注意,你必须将其复制到\lib\ext文件夹中,并小心不要将32位版本复制到64位版本中,反之亦然。 - runholen
嗨,弗兰克,@runholen,你们能帮我解决同样的问题吗?这是我的问题链接:http://stackoverflow.com/questions/38616703/connecting-to-excel-using-jdbc-8 - user2423959
1
对于第一步,另一个选择是只解压需要的内容,而不是下载和运行安装程序。Windows exe 文件可以使用 7zip 打开,并通过使用 unpack200 命令提取 rt.jar。您也可以提取 dll 文件。http://www.brucalipto.org/java/how-to-create-a-portable-jdk-1-dot-7-on-windows/ - Dale
1
对于第7步,如果JRE8的lib文件夹不起作用,请尝试JRE8的lib\ext文件夹。将其放入lib文件夹中对我没有用,但是lib\ext有用。我尝试将其添加到答案中,但被拒绝了。其他更有经验的人应该将其添加到答案中。 - Dale
显示剩余5条评论

15

我认为,这篇由Oracle员工撰写的博客文章已经说明了一切:

我建议您使用由数据库供应商提供的JDBC驱动程序或商业JDBC驱动程序,而不是JDBC-ODBC桥接器。

您正在使用JDBC-ODBC桥接器的哪种应用程序?

  • 如果是生产代码,我建议尽快用真正的驱动程序替换桥接器和传统数据库
  • 如果是与Access数据库、Excel电子表格或通过ODBC访问的任何其他内容交互的测试代码,请尝试将其替换为纯Java数据库,例如H2
  • 如果您将其用于临时访问旧版Access数据库,以进行开发和/或分析目的,并且确实无法或不想更新任何内容,您可以坚持使用JDK 7很长时间,直到其生命周期结束日期,甚至可能更长时间

1
作为对这个答案的补充,我想指出你可以使用Apache POI来读取Excel电子表格和Jackcess来读取Access数据库。不过,这两种方法都比ODBC需要更多的工作。 - Laurent Bourgault-Roy
6
一位Oracle员工建议更换您的企业数据库,因为缺乏持续的驱动程序支持。经典。 - BAR
@BAR:哪个“企业级”数据库没有适当的JDBC驱动程序? - user330315
1
@a_horse_with_no_name 这正是我的观点。任何真正的企业级数据库都将拥有JDBC。 - BAR
1
并不总是最好的解决方案是将ODBC驱动程序替换为JDBC遗留驱动程序,例如:在使用Sybase IQ时,ODBC驱动程序比OLAP的JDBC驱动程序快500%。仅仅是我的经验。 - ChoCho

12

有没有其他连接JDBC-ODBC桥的解决方案?

Sun和Oracle的官方立场长期以来一直是--

应该将[JVM捆绑的] JDBC-ODBC桥视为过渡性解决方案[...] Oracle不支持JDBC-ODBC桥。

然而,我的雇主OpenLink Software自JVM 1.0以来就生产了企业级商业类型1桥接器,可以在当前的JVM 1.8上完全兼容。您可以在这里了解更多信息--


请为好答案点赞。你能告诉我这个桥接驱动程序的许可协议在哪里吗? - Y123
@YazadKhambata - 我不确定你在寻找什么。可能是这个?你也可以在这里了解更多信息。 - TallTed
这正是我在寻找的。谢谢。 - Y123

10

我找到了一个合理的解决方案,只需更改打开数据库连接逻辑即可使用现有代码。

UCanAccess是一个开源的JDBC驱动程序。

http://ucanaccess.sourceforge.net/site.html

它有两个依赖项,其中一个又有两个依赖项。

jackcess-2.0.0.jar或更高版本

commons-lang-2.4.jar

commons-logging-1.0.4.jar

hsqldb.jar(2.2.5)

它们都是开源的。进行互联网搜索,下载,必要时解压缩并将所有四个JAR文件以及UCanAccess的一个JAR文件放在项目目录中(例如JDBC-to-MSAccess)。如果使用Eclipse,请从菜单“项目/属性/Java编译器/库/添加外部JAR文件”中选择,并选择所有五个JAR文件,以将其添加到您的构建路径中。

连接逻辑非常简单:


String strConnectionString = "";
Connection conAdministrator = null;

// Register driver
Class.forName( "net.ucanaccess.jdbc.UcanaccessDriver" );

// System.getProperty( "user.dir" ) => Current working directory from where application was started

strConnectionString = "jdbc:ucanaccess://" + System.getProperty( "user.dir" )  + "\\Your-database-name.<mdb or accdb>";

// Open a connection to the database
conAdministrator = DriverManager.getConnection( strConnectionString );

2
帮助想要连接到Access数据库的用户的好建议(更多详细信息在此处)。但并不是通用的ODBC解决方案。 - Gord Thompson

1

Robert Petermeier提出了一个很好的观点,H2驱动支持通过PostgreSQL驱动程序使用ODBC,您可以根据Stackoverflow链接在Windows上设置PostgreSQL ODBC安装驱动程序。


我想对Robert Petermeier表示感谢,因为他的精彩答案使我在一小时内成功迁移到了H2。由于我的声望不高,我无法提高他的答案评分,但我仍然要说声谢谢。 - Singagirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接