找不到合适的驱动程序的原因

我正在尝试unit testing(JUnit)我创建的DAO。 我使用Spring作为我的框架,我的DAO(JdbcPackageDAO)扩展了SimpleJdbcDaoSupport。 测试类(JdbcPackageDAOTest)扩展了AbstractTransactionalDataSourceSpringContextTests。 我已经覆盖了configLocations,如下所示:

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

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

              company/data/dao/jdbc.properties        

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

 org.springframework.transaction.CannotCreateTransactionException:无法打开事务的JDBC连接; 嵌套exception是java.sql.SQLException:没有为jdbc找到合适的驱动程序:hsqldb:hsql:// localhost
    在org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219)
     at 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
     at java.sql.DriverManager.getConnection(Unknown Source)
     at java.sql.DriverManager.getConnection(Unknown Source)
    在org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291)
     at 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个

为了让HSQLDB自身注册,您需要访问其jdbcDriver类。 您可以使用与此示例相同的方式执行此操作。

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

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

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

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

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

  1. 将jar从… / web-inf / lib移动到PROJECT_ROOT / lib
  2. 在eclipse中更改构建路径以反映此更改。
  3. 清理并重建我的项目。
  4. 跑了junit测试和BOOM它工作!

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

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

  

Hypersonic文档表明你在localhost之后缺少一个别名:

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

看起来你没有指定要连接的数据库名称,应该是这样的

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

我有类似的问题。 对所有人的建议是检查jdbc url sintax

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

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

我遇到了与spring,commons-dbcp和oracle 10g相同的问题。 使用此URL我得到’不合适的驱动程序’错误: jdbc:oracle:thin@192.168.170.117:1521:kinangop

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

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

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

2)在数据库预期中输入特定模式的userName,Password和URL等所有细节。

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

这将解析“serverName undefined”。

正如之前的一些回答,这行代码解决了这个问题

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

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

可能就是这样

HSQL://本地主机

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

示例HSQLDB程序

看看你是否可以首先使用它,然后看看你是否可以获取该配置信息并在Spring bean配置中使用它。

祝你好运!

我认为你的HSQLurl是错误的。 它还应包括数据库名称,

所以像

 jdbc:hsqldb:hsql://localhost/mydatabase 

如果mydatabase是您的数据库(文件)的名称。 不包括这个(我不确定这是不是这种情况)混淆了URL的解析,这可能导致DriverManagerDS认为你的驱动程序不合适(它被发现,但它认为它不是一个好的一)

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

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

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

无论如何,只要把这个注释放在这里,以防其他人因类似的问题而绊倒。

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

我从jdk 5和jdk 6升级了它的工作原理。

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