找不到适合 jdbc:mysql://localhost:3306/rom 的驱动程序(Payara 5,Windows 10)

No suitable driver found for jdbc:mysql://localhost:3306/rom (Payara 5, Windows 10)

相信我,我知道这个问题已经被问过很多次,也得到过很多次答案,而且这些答案似乎对某些用户有用。我花了很多时间尝试各种建议的解决方案,虽然它们在 Linux (Ubuntu) 上工作,但它们似乎对 Windows (Windows 10 Home with jdk1.8.0_161). Web 应用程序使用 EclipseLink 2.5.0 进行持久化。

我尝试将 mysql-connector-java-5.1.46-bin.jar 文件包含在 WAR 存档中(WEB-INF/lib;使用 Eclipse 中的部署程序集屏幕),将其复制到 payara5/glassfish/lib文件夹,以及 payara5/glassfish/domains/domain1/lib/payara5/glassfish/domains/domain1/lib/applibs 文件夹。我还尝试在部署 Web 应用程序时指定库,即将 mysql-connector-java-5.1.46-bin.jar 作为库字段中的值。我用 JAR 文件的路径更新了 CLASSPATH 环境变量。每次,服务器都会重新启动。 None 这些操作有任何效果。请注意,他们 确实 在 Linux Ubuntu.

上工作

请参阅下面的众所周知的异常跟踪:

Local Exception Stack: 

Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.0.v20170811-d680af5): org.eclipse.persistence.exceptions.DatabaseException

Internal Exception: java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/rom

Error Code: 0
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:331)
    at org.eclipse.persistence.exceptions.DatabaseException.sqlException(DatabaseException.java:326)
    at org.eclipse.persistence.sessions.DefaultConnector.connect(DefaultConnector.java:138)
    at org.eclipse.persistence.sessions.DatasourceLogin.connectToDatasource(DatasourceLogin.java:170)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.setOrDetectDatasource(DatabaseSessionImpl.java:228)
    at org.eclipse.persistence.internal.sessions.DatabaseSessionImpl.loginAndDetectDatasource(DatabaseSessionImpl.java:804)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryProvider.login(EntityManagerFactoryProvider.java:254)
    at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.deploy(EntityManagerSetupImpl.java:757)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.getAbstractSession(EntityManagerFactoryDelegate.java:216)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryDelegate.createEntityManagerImpl(EntityManagerFactoryDelegate.java:324)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManagerImpl(EntityManagerFactoryImpl.java:348)
    at org.eclipse.persistence.internal.jpa.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:311)
...

如有任何想法,我们将不胜感激。

更新:作为健全性检查(感谢@Abhi 得到了这个想法)我添加了行

try {
    System.out.println("JDBC driver: " +
    Class.forName("com.mysql.jdbc.Driver"));

} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

正确打印以下行(不抛出异常):

JDBC driver: class com.mysql.jdbc.Driver

但是没有解决问题。换句话说,驱动程序似乎是可加载的,但不知何故 EclipseLink 无法找到它 (?)

看来我可以回答我自己的问题了。我 asked the exact same question on the Payara Forum 并被建议定义数据源而不是直接使用 driver (@Chris 也指出了这个方向)。无论如何,数据源可能是最好的方式,但我想避免复杂性并使用最简单的设置..这显然行不通。

作为参考,您可以在下面找到工作设置:

  1. Payara 5 中,转到 JDBC > JDBC 连接池 > 新建:输入池名称,select javax.sql.DataSource 作为资源类型,MySql 作为供应商。在第 2 步中,com.mysql.jdbc.jdbc2.optional.MysqlDataSource 应该预先 select 用于数据源类名。在附加属性 header 下填写用户名和密码(例如 root、changeit)属性。 Select完成。在新创建的连接池页面上,select PING 以确保其设置正确。

  2. 在您的 persistence.xml 文件中,确保 persistence-unit 元素的开头如下:

<persistence-unit name="ROM" transaction-type="JTA">
     <jta-data-source>java:global/<connection pool name></jta-data-source>
  1. 创建一个 web.xml 文件(这也可以使用 Java 注释来完成):
<?xml version="1.0" encoding="UTF-8"?>
<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/<connection pool name></name>
        <class-name>com.mysql.jdbc.jdbc2.optional.MysqlDataSource</class-name>
        <server-name>[host name, e.g., localhost]</server-name>
        <port-number>3306</port-number>
        <database-name>[db name]</database-name>
        <user>[username, e.g., root]</user>
        <password>[password]</password>
    </data-source>
</web-app>

这个配置至少对我有用。希望这会帮助其他人。请注意,连接池有多种有用的设置 - 请参阅 here 了解更多选项。

到要连接的代码行:

con = DriverManager.getConnection(urlBaseDatos, usuario, clave);

添加以下内容:

DriverManager.registerDriver(new com.mysql.jdbc.Driver());
con = DriverManager.getConnection(urlBaseDatos, usuario, clave);

自然同意这里的答案,就是"in an Application server you should use a DataSource".

现在只是我的两分钱并回答最初的问题: 从 JDBC 4 开始,您不再需要注册驱动程序,并且 这一行应该不是必需的:

DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());

参见:https://docs.oracle.com/javase/8/docs/api/java/sql/DriverManager.html

所以当使用 JDK8+/EE8/JDBC4.2 兼容的应用服务器时,你不应该被强制注册驱动程序。或者我想...

不过,就像你@William 一样,我注意到 Glassfish/Payara 需要它。这很奇怪。也许这与它处理类加载的方式有关?

Wildfly 反过来做正确的事情并自动加载驱动程序,而无需实际手动注册它。