【问题标题】:Cause of No suitable driver found for找不到合适的驱动程序的原因
【发布时间】:2010-09-14 16:58:44
【问题描述】:

我正在尝试对我创建的 DAO 进行单元测试 (JUnit)。我使用 Spring 作为我的框架,我的 DAO (JdbcPackageDAO) 扩展了 SimpleJdbcDaoSupport。测试类 (JdbcPackageDAOTest) 扩展了 AbstractTransactionalDataSourceSpringContextTests。我已经按如下方式覆盖了 configLocations:

protected String[] getConfigLocations(){
    return new String[] {"classpath:company/dc/test-context.xml"};
}

我的 test-context.xml 文件定义如下:

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="dataPackageDao" class="company.data.dao.JdbcPackageDAO">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
        <property name="url" value="jdbc:hsqldb:hsql://localhost"/>
        <property name="username" value="sa" />
        <property name="password" value="" />
    </bean>

    <bean id="propertyConfigurer" 
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>company/data/dao/jdbc.properties</value>
            </list>
        </property>
    </bean>

    <bean id="transactionManager" 
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>
</beans>

我使用 HSQL 作为我的后端,它以独立模式运行。我选择的 IDE 是 eclipse。当我将课程作为 JUnit 测试运行时,这是我的错误(如下)。我不知道它为什么会发生。根据 Eclipse,hsql.jar 在我的构建路径上。

org.springframework.transaction.CannotCreateTransactionException:无法为事务打开 JDBC 连接;嵌套异常是 java.sql.SQLException:没有为 jdbc:hsqldb:hsql://localhost 找到合适的驱动程序 在 org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) 在 org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) 在 org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) 在 org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) 在 junit.framework.TestCase.runBare(TestCase.java:128) 在 org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) 在 junit.framework.TestResult$1.protect(TestResult.java:106) 在 junit.framework.TestResult.runProtected(TestResult.java:124) 在 junit.framework.TestResult.run(TestResult.java:109) 在 junit.framework.TestCase.run(TestCase.java:120) 在 junit.framework.TestSuite.runTest(TestSuite.java:230) 在 junit.framework.TestSuite.run(TestSuite.java:225) 在 org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 原因:java.sql.SQLException:没有为 jdbc:hsqldb:hsql://localhost 找到合适的驱动程序 在 java.sql.DriverManager.getConnection(未知来源) 在 java.sql.DriverManager.getConnection(未知来源) 在 org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) 在 org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) 在 org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) 在 org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) 在 org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) ... 18 更多

【问题讨论】:

    标签: java eclipse spring junit hsqldb


    【解决方案1】:

    您似乎没有指定要连接的数据库名称,应该类似于

    jdbc:hsqldb:hsql://serverName:port/DBname
    

    【讨论】:

      【解决方案2】:

      您可以将驱动程序 (org.hsqldb.jdbcDriver) 导入您的源文件之一吗? (测试该类实际上是否在您的类路径上)。

      如果您无法导入它,那么您可以尝试在构建路径中包含 hsqldb.jar

      【讨论】:

      • 我可以导入 jdbcDriver;这意味着 hsqldb 在我的构建路径上。
      【解决方案3】:

      可能是这样的

      hsql://localhost

      无法解析为文件。看这里的示例程序:

      Sample HSQLDB program

      看看你能不能先让它工作,然后看看你是否可以获取配置信息并在 Spring bean 配置中使用它。

      祝你好运!

      【讨论】:

        【解决方案4】:

        我认为您的 HSQL URL 是错误的。它还应该包括数据库名称,

        类似

        jdbc:hsqldb:hsql://localhost/mydatabase 
        

        如果 mydatabase 是您的数据库(文件)的名称。不包括这个会(我不确定这里是不是这样)混淆URL的解析,这可能导致DriverManagerDS认为你的驱动不合适(找到了,但是觉得不好一)

        【讨论】:

          【解决方案5】:

          好的,这就是解决方案。大多数人都提出了非常好的观点,但没有人解决问题(感谢您的帮助)。这是我发现可行的解决方案。

          1. 将 jar 从 .../web-inf/lib 移动到 PROJECT_ROOT/lib
          2. 在 Eclipse 中更改构建路径以反映此更改。
          3. 清理并重建了我的项目。
          4. 运行了 junit 测试并且 BOOM 成功了!

          我的猜测是它与 Ganymede 如何读取 /web-inf/lib 文件夹中的 jars 的方式有关。但谁知道......它现在有效。

          【讨论】:

            【解决方案6】:

            不确定它是否值得,但我遇到了类似的问题,我收到“java.sql.SQLException:未找到合适的驱动程序”错误。我在研究解决方案时发现了这个线程。

            我最终解决问题的方法是放弃使用 java.sql.DriverManager 来获取连接,而是建立一个 org.hsqldb.jdbc.jdbcDataSource 实例并使用它。

            我的问题的根本原因(我相信)与类加载器层次结构和 JRE 正在运行 Java 5 的事实有关。即使我可以成功加载 jdbcDriver 类,java.sql.DriverManager 后面的类加载器是更高,以至于它看不到我需要的 hsqldb.jar。

            不管怎样,只要把这个注释放在这里,以防其他人偶然遇到类似的问题。

            【讨论】:

              【解决方案7】:

              “没有合适的驱动程序”通常表示连接 URL 的语法不正确。

              【讨论】:

                【解决方案8】:

                如果您查看原始连接字符串:

                <property name="url" value="jdbc:hsqldb:hsql://localhost"/>
                

                Hypersonic 文档建议您在 localhost 之后缺少别名:

                http://hsqldb.org/doc/guide/ch04.html

                【讨论】:

                • 这为我解决了问题。连接属性有问题。
                【解决方案9】:

                我在使用 spring、commons-dbcp 和 oracle 10g 时遇到了同样的问题。 使用此 URL 我得到了“没有合适的驱动程序”错误:jdbc:oracle:thin@192.168.170.117:1521:kinangop

                上面的 URL 在 @ 之前缺少一个完整的冒号。改正后,错误消失了。

                【讨论】:

                • 我还发现 org.springframework.jdbc.datasource.DriverManagerDataSource 在相同条件下给出了更多信息错误。
                【解决方案10】:

                为了让 HSQLDB 自己注册,你需要访问它的 jdbcDriver 类。您可以按照example 中的相同方式执行此操作。

                Class.forName("org.hsqldb.jdbcDriver");
                

                触发jdbcDriver类的静态初始化,即:

                static {
                    try {
                        DriverManager.registerDriver(new jdbcDriver());
                    } catch (Exception e) {}
                }
                

                【讨论】:

                • 我看到了,但我遇到了类似的问题,解决方案如上所示。所以我想为什么不与我的溢出者分享它;)
                • 作为注释,使用 jdbc4 它应该“自动注册”驱动程序,因此您不再需要任何 Class.forName 或 registerDriver 调用,FWIW
                【解决方案11】:

                太好了,我遇到了类似的问题。对所有人的建议是检查 jdbc url sintax

                【讨论】:

                  【解决方案12】:

                  当尝试使用静态 main 方法运行数据源连接时,首先我们需要运行数据库连接。我们可以在eclipse中实现如下。

                  1) 打开工作区后打开任何 IDE(Eclipse 或 RAD),默认情况下 IDE 将在 JAVA 预期中打开。尝试从 java 切换到数据库,以便创建数据源以及虚拟数据库连接。

                  2) 在数据库中输入所有详细信息,例如特定模式的用户名、密码和 URL。

                  3)然后尝试运行main方法访问数据库。

                  这将解决“未定义的服务器名称”。

                  【讨论】:

                    【解决方案13】:

                    正如之前有人回答的,这行代码解决了问题

                    Class.forName("org.hsqldb.jdbcDriver");
                    

                    但我的应用程序在一些 tomcats 中运行,但只有在一次安装中我必须添加此代码。

                    【讨论】:

                      【解决方案14】:

                      我遇到了类似的问题,令我惊讶的是问题出在 Java 版本中。 java.sql.DriverManager 来自 rt.jar 无法加载我的驱动程序“COM.ibm.db2.jdbc.app.DB2Driver”。

                      我从 jdk 5 和 jdk 6 升级,它工作正常。

                      【讨论】:

                      • DB2 和 HSQLDB 有什么关系?
                      【解决方案15】:

                      在某些情况下检查权限(所有权)。

                      【讨论】:

                        猜你喜欢
                        • 2019-01-09
                        • 2012-12-09
                        • 2016-04-02
                        • 2019-03-08
                        • 2013-03-16
                        • 2013-07-04
                        • 2017-05-12
                        • 2020-12-13
                        相关资源
                        最近更新 更多