【问题标题】:DBException when attempting to connect JavaEE app to database server尝试将 JavaEE 应用程序连接到数据库服务器时出现 DBException
【发布时间】:2021-02-13 14:11:35
【问题描述】:

我搜索了类似的主题。这种问题有很多情况,但没有一个完全是我的,也没有一个提供帮助。我现在完全被困住了,所以我非常感谢你的帮助。情况如下:

我正在尝试构建一个非常简单的应用程序,目前只是尝试将所有内容连接在一起。我的配置文件如下: pom.xml(包含便于部署的配置文件):

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>hello</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>8.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.23</version>
        </dependency>

        <dependency>
            <groupId>fish.payara.extras</groupId>
            <artifactId>payara-embedded-all</artifactId>
            <version>5.182</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
    <build>
        <finalName>hello</finalName>
    </build>

    <profiles>
        <profile>
            <id>payara</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <plugins>
                    <plugin>
                        <groupId>fish.payara.maven.plugins</groupId>
                        <artifactId>payara-micro-maven-plugin</artifactId>
                        <version>1.0.1</version>
                        <executions>
                            <execution>
                                <phase>package</phase>
                                <goals>
                                    <goal>bundle</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <useUberJar>true</useUberJar>
                            <deployWar>true</deployWar>
                            <payaraVersion>5.182</payaraVersion>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <failOnMissingWebXml>false</failOnMissingWebXml>
    </properties>
</project>

我的 web.xml(在 webapp/WEB-INF 下):

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <data-source>
        <name>java:global/hello</name>
        <class-name>com.mysql.jdbc.Driver</class-name>
        <url>jdbc:mysql://localhost:3306/connectiondatabase</url>
        <user>root</user>
        <password>mypass</password>
    </data-source>
</web-app>

该数据库运行正常,并且可以从通用数据库客户端(dbeaver)完美访问。

最后,我的 persistence.xml(在资源/META-INF 下):

<?xml version="1.0" encoding="UTF-8"?>

<persistence xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence    http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" version="2.1">

    <persistence-unit name="hello" transaction-type="JTA">
        <jta-data-source>java:global/hello</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
        </properties>
    </persistence-unit>

</persistence>

我有一个简单的 ping 资源和 JAXRS 配置类,这是我用来创建项目 (airhacks) 的默认架构类型和一个更简单的实体,如下所示:

package com.airhacks.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

@Entity
@Table(name = "players")
@NamedQuery(name = Player.FIND_PLAYER_BY_NAME, query = "select player from Player player where player.name =:" + Player.PLAYER_PARAMETER)
public class Player {
  public static final String PLAYER_PARAMETER = "Player.name";
  public static final String FIND_PLAYER_BY_NAME = "Player.findByName";

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Long id;

  private String name;

  private Integer age;

  public Long getId() {
    return id;
  }

  public void setId(Long id) {
    this.id = id;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public Integer getAge() {
    return age;
  }

  public void setAge(Integer age) {
    this.age = age;
  }
}

此时,我可以毫无错误地部署应用程序(mvn clean package payara-micro:start),尽管在检查数据库时,没有创建表(我认为持久性单元会同时处理这两个问题) exclude-unlisted-classes' 和 'drop-and-create',但显然还需要其他东西)。

之后,出于测试目的,我添加了一个 queryService 类,因此我可以实际使用我的数据源。 我正在添加以下课程:

package com.airhacks.services;

import com.airhacks.entities.Player;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;

@Stateless
public class QueryService {

  @PersistenceContext(unitName = "hello")
  EntityManager entityManager;

  public Player getPlayerByName(String name) {
    try {
      return entityManager.createNamedQuery(Player.FIND_PLAYER_BY_NAME, Player.class)
        .setParameter(Player.PLAYER_PARAMETER, name)
        .getSingleResult();
    } catch (NoResultException | NonUniqueResultException e) {
      return null;
    }
  }
}

据我了解,没有必要在 PersistenceContext 注释上详细说明其他任何内容,因为我们只有一个持久性单元(尽管我还添加了 unitName="hello",结果相同)。但是,一旦我尝试部署该应用程序,就会出现以下错误:

[2021-02-13T13:50:07.023+0000] [] [严重] [NCLS-CORE-00026] [javax.enterprise.system.core] [tid: _ThreadID=1 _ThreadName=main] [timeMillis: 1613224207023] [levelValue: 1000] [[ 期间异常 生命周期处理 javax.persistence.PersistenceException: 异常 [EclipseLink-4002](Eclipse 持久性服务 - 2.7.1.qualifier): org.eclipse.persistence.exceptions.DatabaseException 内部 异常:java.sql.SQLException:分配连接时出错。 原因:驱动无法加载:com.mysql.jdbc.Driver Error 代码:0 ...

  • 2.7.1.qualifier):org.eclipse.persistence.exceptions.DatabaseException 内部 异常:java.sql.SQLException:分配连接时出错。 原因:驱动无法加载:com.mysql.jdbc.Driver Error 代码:0 在 org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:316) ... ... 41 更多原因:java.sql.SQLException:分配连接时出错。原因:无法加载驱动程序: com.mysql.jdbc.Driver ... com.sun.appserv.connectors.internal.api.PoolingException:

所以,基本上,说明无法加载驱动程序。 这是我无能为力的地方。我的外部库确实包含 mysql,所以我不明白这个问题来自哪里。我已经尝试过使用不同的数据库(例如 SQLite),但是我遇到了同样的问题,当然,使用不同的驱动程序。 非常感谢您的帮助,并对这篇长篇文章感到抱歉。 谢谢!

【问题讨论】:

    标签: java mysql jpa


    【解决方案1】:

    这个版本的Mysql使用了另一个驱动类,把你的web.xml改成:

    <class-name>com.mysql.jdbc.Driver</class-name>
    

    到:

    <class-name>com.mysql.cj.jdbc.MysqlConnectionPoolDataSource</class-name>
    

    参考:https://docs.payara.fish/community/docs/5.2020.5/documentation/payara-server/jdbc/mysql-connectorj-8-changes.html

    【讨论】:

    • 将web.xml上的class-name改成com.mysql.cj.jdbc.MysqlConnectionPoolDataSource后,抛出新异常:org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql .SQLException:分配连接时出错。原因:无法分配连接,因为:通信链路故障 最后一个成功发送到服务器的数据包是 0 毫秒前。驱动程序没有收到来自服务器的任何数据包。 ... 等等。有什么帮助吗?谢谢
    • 尝试从数据库客户端连接,比如工作台,检查这个数据库“connectiondatabase”是否已经创建。这是我现在唯一能想到的。
    • 感谢您的回答。是的,我已经成功完成了,数据库已启动并运行
    • 好吧,看起来有几个可能的问题可能会导致这个异常,详细的解释可以在这里找到:stackoverflow.com/a/10772407/1256973
    猜你喜欢
    • 1970-01-01
    • 2014-03-08
    • 2017-09-14
    • 2018-03-25
    • 2018-10-07
    • 2016-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多