Microprofile 的 Open Liberty 实现中的 MySql 连接

Posted

技术标签:

【中文标题】Microprofile 的 Open Liberty 实现中的 MySql 连接【英文标题】:MySql connection in Open Liberty implementation of Microprofile 【发布时间】:2021-10-13 14:33:27 【问题描述】:

我是 Microprofile 世界的新手,我正在尝试使用 Open Liberty 作为实现来创建微服务。当我尝试使用 mysql 连接到我的数据库时,这里的主要问题开始了,我找不到原因。 我的 server.xml 文件是下一个:

<library id="jdbcLib">
    <fileset dir="jdbc" includes="*.jar"/>
</library>

<dataSource jndiName="jdbc/myDB">
    <jdbcDriver libraryRef="jdbcLib"/>
    <properties serverName="localhost" portNumber="3306"
                databaseName="inventory"
                user="root"
                password="root"/>
</dataSource>

而我的 persistence.xml 文件是:

<persistence-unit name="jpa-unit" transaction-type="JTA">
    <jta-data-source>jdbc/myDB</jta-data-source>
    <properties>
        <property name="eclipselink.ddl-generation" value="create-tables"/>
        <property name="eclipselink.ddl-generation.output-mode" value="both" />
    </properties>
</persistence-unit>

我找不到我做错了什么,但我得到了以下异常:

java.sql.SQLNonTransientException: DSRA4000E: 没有为带有库的 dataSource[default-0] 找到 [javax.sql.ConnectionPoolDataSource, javax.sql.DataSource, javax.sql.XADataSource, java.sql.Driver] 的实现jdbcLib

有人可以帮我解决这个问题吗?我将不胜感激:D

【问题讨论】:

Open Liberty 没有预打包 JDBC 驱动程序二进制文件。从您的 server.xml 来看,您的 JDBC 驱动程序配置看起来不错,但您仍需要将其复制到磁盘上的适当位置。 @marks 的答案是使用 Maven 的好方法。 是的,斯科特,非常感谢你的回复,马克的回答对我很有用 很高兴听到这个消息。在这种情况下,您可以继续接受答案。很高兴能提供帮助。 【参考方案1】:

您似乎遵循了此处的示例:https://openliberty.io/docs/21.0.0.3/relational-database-connections-JDBC.html

根据异常,驱动 jar 似乎不在 jdbc 目录中(将是 wlp/usr/server/server_name/jdbc)您应该能够获取版本你需要这里:https://mvnrepository.com/artifact/mysql/mysql-connector-java

如果您使用的是 maven,则可以使用 Liberty Maven 插件为您下载驱动程序并将其复制到正确的目录。以下是使用最新 8.0.26 驱动程序的示例:

<plugin>
<groupId>io.openliberty.tools</groupId>
<artifactId>liberty-maven-plugin</artifactId>
<version>3.3</version>
  <configuration>
    <copyDependencies>
        <location>jdbc</location>
        <dependency> 
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <!-- You can omit the version below if you have 
                 declared a dependency and want to simply use 
                 that version, or specify the version as shown 
                 if you don't include this artifact as a dependency. -->
            <version>8.0.26</version> 
        </dependency>
    </copyDependencies>
  </configuration>
</plugin>

【讨论】:

答案很好,但它遵循了早期里程碑版本中使用的模式。我更新了答案以反映其最终发布格式的支持。 @ScottKurz 感谢您的更新,我试过了,它可以工作。我看到实际上昨天打开了一个问题来解决这个特定的例子:github.com/OpenLiberty/docs/issues/4517 啊,也谢谢你的指点。看起来我们正在修复其他文档。 非常感谢你们,这在我的项目中非常有用,我非常感激!

以上是关于Microprofile 的 Open Liberty 实现中的 MySql 连接的主要内容,如果未能解决你的问题,请参考以下文章

Liber 1. 《活着》:人生如逆旅,我亦是行人

MicroProfile 的配置:如何注入自定义对象列表

Quarkus & Microprofile:有没有更好的方法将 application.properties 中的属性用于@ClientHeaderParam?

如何将配置中的集合转换为 Microprofile/Quarkus/Smallrye 中的环境变量

Microprofile Config:容错度量标签的动态 ConfigSource 值

如何使用 java-ee8、microProfile 4.0、Openliberty 21 和 Docker 设置特定于阶段的微配置文件配置