gpt4 book ai didi

java - 使用 IBM WebSphere Application Server Liberty Profile 配置 Mysql 数据源

转载 作者:可可西里 更新时间:2023-11-01 07:48:01 29 4
gpt4 key购买 nike

我有一个部署在 IBM WebSphere Application Server Liberty Profile 上的 spring mvc 应用程序,该应用程序应该访问本地托管的 mysql 数据库服务器。我在sever.xml文件中添加了如下数据源配置

 <dataSource id="springdb" jndiName="jdbc/springdb">
<jdbcDriver javax.sql.XADataSource="com.mysql.cj.jdbc.Driver" libraryRef="mysqlJDBCLib"/>
<properties databaseName="spring_db" password="**********" portNumber="3306" serverName="localhost" user="root"/>
</dataSource>

<library id="mysqlJDBCLib">
<fileset dir="/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql" includes="mysql-connector-java-6.0.6.jar"/>
</library>

我得到以下堆栈跟踪

Caused by: java.lang.RuntimeException: java.sql.SQLNonTransientException: DSRA4000E: A valid JDBC driver implementation class was not found for the jdbcDriver dataSource[springdb]/jdbcDriver[default-0] using the library mysqlJDBCLib. [/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql/mysql-connector-java-6.0.6.jar]
at com.ibm.ws.resource.internal.ResourceFactoryTrackerData$1.getService(ResourceFactoryTrackerData.java:123)
... 77 more
Caused by: java.sql.SQLNonTransientException: DSRA4000E: A valid JDBC driver implementation class was not found for the jdbcDriver dataSource[springdb]/jdbcDriver[default-0] using the library mysqlJDBCLib. [/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql/mysql-connector-java-6.0.6.jar]
at com.ibm.ws.jdbc.internal.JDBCDriverService.classNotFound(JDBCDriverService.java:196)
... 77 more
Caused by: java.lang.ClassNotFoundException: com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
at com.ibm.ws.classloading.internal.AppClassLoader.findClassCommonLibraryClassLoaders(AppClassLoader.java:499)
... 77 more

我试过以下方法

  1. 用com.mysql.jdbc.Driver和string替换com.mysql.cj.jdbc.Driver得到同样的错误

  2. 用 javax.sql.DataSource 替换 javax.sql.XADataSource 还是报错

  3. 用 javax.sql.MysqlConnectionPoolDataSource 替换 javax.sql.XADataSource,同样的错误

  4. 将 mysql 连接器 jar 从 mysql-connector-java-6.0.6.jar 切换到 mysql-connector-java-5.1.45-bin.jar,仍然是同样的错误(两个 jar 都在指定文件路径)

最佳答案

关于数据源配置的背景信息:

对于所有数据源(id="DefaultDataSource" 除外),按以下优先级选择数据源类型:

  1. 使用type<dataSource> 上配置的类元素,如果已配置
  2. javax.sql.ConnectionPoolDataSource 此选项在您的案例中有效
  3. javax.sql.DataSource
  4. javax.sql.XADataSource

(根据Configuring relational database connectivity in Liberty)

如果没有为类型定义类,则将检查下一个最低优先级。

默认情况下,Liberty 将扫描使用以下优先级来定位数据源实现类名:

  1. 使用<jdbcDriver>上配置的相应值元素
  2. 使用默认类 <properties.DRIVER_TYPE>元素。请注意,只有一些 JDBC 驱动程序有自己的元素类型。对于没有自己的属性元素的 JDBC 驱动程序(例如 MySQL),使用通用的 <properties>元素
  3. 基于 JDBC 驱动程序 jar 名称,Liberty 将尝试猜测实现类名称。 此选项在您的案例中有效

您的配置不起作用的原因
您已经配置了 <jdbcDriver>元素说“将此特定类用于 XADataSource 的”,但是,<dataSource>您配置的元素未尝试创建 XADataSource .使用上面提到的优先顺序,它将首先尝试创建一个 ConnectionPoolDataSource (Liberty 已在内部映射到 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

解决问题:

  1. 指定 <dataSource .. type="javax.sql.XADataSource">在您的配置中,以便 Liberty 将尝试创建一个 XADataSource而不是 ConnectionPoolDataSource .然后当它尝试创建 XADataSource 时它将查看您在 <jdbcDriver> 上配置的类名元素。
  2. javax.sql.XADataSource 指定 MySQL 的 XADataSource 类名属性(即 com.mysql.cj.jdbc.MysqlXADataSource )而不是它们的 java.sql.Driver 实现类名。

所以你的最终配置应该是这样的:

<dataSource id="springdb" jndiName="jdbc/springdb" type="javax.sql.XADataSource">
<jdbcDriver javax.sql.XADataSource="com.mysql.cj.jdbc.MysqlXADataSource" libraryRef="mysqlJDBCLib"/>
<properties databaseName="spring_db" password="**********" portNumber="3306" serverName="localhost" user="root"/>
</dataSource>

<library id="mysqlJDBCLib">
<fileset dir="/opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql" includes="mysql-connector-java-6.0.6.jar"/>
</library>

关于java - 使用 IBM WebSphere Application Server Liberty Profile 配置 Mysql 数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48484113/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com