2015-08-11 18 views
5

Tôi gặp vấn đề khi tôi không biết cách giải quyết: Tôi có một ứng dụng web (được đóng gói như một cuộc chiến) và khách hàng có thể cấu hình cơ sở dữ liệu nào muốn chỉ đến. Chúng tôi hỗ trợ cả PostgreSQL và Redshift (cũng như những người khác). Các trình điều khiển JDBC4 được tải tự động, điều này tốt. Đây là vấn đề:Trình điều khiển JDBC Redshift và Postgres đều chặn chuỗi kết nối jdbc: // postgresql

Dường như trình điều khiển JDBC Redshift sẽ trả lời chuỗi kết nối jdbc: // postgresql trước khi PostgreSQL có thể. Điều này gây ra lỗi JDBC khi kết nối với cơ sở dữ liệu PostgreSQL.

Tôi đang chỉ định tên trình điều khiển 'org.postgresql.Driver' làm trình điều khiển cho nguồn dữ liệu trong tệp pom.xml của mình, nhưng tôi không chắc chắn cách các mẫu JDBC mùa xuân đang chọn trình điều khiển (trừ khi nó chọn xử lý đầu tiên).

Bất kỳ ai khác đều gặp sự cố này?

Trả lời

2

Điều này là do trình điều khiển chuyển đổi màu đỏ đăng ký là có thể xử lý cả tiền tố URL jdbc:postgresqljdbc:redshift.

Khi Postgres & trình điều khiển Redshift được tải từ các lọ của chúng, mỗi thẻ đăng ký với DriverManger.

Logic được triển khai trong DriverMananger.getDriver()DriverManager.getConnection() là lặp qua từng trình điều khiển và dừng khi trình điều khiển cho biết rằng trình điều khiển có thể xử lý URL đã cho.

Nếu trình điều khiển Postgres đăng ký trước, mọi thứ hoạt động tốt như trình điều khiển Postgres chỉ cố xử lý jdbc:postgresql. Nếu trình điều khiển Redshift quản lý để đăng ký đầu tiên, sau đó trình điều khiển Postgres sẽ không bao giờ được sử dụng.

Cách duy nhất tôi đã tìm ra để giải quyết này là thêm:

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; 
     } 
    } 
} 
+0

Chúng tôi đang sử dụng Spring JDBC mẫu, là có một cách để chỉ định cho một DataSource người lái xe nên được sử dụng? Tôi nghĩ rằng tôi thấy một cái gì đó như setDriver() trên trình quản lý Driver, nhưng tôi là một chút của một mùa xuân noob ... –

+0

Tôi không quen thuộc với mùa xuân, vì vậy không chắc chắn. Nếu mùa xuân chỉ sử dụng DriverManager đằng sau hậu trường thì tôi nghĩ rằng sắp xếp lại các trình điều khiển nên làm các trick. –

5

Một giải pháp khác sẽ được thêm "OpenSourceSubProtocolOverride = true" để JDBC chuỗi kết nối cho các kết nối PostgreSQL thường xuyên.

Ví dụ:

jdbc:postgresql://localhost:5432/postgres?OpenSourceSubProtocolOverride=true 
+0

điều này được sửa cho tôi thêm vào URL hiện tại của PG db. – jhnclvr

Các vấn đề liên quan