当前位置: 首页 > 知识库问答 >
问题:

RedShift和Postgres JDBC驱动程序都拦截jdbc://postgresql连接字符串

印飞捷
2023-03-14

我有一个问题,我不太确定如何解决:我有一个网络应用程序(打包为战争),客户端可以配置他们希望指向的数据库。我们支持PostgreSQL和红移(以及其他)。JDBC4驱动程序自动加载,这很好。问题是这样的:

RedShift JDBC驱动程序似乎会在PostgreSQL之前响应jdbc://postgresql连接字符串。这会在连接到PostgreSQL数据库时导致JDBC错误。

我在pom.xml中指定驱动程序名称org.postgresql.驱动程序作为数据源的驱动程序,但我不确定Spring JDBC模板如何选择驱动程序(除非它选择第一个处理程序)。

还有谁遇到过这种问题吗?

共有3个答案

傅翰池
2023-03-14

太糟糕了,在我解决这个问题之前,我没有看到其他答案,但我通过这样做来重写红移驱动程序的“postgres”子协议来解决这个问题

String[] names = com.amazon.redshift.PGInfo.PG_SUBPROTOCOL_NAMES;
for (int i = 0; i < names.length; i++)
    if (names[i].equals("postgresql"))
        names[i] = UUID.randomUUID().toString(); // Just random string
钮才哲
2023-03-14

这是因为redShift驱动程序注册为能够处理jdbc: postgresqljdbc: redShiftURL前缀。

当Postgres

drivermanger中实现的逻辑。getDriver()DriverManager。getConnection()是通过每个驱动程序进行循环,并在驱动程序指示它能够处理给定的URL时停止。

如果Postgres驱动程序先注册,一切都会正常进行,因为Postgres驱动程序只尝试处理jdbc:postgresql。如果红移驱动程序设法先注册,那么Postgres驱动程序将永远不会被使用。

我想出的解决这个问题的唯一方法是补充:

static {
    // Put the redshift driver at the end so that it doesn't
    // conflict with postgres queries
    java.util.Enumeration<Driver> drivers =  DriverManager.getDrivers();
    while (drivers.hasMoreElements()) {
        Driver d = drivers.nextElement();
        if (d.getClass().getName().equals("com.amazon.redshift.jdbc41.Driver")) {
            try {
                DriverManager.deregisterDriver(d);
                DriverManager.registerDriver(d);
            } catch (SQLException e) {
                throw new RuntimeException("Could not deregister redshift driver");
            }
            break;
        }
    }
}
厍浩广
2023-03-14

另一个解决方案是为常规PostgreSQL连接向JDBC连接字符串添加“OpenSourceSubToColoverRide=true”。

例:

jdbc:postgresql://localhost:5432/postgres?OpenSourceSubProtocolOverride=true  
 类似资料:
  • 我使用JBoss作为7.1.1.final作为我的应用程序服务器。 我已经在JBoss社区用户论坛上发布了我的问题:question-here jboss-as-cmt war工作得很好,即我能够将客户添加到发票中。我可以psql进入数据库引擎,我可以看到所有的记录。我唯一的问题是我不能使用h2console webapp进入我创建的jboss-as-cmt postgres数据库。 我使用:“o

  • 问题内容: 我目前正在为大学的一个班级做项目。我正在学习有关连接和操作数据库的信息,我们正在使用Microsoft .accdb文件。 这是我到目前为止所拥有的。 当寻找“ sun.jdbc.odbc.JdbcOdbcDriver”时,我得到以下输出。 似乎很容易解决。看来我想念司机或类似的东西。但是,我很难找到解决方法。JDK随附驱动程序吗?我需要单独下载吗?是否取决于我的操作系统?(Mac O

  • 我有一个类试图连接到Heroku数据库: 它返回的是: java.lang.RuntimeException:java.sql。SQLException:未找到适合jdbc的驱动程序:postgres://osnvehqhufnxzr:TS3Qt37c_HHbGRNKw3yk7g88fp@ec2-54-225-93-34.compute-1.amazonaws.com:5432/d39mfq0od

  • 问题内容: 我很难确定应该如何在我的debian 6.0服务器上为PostgreSQL安装JDBC驱动程序。我已将驱动程序.jar移至以下目录: 然后,教程讨论如何使用此代码: 但是,由于我是PostgreSQL的新手,所以我不知道应该把这行放在哪里,或者这是否正确。 我的问题是,除了将jar文件移动到此位置之外,为了在我的postgreSQL安装上安装JDBC驱动程序,我实际上需要做什么? 编辑

  • 拦截驱动器 bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径

  • 我目前正在尝试使用C3P0作为我的JDBC连接池来设置Apache Ignite,但是我注意到由于Ignite驱动程序不支持事务,C3P0是不可用的。 有没有人幸运地用Ignite驱动程序获得了JDBC连接池?建议? 因此,如果我想建立一个JDBC连接池,我需要一个C3P0的替代方案;有什么建议吗?