为什么错误 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