为什么错误 No suitable driver found for jdbc:h2
Why error No suitable driver found for jdbc:h2
当我调试我的 Mule 应用程序时出现错误:
org.springframework.dao.DataAccessResourceFailureException: Error retrieving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver found for jdbc:h2:~/test
我的java代码:
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate.getDataSource()).withProcedureName("my_procedure_name").withSchemaName("my_schema");
...
call.execute(in)
我的应用程序上下文:
<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db2.driver}" />
<property name="url" value="${db2.url}" />
<property name="username" value="${db2.user}" />
<property name="password" value="${db2.password}" />
</bean>
我的app_name.properties:
db2.url=jdbc:h2:~/test
db2.driver=org.h2.Driver
db2.user=sa
db2.password=
我的 pom:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
我的类路径:
<classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.4.200/h2-1.4.200.jar"/>
运行 申请后的日志信息:
INFO org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: org.h2.Driver
我还把 h2-1.4.200.jar(当我从 AnypointStudio 启动我的应用程序时)放到:
c:\...\plugins\org.mule.tooling.server.3.9.0_6.4.0.201908221250\mule\lib\user\
and:
c:\...\plugins\org.mule.tooling.server.3.9.0_6.4.0.201908221250\mule\lib\boot\
and:
c:\...\plugins\org.mule.tooling.server.3.9.0_6.4.0.201908221250\mule\lib\mule\
当我从 mule 服务器 h2-1.4.200.jar 运行 申请时,我把:
..\mule-standalone-3.9.0\lib\boot
and
..\mule-standalone-3.9.0\lib\user
and:
..\mule-standalone-3.9.0\lib\mule
为什么找不到应用程序驱动程序 h2?有什么问题吗?
谢谢。
您混合了 3 种不同的方式来管理 JDBC 驱动程序依赖性,并且还在运行时复制库。这也使得理解问题和部署应用程序变得更加困难。
让我们从 Maven 开始。看起来你在 pom 中使用了正确的依赖项,只要它在部分中。
如果项目使用的是Maven,应该不需要研究,除非它与Maven不同步。您不应手动更改 class 路径,或在 Anypoint Studio 中编辑构建路径。这些是 Studio/Eclipse .classpath 文件的一部分,应该单独放置。请务必更新项目,以便 Studio 重新生成 class 路径。
关于 MULE_HOME\lib\boot、MULE_HOME\lib\user、MULE_HOME\lib\mule(无论是在 Studio 中还是在单机版中),您不应该将库放在那里。 Maven 依赖项就足够了,您正在复制版本。即使可以在 lib\user 共享一个库,也不推荐。这使得复制部署变得更加困难,而且不需要 JDBC 驱动程序。您根本不应该在 lib\boot 或 lib\mule 或 lib 的其他子目录中放置任何内容。这些是为运行时保留的。
先尝试删除所有这些额外内容,然后看看干净部署会发生什么。
更新:
清理库后,请考虑 Spring class 本身可能有一些 classloading issues。使用数据源池实现几乎总是更好。有几个可供选择,如 c3p0、dbcp 等。
一个c3p0的例子:
<spring:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<spring:property name="driverClass" value="${JDBC.driver}"/>
<spring:property name="jdbcUrl" value="${JDBC.URL}"/>
<spring:property name="user" value="${JDBC.user}"/>
<spring:property name="password" value="${JDBC.password}"/>
<spring:property name="minPoolSize" value="5"/>
<spring:property name="maxPoolSize" value="20"/>
</spring:bean>
有关更多示例,请参阅 https://help.mulesoft.com/s/article/Spring-based-datasources。
当我调试我的 Mule 应用程序时出现错误:
org.springframework.dao.DataAccessResourceFailureException: Error retrieving database metadata; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting meta data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: No suitable driver found for jdbc:h2:~/test
我的java代码:
SimpleJdbcCall call = new SimpleJdbcCall(jdbcTemplate.getDataSource()).withProcedureName("my_procedure_name").withSchemaName("my_schema");
...
call.execute(in)
我的应用程序上下文:
<bean id="dataSource2"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="${db2.driver}" />
<property name="url" value="${db2.url}" />
<property name="username" value="${db2.user}" />
<property name="password" value="${db2.password}" />
</bean>
我的app_name.properties:
db2.url=jdbc:h2:~/test
db2.driver=org.h2.Driver
db2.user=sa
db2.password=
我的 pom:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.200</version>
</dependency>
我的类路径:
<classpathentry kind="var" path="M2_REPO/com/h2database/h2/1.4.200/h2-1.4.200.jar"/>
运行 申请后的日志信息:
INFO org.springframework.jdbc.datasource.DriverManagerDataSource - Loaded JDBC driver: org.h2.Driver
我还把 h2-1.4.200.jar(当我从 AnypointStudio 启动我的应用程序时)放到:
c:\...\plugins\org.mule.tooling.server.3.9.0_6.4.0.201908221250\mule\lib\user\
and:
c:\...\plugins\org.mule.tooling.server.3.9.0_6.4.0.201908221250\mule\lib\boot\
and:
c:\...\plugins\org.mule.tooling.server.3.9.0_6.4.0.201908221250\mule\lib\mule\
当我从 mule 服务器 h2-1.4.200.jar 运行 申请时,我把:
..\mule-standalone-3.9.0\lib\boot
and
..\mule-standalone-3.9.0\lib\user
and:
..\mule-standalone-3.9.0\lib\mule
为什么找不到应用程序驱动程序 h2?有什么问题吗?
谢谢。
您混合了 3 种不同的方式来管理 JDBC 驱动程序依赖性,并且还在运行时复制库。这也使得理解问题和部署应用程序变得更加困难。
让我们从 Maven 开始。看起来你在 pom 中使用了正确的依赖项,只要它在部分中。
如果项目使用的是Maven,应该不需要研究,除非它与Maven不同步。您不应手动更改 class 路径,或在 Anypoint Studio 中编辑构建路径。这些是 Studio/Eclipse .classpath 文件的一部分,应该单独放置。请务必更新项目,以便 Studio 重新生成 class 路径。
关于 MULE_HOME\lib\boot、MULE_HOME\lib\user、MULE_HOME\lib\mule(无论是在 Studio 中还是在单机版中),您不应该将库放在那里。 Maven 依赖项就足够了,您正在复制版本。即使可以在 lib\user 共享一个库,也不推荐。这使得复制部署变得更加困难,而且不需要 JDBC 驱动程序。您根本不应该在 lib\boot 或 lib\mule 或 lib 的其他子目录中放置任何内容。这些是为运行时保留的。
先尝试删除所有这些额外内容,然后看看干净部署会发生什么。
更新:
清理库后,请考虑 Spring class 本身可能有一些 classloading issues。使用数据源池实现几乎总是更好。有几个可供选择,如 c3p0、dbcp 等。
一个c3p0的例子:
<spring:bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<spring:property name="driverClass" value="${JDBC.driver}"/>
<spring:property name="jdbcUrl" value="${JDBC.URL}"/>
<spring:property name="user" value="${JDBC.user}"/>
<spring:property name="password" value="${JDBC.password}"/>
<spring:property name="minPoolSize" value="5"/>
<spring:property name="maxPoolSize" value="20"/>
</spring:bean>
有关更多示例,请参阅 https://help.mulesoft.com/s/article/Spring-based-datasources。