使用 IBM WebSphere Application Server Liberty Profile 配置 Mysql DataSource
Configuring Mysql DataSource with IBM WebSphere Application Server Liberty Profile
我有一个 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>
我得到以下堆栈跟踪
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.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
我试过以下方法
用 com.mysql.jdbc.Driver 替换 com.mysql.cj.jdbc.Driver 和字符串得到相同的错误
用javax.sql.DataSource替换javax.sql.XADataSource,仍然出现同样的错误
用[=43=替换javax.sql.XADataSource,同样的错误
将 mysql 连接器罐从 mysql-连接器-java-6.0.6.jar 切换到 mysql-连接器-java-5.1.45-bin.jar,仍然是同样的错误(两个 jar 都在指定的文件路径中)
如果您未在 dataSource
配置元素中指定 type
属性,Liberty 将尝试根据驱动程序 jar 文件名推断要加载的数据源 class。在您的示例中,它根据先前的 mySQL 驱动程序错误地推断出实现 class 名称。 mySQL 似乎更改了 DataSource、ConnectionPoolDataSource 和 XADataSource 的实现包名称。我将为此打开一个 git 问题。同时,您可以使用 dataSource
配置元素的 type
属性简单地指定要创建的数据源类型,然后使用 javax.sql.DataSource="com.mysql.cj.jdbc.MysqlDataSource"
更新您的 jdbcDriver
配置元素以指向到正确的 mysql 驱动程序 class。相反,如果您需要连接池或 XA 数据源,只需更新 dataSource
的 type
属性以识别类型并使用驱动程序 class 实现更新 jdbcDriver
。
关于数据源配置的背景信息:
对于所有数据源(id="DefaultDataSource"
除外),按以下优先级选择数据源类型:
- 使用在
<dataSource>
元素上配置的 type
class,如果配置
- javax.sql.ConnectionPoolDataSource 这个选项在你的情况下有效
- javax.sql.DataSource
- javax.sql.XADataSource
(根据Configuring relational database connectivity in Liberty)
如果没有为类型定义 class,则将检查下一个最低优先级。
默认情况下,Liberty 将扫描使用以下优先级来定位数据源实现 class 名称:
- 使用
<jdbcDriver>
元素上配置的相应值
- 对
<properties.DRIVER_TYPE>
元素使用默认的 classes。请注意,只有一些 JDBC 驱动程序有自己的元素类型。对于 JDBC 没有自己的属性元素(例如 MySQL)的驱动程序,使用通用的 <properties>
元素
- 基于 JDBC 驱动程序 jar 名称,Liberty 将尝试猜测实现 class 名称。 此选项在您的案例中有效
您的配置不起作用的原因
您已将 <jdbcDriver>
元素配置为 "Use this specific class for XADataSource's",但是,您配置的 <dataSource>
元素并未尝试创建 XADataSource
。使用上面提到的优先级顺序,它将首先尝试创建一个 ConnectionPoolDataSource
(Liberty 已在内部映射到 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
.
解决问题:
- 在您的配置中指定
<dataSource .. type="javax.sql.XADataSource">
,这样 Liberty 将尝试创建 XADataSource
而不是 ConnectionPoolDataSource
。然后,当它尝试创建 XADataSource
时,它将查看您在 <jdbcDriver>
元素上配置的 class 名称。
- 为
javax.sql.XADataSource
属性(即 com.mysql.cj.jdbc.MysqlXADataSource
)指定 MySQL 的 XADataSource class 名称,而不是它们的 java.sql.Driver 实现class 姓名。
因此您的最终配置如下所示:
<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>
我有一个 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>
我得到以下堆栈跟踪
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.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
我试过以下方法
用 com.mysql.jdbc.Driver 替换 com.mysql.cj.jdbc.Driver 和字符串得到相同的错误
用javax.sql.DataSource替换javax.sql.XADataSource,仍然出现同样的错误
用[=43=替换javax.sql.XADataSource,同样的错误
将 mysql 连接器罐从 mysql-连接器-java-6.0.6.jar 切换到 mysql-连接器-java-5.1.45-bin.jar,仍然是同样的错误(两个 jar 都在指定的文件路径中)
如果您未在 dataSource
配置元素中指定 type
属性,Liberty 将尝试根据驱动程序 jar 文件名推断要加载的数据源 class。在您的示例中,它根据先前的 mySQL 驱动程序错误地推断出实现 class 名称。 mySQL 似乎更改了 DataSource、ConnectionPoolDataSource 和 XADataSource 的实现包名称。我将为此打开一个 git 问题。同时,您可以使用 dataSource
配置元素的 type
属性简单地指定要创建的数据源类型,然后使用 javax.sql.DataSource="com.mysql.cj.jdbc.MysqlDataSource"
更新您的 jdbcDriver
配置元素以指向到正确的 mysql 驱动程序 class。相反,如果您需要连接池或 XA 数据源,只需更新 dataSource
的 type
属性以识别类型并使用驱动程序 class 实现更新 jdbcDriver
。
关于数据源配置的背景信息:
对于所有数据源(id="DefaultDataSource"
除外),按以下优先级选择数据源类型:
- 使用在
<dataSource>
元素上配置的type
class,如果配置 - javax.sql.ConnectionPoolDataSource 这个选项在你的情况下有效
- javax.sql.DataSource
- javax.sql.XADataSource
(根据Configuring relational database connectivity in Liberty)
如果没有为类型定义 class,则将检查下一个最低优先级。
默认情况下,Liberty 将扫描使用以下优先级来定位数据源实现 class 名称:
- 使用
<jdbcDriver>
元素上配置的相应值 - 对
<properties.DRIVER_TYPE>
元素使用默认的 classes。请注意,只有一些 JDBC 驱动程序有自己的元素类型。对于 JDBC 没有自己的属性元素(例如 MySQL)的驱动程序,使用通用的<properties>
元素 - 基于 JDBC 驱动程序 jar 名称,Liberty 将尝试猜测实现 class 名称。 此选项在您的案例中有效
您的配置不起作用的原因
您已将 <jdbcDriver>
元素配置为 "Use this specific class for XADataSource's",但是,您配置的 <dataSource>
元素并未尝试创建 XADataSource
。使用上面提到的优先级顺序,它将首先尝试创建一个 ConnectionPoolDataSource
(Liberty 已在内部映射到 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
.
解决问题:
- 在您的配置中指定
<dataSource .. type="javax.sql.XADataSource">
,这样 Liberty 将尝试创建XADataSource
而不是ConnectionPoolDataSource
。然后,当它尝试创建XADataSource
时,它将查看您在<jdbcDriver>
元素上配置的 class 名称。 - 为
javax.sql.XADataSource
属性(即com.mysql.cj.jdbc.MysqlXADataSource
)指定 MySQL 的 XADataSource class 名称,而不是它们的 java.sql.Driver 实现class 姓名。
因此您的最终配置如下所示:
<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>