直连数据库提示 No suitable driver found for jdbc:postgresql的问题

背景

我参考数据库手册,尝试在代码里使用直连的方式在数据库中创建数据库等,由于需要适配各个数据库服务所以我分别兼容了mysql、postgresql、oracal等。但是在使用过程中会出现错误:

No suitable driver found for jdbc:postgresql

代码大致逻辑如下:

java 复制代码
Connection connection = null;
Statement statement = null;
try {
    connection = DriverManager.getConnection(url, loginUser, loginPwd);
    statement = connection.createStatement();
    //其他代码
} catch (Exception e){
    LOGGER.error("创建数据库信息异常", e);
    result = false;
} finally {
    close(connection, statement);
}

解决方式

在这个问题中,出现了"no suitable driver found for jdbc:postgresql"的错误。这是因为在尝试建立与PostgreSQL数据库的连接时,JDBC DriverManager没有找到合适的驱动程序。

在JDBC中,驱动程序的加载通常是通过类加载器自动完成的,当你引入了PostgreSQL的依赖后,该依赖应该包含了PostgreSQL的JDBC驱动。

经过排查发现DriverManager中的driver列表只有mysql的Driver。没有postgresql的Driver。但是理论上这个Driver的注册都是在类初始化的时候自动注册的。不知道为什么他没有注册到DriverManager里面。

我首先尝试的解决办法是创建一个我们需要的Driver。例如postgresql的:

java 复制代码
Connection connection = null;
Statement statement = null;
try {
    Class clazz = Class.forName("org.postgresql.Driver");
    clazz.newInstance();
    connection = DriverManager.getConnection(url, loginUser, loginPwd);
    statement = connection.createStatement();
    //其他代码
} catch (Exception e){
    LOGGER.error("创建数据库信息异常", e);
    result = false;
} finally {
    close(connection, statement);
}

这样就会自动执行其中的静态代码块,实现注册Driver到DriverManager的目的。

原因

猜测是接手的项目中JDBC版本有点老的原因

在较新版本的 JDBC 规范中,通常不再需要显式调用Class.forName("org.postgresql.Driver")来加载驱动程序。有些老版本的JDBC驱动程序可能还依赖于Class.forName("org.postgresql.Driver")这种手动加载方式。

使用SpringJDBC

但其实后面发现如果直接使用Spring的JDBCTemplate似乎也不会报上面的问题,最后也是使用这种方式来解决的。

Spring JDBC通常会自动处理驱动程序的加载和注册,因此在使用Spring JDBC时,通常不需要显式调用Class.forName("org.postgresql.Driver")来手动加载驱动程序。Spring JDBC框架会在初始化时自动检测classpath中的JDBC驱动程序,并将其注册到DriverManager中。这样,在您使用Spring JDBC创建数据库连接时,Spring框架会自动选择合适的驱动程序,并建立连接,而无需开发者手动加载驱动程序。

相关推荐
哦虎!7 小时前
【JavaEE】网络初识
java
for_ever_love__8 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
大鸡腿同学8 小时前
手心向上,手心向下
后端
我是人✓8 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡8 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
CCblandy9 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
IT研究室9 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项9 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog9 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼9 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发