找不到适合的驱动程序的原因
我正在尝试对我创建的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: Could not open JDBC Connection for transaction; nested exception is java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:219) at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377) at org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387) at org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217) at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:101) at junit.framework.TestCase.runBare(TestCase.java:128) at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76) at junit.framework.TestResult.protect(TestResult.java:106) at junit.framework.TestResult.runProtected(TestResult.java:124) at junit.framework.TestResult.run(TestResult.java:109) at junit.framework.TestCase.run(TestCase.java:120) at junit.framework.TestSuite.runTest(TestSuite.java:230) at junit.framework.TestSuite.run(TestSuite.java:225) at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) Caused by: java.sql.SQLException: No suitable driver found for jdbc:hsqldb:hsql://localhost at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:291) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:277) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnectionFromDriverManager(DriverManagerDataSource.java:259) at org.springframework.jdbc.datasource.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:241) at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:182) ... 18 more
解决方案
好像我们没有指定要连接的数据库名称,应该是这样
jdbc:hsqldb:hsql://serverName:port/DBname
我们可以将驱动程序(org.hsqldb.jdbcDriver)导入到一个源文件中吗? (测试该类实际上在类路径上)。
如果无法导入,则可以尝试在构建路径中包括hsqldb.jar。
可能是
hsql://localhost
无法解析为文件。在这里查看示例程序:
示例HSQLDB程序
查看是否可以首先使该工作正常运行,然后查看是否可以获取该配置信息并在Spring bean配置中使用它。
祝你好运!
我认为HSQL URL错误。它还应包括数据库名称,
所以像
jdbc:hsqldb:hsql://localhost/mydatabase
如果mydatabase是数据库(文件)的名称。不包括它(我不确定是否是这种情况)会混淆URL的解析,这可能导致DriverManagerDS认为驱动程序不合适(找到了,但认为它不是一个好方法)。一)
好的,这就是解决方案。大多数人都提出了很好的观点,但没有一个人解决了问题(感谢帮助)。这是我发现可以使用的解决方案。
- 将jars从... / web-inf / lib移到PROJECT_ROOT / lib
- 在Eclipse中更改构建路径以反映此更改。
- 清理并重建我的项目。
- 进行了junit测试,BOOM奏效了!
我的猜测是,它与Ganymede如何读取/ web-inf / lib文件夹中的jar有关。但是谁知道...它现在可以工作了。
不知道它是否值得,但是在遇到" java.sql.SQLException:找不到合适的驱动程序"错误时,我遇到了类似的问题。我在研究解决方案时发现了这个线程。
我最终解决问题的方法是放弃使用java.sql.DriverManager来获得连接,而是建立了org.hsqldb.jdbc.jdbcDataSource的实例并使用了该实例。
我的问题的根本原因(我认为)与类加载器层次结构和JRE运行Java 5有关。尽管我可以成功加载jdbcDriver类,但java.sql.DriverManager后面的类加载器更高,到无法看到我需要的hsqldb.jar的地步。
无论如何,只要把这个便条放在这里,以防其他人因类似的问题而迷路。
"没有合适的驱动程序"通常意味着连接URL的语法不正确。
如果我们查看原始的连接字符串:
<property name="url" value="jdbc:hsqldb:hsql://localhost"/>
Hypersonic文档建议我们在localhost后缺少别名:
http://hsqldb.org/doc/guide/ch04.html
我在spring,commons-dbcp和oracle 10g中遇到了相同的问题。
使用此URL,我收到"没有合适的驱动程序"错误:jdbc:oracle:[email protected]:1521:kinangop
上面的网址在@之前缺少完整的冒号。更正该错误后,该错误消失了。
为了让HSQLDB注册自己,我们需要访问其jdbcDriver类。我们可以与本示例相同的方式执行此操作。
Class.forName("org.hsqldb.jdbcDriver");
它触发jdbcDriver类的静态初始化,该类为:
static { try { DriverManager.registerDriver(new jdbcDriver()); } catch (Exception e) {} }
太好了,我遇到了类似的问题。对所有人的建议是检查jdbc url sintax