相信我,我知道这个问题已被多次询问并且已经多次得到答案,这些答案似乎对某些用户有效。我花了很多时间尝试各种提议的解决方案,虽然它们在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中的Deployment Assembly屏幕),将其复制到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
环境变量。每次,服务器都重新启动。这些行动都没有任何效果。请注意,他们 在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无法找到它(?)
答案 0 :(得分:2)
看起来我能够回答我自己的问题。我asked the exact same question on the Payara Forum并且建议定义数据源而不是直接使用驱动程序(@Chris也指向此方向)。无论如何,数据源可能是最好的方式,但我想避免复杂性并使用最简单的设置......这显然不起作用。
作为参考,您可以在下面找到工作设置:
在 Payara 5 中,转到JDBC> JDBC连接池>新建:输入池名称,选择javax.sql.DataSource
作为资源类型,选择MySql作为供应商。在步骤2中,应为数据源类名预先选择com.mysql.jdbc.jdbc2.optional.MysqlDataSource
。在Additional Properties标题下填写用户名和密码(例如,root,changeit)属性。选择完成。在新创建的连接池的页面上,选择PING以确保它已正确设置。
在persistence.xml
文件中,确保persistence-unit元素如下所示:
<persistence-unit name="ROM" transaction-type="JTA">
<jta-data-source>java:global/<connection pool name></jta-data-source>
web.xml
文件(这也可以使用Java Annotations完成):<?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了解更多选项。
答案 1 :(得分:0)
到要连接的代码行:
con = DriverManager.getConnection(urlBaseDatos, usuario, clave);
添加以下内容:
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
con = DriverManager.getConnection(urlBaseDatos, usuario, clave);
答案 2 :(得分:0)
当然,我同意这里的答案,即“在应用程序服务器中你应该使用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 会做正确的事情并自动加载驱动程序而无需手动注册它。