当前位置: 首页 > 面试题库 >

使用了错误的JDBC驱动程序?

孙修贤
2023-03-14
问题内容

我有一种方法可以将记录插入Postgres
DB中,并返回为所述记录生成的标识字段。问题是,如果我在我的POM文件中包含Redshift驱动程序,那么该驱动程序将代替Postgres驱动程序被使用-
Redshift驱动程序不允许返回标识值。

代码是:

try {
  Class.forName( "org.postgresql.Driver" ).newInstance();
  Connection connection = DriverManager.getConnection( "jdbc:postgresql://localhost:5433/postgres", "postgres", "password" );
  Statement stmt = connection.createStatement();
  stmt.execute( "insert into public.job ( job_name ) values ( 'test' )" , Statement.RETURN_GENERATED_KEYS );
  ResultSet keyset = stmt.getGeneratedKeys();
  if ( keyset.next() ) System.out.println( keyset.getLong( 1 ) );
}
catch ( Exception e ) {
  e.printStackTrace();
}

使用此POM时,它可以工作:

<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1201-jdbc41</version>
    </dependency>
</dependencies>

使用此POM时,它不起作用:

<dependencies>
    <dependency>
        <groupId>com.amazonaws</groupId>
        <artifactId>redshift.jdbc</artifactId>
        <version>1.1.2.0002</version>
    </dependency>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>9.4-1201-jdbc41</version>
    </dependency>
</dependencies>

是什么让Java选择Redshift驱动程序而不是Postgres驱动程序?

(Redshift驱动程序的类路径为 com.amazon.jdbc41.Driver ,因此我认为这不是类路径冲突)

TIA


问题答案:

您的问题是Java支持ServiceLoaderJDBC 4.0 的机制。

在JDBC 4中,DriverManagerMETA- INF/services/java.sql.Driver根据其jar文件中的设置查找并注册驱动程序。调用getConnection()DriverManager时,将为给定的jdbc
URL选择第一个合适的驱动程序。

现在redshift和postgres驱动程序在jdbc网址方面有所不同,但是(引自redshift文档http://docs.aws.amazon.com/redshift/latest/mgmt/configure-
jdbc-connection.html#obtain-jdbc-
url):

以jdbc:postgresql:// endpoint:port / database的以前格式指定的JDBC URL仍然可以使用。

现在,发生的事情是,来自redshift的JDBC驱动程序被加载到服务条目上,并将自己放置为redshift jdbc URL和postgres
URL的驱动程序。

我无法确切说明是否DriverManager允许通过加载另一个驱动程序来覆盖现有的jdbc-driver-
links,但是解决您的问题的方法可能是显式控件,该控件要么先加载postgres驱动程序(如果URL仅被注册一次),要么显式加载它在redshift驱动程序之后(如果可以覆盖JDBC
URL映射)。

我不能告诉您是否存在禁止redshift驱动程序注册postgres URL的属性。



 类似资料:
  • 从MATLAB R2017a Windows-7连接数据库的尝试失败。 错误消息:找不到JDBC驱动程序 JDBC驱动程序是: null null 尝试这些JDBC驱动程序的尝试都没有成功,因为在javaclass路径中单独测试了每个文件: C:\drivers\mysql-connector-java-6.0.6\mysql-connector-java-6.0.6-bin.jar C:\dri

  • 复习我的Java技能,伙计们。我曾经在类内用Java声明我的连接细节。这次我决定尝试使用context和@Resource方法,但出现了一些错误 信息:服务器在1701毫秒内启动ervlet.java:725SQLException:无法为hain.java:2912的连接URL'jdbc: oracle:瘦@hain.internal'创建类'org.apache.catalina.core.O

  • 《2013年水晶报告》。使用Informix JDBC驱动器ifxjdbc.jar。报告之前正在工作 情况: > crconfig.xml已编辑,因此类路径中包含以下内容: C:\Program Files(x86)\SAP BusinessObjects\SAP BusinessObjects Enterprise XI 4.0\java/lib/ifxjdbc.jar null 获取JDBC驱

  • 那么,为什么Oracle JDBC驱动程序创建使用ISO-8859-1字节编码的字符串呢?如何在不改变数据库(也不转换字符串)的情况下获得UTF-8字节编码的字符串?我可以从驱动程序配置ou JMV args中更改它吗?

  • 有一个问题,它不隐藏浏览器,我能做什么?

  • 我正试图使用IntelliJ IDE从Spark连接到老虎机数据库。有人能帮助jdbc驱动程序(。jar)文件吗?我正在寻找“com.tigergraph.jdbc.驱动程序”。 我确实找到了下面的gitHub存储库,其中包含了所有必需的信息。java文件。但是,我不知道如何在我的spark项目中使用它。https://github.com/tigergraph/ecosys/tree/maste