Estoy tratando de agregar idiomáticamente algunos parámetros de consulta nuevos a una URL de JDBC, pero los constructores de URI que están a mi disposición no funcionan correctamente con URL como
jdbc:postgres://localhost:6542/db
Parece que no reconocen correctamente el esquema (en este caso, jdbc:postgres) y asumen erróneamente que el esquema es jdbc .
¿Hay alguna forma idiomática de agregar parámetros de consulta a una URL de JDBC?
No existe tal mecanismo, porque esos creadores de URL generalmente están destinados a URL compatibles con RFC 3986 (tal vez incluso solo diseñados para usar con el esquema http y https ), y las URL de JDBC no son compatibles.
De hecho, JDBC 4.3 solo especifica lo siguiente:
El formato de una URL de JDBC es:
- jdbc:<subprotocolo>:<subnombre>
donde
subprotocoldefine el tipo de mecanismo de conectividad de base de datos que puede ser compatible con uno o más controladores. El contenido y la sintaxis delsubnamedependerán del subprotocolo.Nota : no se requiere una URL de JDBC para adherirse completamente a la sintaxis de URI como se define en RFC 3986, Identificador uniforme de recursos (URI): sintaxis genérica.
Como resultado de esta definición, prácticamente cualquier cosa es válida para subname . Algunos controladores parecerán imitar RFC 3986, pero es posible que no requieran o admitan escapes. Algunos controladores admiten parámetros (propiedades) en la URL, mientras que otros no. Algunos pueden usar ? y & para separar propiedades, mientras que otros pueden usar ; , etc.
Para PostgreSQL, puede salirse con la suya usando un generador de URL en postgres://localhost:6542/db y agregando el prefijo jdbc: después de compilar, pero no estoy seguro de si PostgreSQL es compatible con todas las funciones de una URL RFC 3986, por lo que aún podría terminar con una URL que el controlador no puede analizar correctamente.
Como se sugiere en los comentarios de Laurenz Albe , considere usar un objeto de Properties (cuando use DriverManager directamente), o use mecanismos de su fuente de datos para establecer propiedades, en lugar de confiar en pasar esas propiedades a través de la URL.
Por ejemplo, al usar DriverManager , usaría:
String url = "jdbc:postgres://localhost:6542/db"; Properties props = new Properties(); props.setProperty("user", username); props.setProperty("password", password); props.setProperty("property1", "value1"); // ... try (Connection connection = DriverManager.getConnection(url, props)) { // use connection }