首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBException试图将JavaEE应用程序连接到数据库服务器时

DBException试图将JavaEE应用程序连接到数据库服务器时
EN

Stack Overflow用户
提问于 2021-02-13 14:11:35
回答 1查看 180关注 0票数 0

我寻找类似的话题。有很多这样的问题,但没有一个完全是我的,也没有提供帮助。我现在完全被困住了,所以我真的很感激你的帮助。情况如下:

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

代码语言:javascript
复制
<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下):

代码语言:javascript
复制
<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>

这个数据库运行正常,并且可以从一般的db客户端(dbeaver)完美地访问它。

最后,我的persistence.xml (在resources/META下):

代码语言:javascript
复制
<?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配置类,它与我用来创建项目(Airhack)的原型一样默认,并且只是另一个简单的实体,如下所示:

代码语言:javascript
复制
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干净包payara-micro:start),尽管在检查数据库时没有创建任何表(我认为persistence-unit会通过“排除-未列出的类”和“drop-和-create”来解决这个问题,但显然还需要一些其他的东西)。

之后,为了测试目的,我添加了一个queryService类,这样我就可以实际使用我的数据源了。我要增加以下课程:

代码语言:javascript
复制
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",结果相同)。但是,一旦我尝试部署这个应用程序,我就会得到以下错误:

org.eclipse.persistence.exceptions.DatabaseException 2021-02-13T13:50:07.023+0000严重javax.enterprise.system.core timeMillis: 1613224207023 [生命周期处理中的异常: javax.persistence.PersistenceException: javax.persistence.PersistenceException:javax.persistence.PersistenceException内部异常: java.sql.SQLException:在分配连接时出错。原因:无法加载驱动程序: com.mysql.jdbc.Driver错误代码:0

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

所以,基本上说,不能加载驱动程序。这是我做不了的地方。我的外部库确实包含mysql,所以我不知道这个问题是从何而来的。我已经尝试过使用不同的db (例如,SQLite),但是我遇到了同样的问题,当然,不同的驱动程序也有相同的问题。会非常感谢你的帮助,并为长期的职位感到抱歉。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2021-02-13 15:48:46

此版本的Mysql使用另一个驱动程序类,将您的web.xml更改为:

代码语言:javascript
复制
<class-name>com.mysql.jdbc.Driver</class-name>

至:

代码语言:javascript
复制
<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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66186046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档