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

Java:找不到适合jdbc的驱动程序:h2

寇景明
2023-03-14

我的一些代码有问题,我已经搜索并尝试了我所知道的一切,但没有任何运气。

场景:

>

  • 应用程序检查JDBC驱动程序是否存在,在本例中是H2驱动程序(org.H2.driver)
  • 如果不存在,应用程序将下载JDBC驱动程序并将其添加到类加载器中,如下所示:(注意:storageDataManager是我用于SQL方法的一个类)

       File h2Driver = new File(directory.toString() + File.separator + "lib" + File.separator + "h2.jar");
       if (h2Driver.exists()) {
           URL[] url = new URL[0];
           try {
               url = new URL[]{h2Driver.toURI().toURL()};
               storageDataManager.setClassLoader(new URLClassLoader(url));
           } catch (MalformedURLException ignore) {}
        }
    

    当Storage ageDataManager运行第一个查询时,它会尝试与指定的驱动程序连接,如果它确实有ClassLoader,它会使用ClassLoader:

    if (getClassLoader() != null) {
        getLogging().debug("Loading custom class loader for H2 driver: " + getClassLoader().toString());
        Driver driver = (Driver) Class.forName("org.h2.Driver", true, getClassLoader()).newInstance();
        getLogging().debug("Loaded H2 driver: " + driver.toString() + " - " + driver.getMinorVersion() + " - " + driver.getMajorVersion());
        DriverManager.registerDriver(driver);
    } else {
        getLogging().debug("Loading H2 driver.");
        Class.forName("org.h2.Driver");
    }
    outputDrivers();
    this.con = DriverManager.getConnection(this.url, this.username, this.password);
    break;
    

    当我运行应用程序时,我得到这个错误:

    "*没有为jdbc: h2: plugins\Odin\data\OdinStorage找到合适的驱动程序;AUTO_RECONNECT=TRUE*"

    以下是完整日志

    [Debug] Loading custom class loader for H2 driver: java.net.URLClassLoader@3bf3d5f4
    [Debug] Loaded H2 driver: org.h2.Driver@67257ce8 - 3 - 1
    [Debug] Checking DriverManager drivers.
    [Debug] Found driver #1: sun.jdbc.odbc.JdbcOdbcDriver
    [Debug] Found driver #2: com.mysql.jdbc.Driver
    [Debug] Found 2 drivers in DriverManager.
    --------------------------- STACKTRACE ERROR ---------------------------
    Class name: java.sql.DriverManager
    Error message: No suitable driver found for jdbc:h2:plugins\Odin\data\OdinStorage;AUTO_RECONNECT=TRUE
    Error cause: null
    File name: null
    Function name: getConnection
    Error line: -1
    --------------------------- STACKTRACE START ---------------------------
    java.sql.DriverManager.getConnection(Unknown Source)
    java.sql.DriverManager.getConnection(Unknown Source)
    com.craftfire.commons.managers.DataManager.connect(DataManager.java:756)
    com.craftfire.commons.managers.DataManager.executeQuery(DataManager.java:526)
    com.craftfire.odin.managers.StorageManager.checkInventoryDatabase(StorageManager.java:65)
    com.craftfire.odin.managers.StorageManager.checkDatabases(StorageManager.java:56)
    com.craftfire.odin.managers.StorageManager.<init>(StorageManager.java:34)
    com.craftfire.odin.managers.OdinManager.loadDatabases(OdinManager.java:206)
    com.craftfire.odin.managers.OdinManager.init(OdinManager.java:75)
    com.craftfire.odin.layer.bukkit.Odin.onEnable(Odin.java:63)
    org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:217)
    org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:374)
    org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:381)
    org.bukkit.craftbukkit.CraftServer.loadPlugin(CraftServer.java:266)
    org.bukkit.craftbukkit.CraftServer.enablePlugins(CraftServer.java:248)
    org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:200)
    net.minecraft.server.ServerConfigurationManagerAbstract.<init>(ServerConfigurationManagerAbstract.java:50)
    net.minecraft.server.ServerConfigurationManager.<init>(SourceFile:11)
    net.minecraft.server.DedicatedServer.init(DedicatedServer.java:105)
    net.minecraft.server.MinecraftServer.run(MinecraftServer.java:377)
    net.minecraft.server.ThreadServerApplication.run(SourceFile:539)
    ---------------------------- STACKTRACE END ----------------------------
    

    我的问题是,为什么驱动程序没有出现在DriverManager中。getDrivers()?

    注意:我不想将库添加到CLASSPATH,这就是为什么我需要找到我上面描述的问题的解决方案。

    我该如何解决这个问题?我只需要从jar加载H2 JDB驱动程序。

    我也尝试过这个:

    • 不要使用DriverManager。registerDriver(驱动程序),但使用类。forName(“org.h2.Driver”,true,getClassLoader())相反,我也尝试了。newInstance(),两者都不起作用

    有谁能为我提供一个解决方案吗?

    谢谢

  • 共有3个答案

    羊舌赞
    2023-03-14

    Hibernate属性将url值设置为:jdbc:h2:mem:test;DB\U CLOSE\U延迟=-1

    DriverClassName:

    <property name="driverClassName">
    <value>org.hibernate.dialect.H2Dialect</value>
    

    将H2驱动程序添加到pom:

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.3.166</version>
        </dependency>
    
    黄弘盛
    2023-03-14

    我也有同样的问题。h2驱动程序在pom中配置。xml与

    <dependency>
        <groupId>com.h2database</groupId>
        <artifactId>h2</artifactId>
        <version>1.4.193</version>
    </dependency>
    

    因为我在我的项目中使用的是Java 6(不要问为什么;-),而是h2-1.4.193。Maven存储库中的jar依赖于Java 7,无法使用此驱动程序版本。

    更改pom。xml使用h2-1.4.190。jar帮我解决了这个问题。

    另请参见h2database git项目中的第300期。

    方永贞
    2023-03-14

    根据Oracle文档:http://docs.oracle.com/cd/E19501-01/819-3659/beadf/index.html

    类加载器将类加载委托给子类加载器,在类路径上搜索类。但是,用于加载库的URLClassloader对系统或引导层次结构不可见,因此它找不到该类(尽管它正在加载,但在另一个castl…classloader中)。

    最简单的解决方案是用URLClassloader替换您的系统类加载器,并使用addUrl(... path...)加载您的库,正如这个答案所建议的:我应该如何在运行时动态加载Jars?

     类似资料:
    • 问题内容: 我正在尝试编写一个程序以在eclipse中连接到MySQL数据库,但出现错误 “ java.sql.SQLException:找不到合适的驱动程序” 。 Java代码是: } 控制台选项卡中的输出为: 我已经使用了MySQL Connector / J。将其解压缩到MySQL安装目录中,并将jar文件添加到CLASSPATH中。 另请参阅此图像。有一个 !在项目根目录上标记。image

    • java。sql。SQLException:找不到适合jdbc的驱动程序:h2:tcp://localhost/当我尝试使用java web应用程序连接到h2数据库时,抛出了~/ZadatakDB。 我可以使用H2控制台没有任何问题,ping是成功的。 我还将h2-1.3.176 jar文件添加到库和WEB-INF/lib中。 下面是我用来连接的Java方法: 我会错过什么? 我还将添加Stack

    • 我已经检查了这个问题的所有消息,但它是一样的,它不起作用。我必须用java连接到sql服务器2008数据库,我已经添加了sqljdbc4.jar但什么也没有。 我做的不好,如果你还需要什么,请告诉我。 我收到这条消息: Java语言sql。SQLException:未找到适合jdbc的驱动程序:sqlserver://xxx.xxx.xxx.xxx:1433;databaseName=ccis;用

    • 我使用的是用于MariaDB的连接器,但它不起作用。 下面是连接代码: 我得到: 除了将其作为外部jar添加到库之外,我还将其作为驱动程序添加到NetBeans(服务)中的数据库中。此外,如果我删除,它也不能正常工作。

    • 我需要将数据从SQLite文件加载到我在Netbeans中开发的java程序中。该文件将通过swing菜单项加载。我使用sqlitejdbc作为驱动程序。 以下是我认为重要的代码块: 运行程序并通过菜单加载文件时,我收到以下错误: 阅读了相应的stackexchange帖子后,我了解到此问题可能是由(1)文件URL格式错误或(2)驱动程序未加载引起的。以下是一些进一步的信息: 我添加了sqlite

    • 试图连接到允许远程连接的免费mysql数据库主机,但我遇到了以下错误: 未找到适合jdbc的驱动程序:mysql://xx2-23-x1-2x1-172.compuxe-1.xmazonaws.com:3306 我使用下面的代码。 编辑 Stack Trace显示在下面: