我正在尝试单元测试(JUnit)我创建的DAO。我使用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$1.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
答案 0 :(得分:29)
为了让HSQLDB自身注册,您需要访问其jdbcDriver类。您可以采用与此example相同的方式执行此操作。
Class.forName("org.hsqldb.jdbcDriver");
它触发jdbcDriver类的静态初始化,即:
static {
try {
DriverManager.registerDriver(new jdbcDriver());
} catch (Exception e) {}
}
答案 1 :(得分:10)
“没有合适的驱动程序”通常意味着连接URL的语法不正确。
答案 2 :(得分:4)
好的,这是解决方案。大多数人都提出了非常好的观点,但没有人解决问题(感谢帮助)。这是我发现的解决方案。
我的猜测是它与Ganymede如何在/ web-inf / lib文件夹中读取jar有关。但谁知道......它现在有效。
答案 3 :(得分:3)
如果查看原始连接字符串:
<property name="url" value="jdbc:hsqldb:hsql://localhost"/>
Hypersonic文档表明你在localhost之后缺少一个别名:
答案 4 :(得分:2)
看起来你没有指定要连接的数据库名称,应该像
那样jdbc:hsqldb:hsql://serverName:port/DBname
答案 5 :(得分:2)
太棒了,我遇到了类似的问题。对所有人的建议是检查jdbc url sintax
答案 6 :(得分:1)
您可以将驱动程序(org.hsqldb.jdbcDriver)导入其中一个源文件吗? (要测试该类实际上是在您的类路径上)。
如果您无法导入,则可以尝试在构建路径中包含hsqldb.jar。
答案 7 :(得分:1)
我遇到了与spring,commons-dbcp和oracle 10g相同的问题。 使用此URL我得到了“不合适的驱动程序”错误: jdbc:oracle:thin@192.168.170.117:1521:kinangop
上面的网址在@之前缺少一个完整的冒号。纠正后,错误消失了。
答案 8 :(得分:1)
当尝试使用静态main方法运行数据源连接时,首先我们需要运行数据库连接。我们可以在eclipse中实现这一点。
1)默认情况下打开工作区后打开任何IDE(Eclipse或RAD)IDE将在JAVA预览中打开。尝试从java切换到数据库,以便创建数据源和虚拟数据库连接。
2)在数据库中预先输入特定模式的userName,Password和URL等所有细节。
3)然后尝试运行main方法来访问数据库。
这将解析“serverName undefined”。
答案 9 :(得分:1)
正如之前的一些回答,这行代码解决了问题
Class.forName("org.hsqldb.jdbcDriver");
但是我的应用程序在一些tomcats中运行,但只在一次安装中我必须添加此代码。
答案 10 :(得分:0)
可能是那个
HSQL://本地主机
无法解析为文件。请看这里的示例程序:
看看你是否可以先使用它,然后看看你是否可以获取该配置信息并在Spring bean配置中使用它。
祝你好运!答案 11 :(得分:0)
我认为您的HSQL网址错误。它还应包括数据库名称
类似
jdbc:hsqldb:hsql://localhost/mydatabase
如果mydatabase是您的数据库(文件)的名称。不包括这个(我不确定在这里是否是这种情况)混淆了URL的解析,这可能导致DriverManagerDS认为你的驱动程序不适合(它被发现,但它认为它不是一个好的一个)
答案 12 :(得分:0)
不确定它是否值得,但我有一个类似的问题,我得到一个“java.sql.SQLException:找不到合适的驱动程序”错误。我在研究解决方案时找到了这个帖子。
我最终解决问题的方法是放弃使用java.sql.DriverManager获取连接,而是构建org.hsqldb.jdbc.jdbcDataSource的实例并使用它。
我的问题的根本原因(我相信)与类加载器层次结构和JRE运行Java 5的事实有关。即使我可以成功加载jdbcDriver类,java.sql.DriverManager后面的类加载器也是更高,到了无法看到我需要的hsqldb.jar。
无论如何,只需将此注释放在此处以防万一其他人因类似问题而绊倒。
答案 13 :(得分:0)
我遇到了类似的问题,令我惊讶的是问题出现在Java的版本中。 java.sql.DriverManager来自rt.jar无法加载我的驱动程序“COM.ibm.db2.jdbc.app.DB2Driver”。
我从jdk 5和jdk 6升级而且它有效。
答案 14 :(得分:0)
在某些情况下,请检查权限(所有权)。