解决金仓数据源报:Caused by: java.lang.ClassNotFoundException: com.kingbase.Driver

文件名称版本号作者qq版本
解决金仓数据源报:Caused by: java.lang.ClassNotFoundException: com.kingbase.Driverv1.0.0学生宫布8416837SpringBoot 2.2.6
SpringCloud Hoxton.SR4

备注:这个问题是自定义代码bug,网上可能没有多少人遇到这个问题

报错全称

Caused by: java.lang.ClassNotFoundException: com.kingbase.Driver
	at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
	at java.lang.Class.forName0(Native Method)
	at java.lang.Class.forName(Class.java:264)
	at com.alibaba.druid.util.JdbcUtils.createDriver(JdbcUtils.java:674)
	... 161 common frames omitted

java.sql.SQLException: com.kingbase.Driver
	at com.alibaba.druid.util.JdbcUtils.createDriver(JdbcUtils.java:676)
	at com.alibaba.druid.pool.DruidDataSource.resolveDriver(DruidDataSource.java:1203)
	at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:878)

代码

druid 已编译的↓

// this.driverClass是字符串
this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl);
...
this.driver = JdbcUtils.createDriver(this.driverClassLoader, this.driverClass);
...
public static Driver createDriver(ClassLoader classLoader, String driverClassName) throws SQLException {
        Class<?> clazz = null;
        if (classLoader != null) {
            try {
                clazz = classLoader.loadClass(driverClassName);
            } catch (ClassNotFoundException var8) {
            }
        }

        if (clazz == null) {
            try {
                ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
                if (contextLoader != null) {
                    clazz = contextLoader.loadClass(driverClassName);
                }
            } catch (ClassNotFoundException var7) {
            }
        }

        if (clazz == null) {
            try {
                clazz = Class.forName(driverClassName);
            } catch (ClassNotFoundException var6) {
                throw new SQLException(var6.getMessage(), var6);
            }
        }
...

产生的原因

因为没有获取传来的驱动类,所以就根据数据源分配驱动:
在这里插入图片描述
在这里插入图片描述

分配的驱动不正确,——根据源码(编译版)可知:
druid↓ 注意倒数第二行

// 获取驱动
public static String getDriverClassName(String rawUrl) throws SQLException {
...
} else if (!rawUrl.startsWith("jdbc:kingbase:") && !rawUrl.startsWith("jdbc:kingbase8:")) {
                    if (rawUrl.startsWith("jdbc:gbase:")) {
                        return "com.gbase.jdbc.Driver";
                    } else if (rawUrl.startsWith("jdbc:xugu:")) {
                        return "com.xugu.cloudjdbc.Driver";
                    } else if (rawUrl.startsWith("jdbc:hive:")) {
                        return "org.apache.hive.jdbc.HiveDriver";
                    } else if (rawUrl.startsWith("jdbc:hive2:")) {
                        return "org.apache.hive.jdbc.HiveDriver";
                    } else if (rawUrl.startsWith("jdbc:phoenix:thin:")) {
                        return "org.apache.phoenix.queryserver.client.Driver";
                    } else if (rawUrl.startsWith("jdbc:phoenix://")) {
                        return "org.apache.phoenix.jdbc.PhoenixDriver";
                    } else if (rawUrl.startsWith("jdbc:kylin:")) {
                        return "org.apache.kylin.jdbc.Driver";
                    } else if (rawUrl.startsWith("jdbc:elastic:")) {
                        return "com.alibaba.xdriver.elastic.jdbc.ElasticDriver";
                    } else if (rawUrl.startsWith("jdbc:clickhouse:")) {
                        return "ru.yandex.clickhouse.ClickHouseDriver";
                    } else if (rawUrl.startsWith("jdbc:presto:")) {
                        return "com.facebook.presto.jdbc.PrestoDriver";
                    } else if (rawUrl.startsWith("jdbc:inspur:")) {
                        return "com.inspur.jdbc.KdDriver";
                    } else if (rawUrl.startsWith("jdbc:polardb")) {
                        return "com.aliyun.polardb.Driver";
                    } else {
                        throw new SQLException("unknown jdbc driver : " + rawUrl);
                    }
                } else {
                    return "com.kingbase.Driver";
                }

上述代码很明显,以jdbc:kingbase:jdbc:kingbase8:开头的数据源返回"com.kingbase.Driver"
但是"com.kingbase.Driver"这个类在项目是不存在的,试用的是8版本,所以报错了。因为试用的是kingbase8,驱动类应该是:com.kingbase8.Driver

弯路、坑

找源码是没错的,但这里有个误区,源码返回"com.kingbase.Driver"是因为连接池底层没能获取上层传的driverClassName键,因为key值使用了横线写法,而不是小驼峰↓
在这里插入图片描述
这个driverClassName是自定义的配置,进入druid之前,会经过一定解析,按道理,横线写法也是可以识别的,进入底层之前的解析疑似有bug。

分析

因为没传驱动类,导致自动分配的驱动类不合适,看看最新源码吧,
找到源码,发现最新提交是12天前:
在这里插入图片描述
但是此次提交注释与kingbase8无关,点进去看看再说,
在这里插入图片描述
在这里插入图片描述
那么,根据druid的源码,如果不传驱动类,则分配驱动类"com.kingbase.Driver"

解决方案

1)将driver-class-name改为driverClassName

领悟

如果很蹊跷,八成是低级错误

关于

若交流技术,请联系qq:8416837

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
要连接人大金仓数据库,你需要使用Java的JDBC驱动程序。根据引用,人大金仓数据库的JDBC驱动程序的包名为com.kingbase.Driver。你可以在代码中通过引用该驱动程序来建立连接。在你提供的代码中,可以看到连接人大金仓数据库的相关信息已经被设置好了。其中,url是数据库的地址和名字,user和password是登录数据库的用户名和密码。你只需要确保这些信息正确无误即可。 在你的代码中,通过引用中的建立连接可以看到,首先需要注册驱动程序,然后使用DriverManager.getConnection方法获取连接对象。在获取到连接对象之后,你就可以执行SQL语句了。 例如,如果你想要向人大金仓数据库的TB_SYS_CONFIGURE表中添加数据,你可以使用INSERT INTO语句,如引用所示。在这个语句中,你可以指定要插入的字段和对应的值。 注意,为了确保连接成功和关闭连接,你需要在适当的地方添加异常处理和关闭连接的代码。 以下是一个示例代码,展示了如何连接人大金仓数据库并添加数据: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class Main { public static void main(String[] args) { String url = "jdbc:kingbase://192.168.0.211:54322/TEST"; String driver = "com.kingbase.Driver"; String user = "SYSTEM"; #### 引用[.reference_title] - *1* [人大金仓数据库 jdbc](https://download.csdn.net/download/z343929897/18910777)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [人大金仓数据库总结(SQL和JDBC)](https://blog.csdn.net/qq_18769269/article/details/82775937)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值