You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

WebSphere Liberty Profile配置MySQL数据源遇类找不到问题求助

解决WebSphere Liberty Profile中MySQL数据源驱动类找不到的问题

首先看你的错误堆栈,核心问题是Liberty找不到com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource这个类,而你在server.xml里配置的javax.sql.XADataSource="com.mysql.cj.jdbc.Driver"是错误的——com.mysql.cj.jdbc.Driver是JDBC驱动类,不是XADataSource的实现类,这就是问题的关键!

下面是针对性的解决方案:

1. 修正jdbcDriver的配置参数

你混淆了JDBC驱动类和数据源实现类的配置:

  • 如果要配置XA数据源,应该指定javax.sql.XADataSource为MySQL对应版本的XA实现类:
    • MySQL Connector/J 6.x+:com.mysql.cj.jdbc.MysqlXADataSource
    • MySQL Connector/J 5.x:com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
  • 如果不需要XA事务,也可以配置连接池数据源,用javax.sql.ConnectionPoolDataSource参数,对应类:
    • 6.x+:com.mysql.cj.jdbc.MysqlConnectionPoolDataSource
    • 5.x:com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

举个正确的配置示例(适配Connector/J 6.x):

<dataSource id="springdb" jndiName="jdbc/springdb">
  <jdbcDriver javax.sql.XADataSource="com.mysql.cj.jdbc.MysqlXADataSource" libraryRef="mysqlJDBCLib"/>
  <properties databaseName="spring_db" password="**********" portNumber="3306" serverName="localhost" user="root" serverTimezone="UTC"/>
</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>

2. 匹配Liberty版本与MySQL驱动版本

你用的是Liberty 16.0.0.4,这个版本比较老旧,MySQL Connector/J 6.x引入了很多新特性(比如时区强制配置、CJ包名前缀),可能和旧版Liberty存在兼容性问题。建议试试MySQL Connector/J 5.1.49这个稳定版本,它的类名还是com.mysql.jdbc前缀,更适配旧版Liberty:

配置示例(适配Connector/J 5.x):

<dataSource id="springdb" jndiName="jdbc/springdb">
  <jdbcDriver javax.sql.XADataSource="com.mysql.jdbc.jdbc2.optional.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-5.1.49.jar"/>
</library>

3. 验证驱动包的权限与路径

确保:

  • /opt/IBM/WebSphere/Liberty_16.0.0.4/usr/shared/resources/mysql目录下确实存在对应的jar包
  • Liberty进程拥有读取该目录和jar包的权限(可以用chownchmod调整权限)
  • 重启Liberty服务器,让配置和驱动包加载生效

4. 备选:使用basic驱动配置方式

如果上面的方式还是不行,也可以用更简单的driverClassName配置(不需要指定XA/ConnectionPoolDataSource):

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

之前你尝试的方案没解决,大概率是因为没搞清楚javax.sql.XADataSource参数需要的是数据源实现类,而不是驱动类,或者驱动版本和Liberty版本不匹配。按照上面的步骤调整,应该能解决问题。

内容的提问来源于stack exchange,提问作者Hopewell Mutanda

火山引擎 最新活动