使用IBM WebSphere Application Server Liberty概要文件配置Mysql数据源

Hop*_*nda 3 java mysql websphere spring jdbc

我有一个Spring MVC应用程序,该应用程序将部署在IBM WebSphere Application Server Liberty Profile上,该应用程序应该访问本地托管的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>
Run Code Online (Sandbox Code Playgroud)

我正在获得以下堆栈跟踪

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
Run Code Online (Sandbox Code Playgroud)

我尝试了以下

  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都位于指定的文件路径中)

And*_*ert 7

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

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

  1. 使用在元素type上配置的类<dataSource>(如果已配置)
  2. javax.sql.ConnectionPoolDataSource 此选项在您的情况下处于活动状态
  3. javax.sql.DataSource
  4. javax.sql.XADataSource

(根据在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>
Run Code Online (Sandbox Code Playgroud)