【问题标题】:Configuring Mysql DataSource with IBM WebSphere Application Server Liberty Profile使用 IBM WebSphere Application Server Liberty Profile 配置 Mysql 数据源
【发布时间】:2018-07-07 03:16:24
【问题描述】:

我在 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 和字符串替换 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 都在指定文件路径)

【问题讨论】:

  • 我建议您只保留其中一个库,因为同时拥有它们可能会导致类路径出现问题。确保通过 ClassNotFoundException 指向的类确实在 jar 中(您甚至可以解压缩 jar 并检查)。你试过javax.sql.DataSource="com.mysql.jdbc.Driver"的组合吗?
  • 是的,我删除了其中一个罐子并使用了 javax.sql.DataSource="com.mysql.jdbc.Driver"。我还解压缩了 jar 并确保驱动程序类在那里
  • 当你使用com.mysql.jdbc.Driver时,它是否还在寻找com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource
  • 是的,它仍在寻找 com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource

标签: java mysql spring jdbc websphere


【解决方案1】:

如果您未在 dataSource 配置元素中指定 type 属性,Liberty 将尝试根据驱动程序 jar 文件名推断要加载的数据源类。在您的示例中,它错误地根据以前的 mySQL 驱动程序推断实现类名称。似乎 mySQL 已更改其 DataSource、ConnectionPoolDataSource 和 XADataSource 实现的包名称。我会为此打开一个 git 问题。同时,您可以使用dataSource 配置元素的type 属性简单地指定要创建的数据源的类型,然后使用javax.sql.DataSource="com.mysql.cj.jdbc.MysqlDataSource" 更新您的jdbcDriver 配置元素以指向正确的mysql 驱动程序类。如果您需要连接池或 XA 数据源,只需更新 dataSourcetype 属性以识别类型并使用驱动程序类 impl 更新 jdbcDriver

【讨论】:

  • 我已经意识到,如果我在我的配置中指定&lt;dataSource .. type="javax.sql.XADataSource"&gt; ,Liberty 将尝试创建一个 XADataSource 而不是 ConnectionPoolDataSource。我什至不需要更改文件名。感谢您提供正确的班级名称。
【解决方案2】:

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

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

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

(根据Configuring relational database connectivity in Liberty

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

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

  1. 使用&lt;jdbcDriver&gt;元素上配置的对应值
  2. 使用&lt;properties.DRIVER_TYPE&gt; 元素的默认类。请注意,只有一些 JDBC 驱动程序有自己的元素类型。对于没有自己的 properties 元素的 JDBC 驱动程序(例如 MySQL),请使用通用 &lt;properties&gt; 元素
  3. Liberty 将根据 JDBC 驱动程序 jar 名称尝试猜测实现类名称。 此选项在您的情况下有效

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

解决问题:

  1. 在您的配置中指定&lt;dataSource .. type="javax.sql.XADataSource"&gt;,以便Liberty 将尝试创建XADataSource 而不是ConnectionPoolDataSource。然后,当它尝试创建 XADataSource 时,它会查看您在 &lt;jdbcDriver&gt; 元素上配置的类名。
  2. javax.sql.XADataSource 属性(即com.mysql.cj.jdbc.MysqlXADataSource)指定MySQL 的XADataSource 类名,而不是它们的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>

【讨论】:

    猜你喜欢
    • 2015-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多