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

Jpa 未找到适合jdbc的驱动程序:mysql://localhost:3306/rom (Payara 5,Windows 10),jpa,jdbc,glassfish,eclipselink,payara,Jpa,Jdbc,Glassfish,Eclipselink,Payara,相信我,我知道这个问题已经被问了很多次,也得到了很多次的答案,这些答案似乎对一些用户有用。我花了很多时间尝试各种建议的解决方案,虽然它们在Linux(Ubuntu)上工作,但似乎对Windows(Windows 10 Home和jdk1.8.0_161)没有任何影响。web应用程序正在使用EclipseLink 2.5.0进行持久化 我尝试将mysql-connector-java-5.1.46-bin.jar文件包含在WAR归档文件中(WEB-INF/lib;在Eclipse中使用部署程序集屏

相信我,我知道这个问题已经被问了很多次,也得到了很多次的答案,这些答案似乎对一些用户有用。我花了很多时间尝试各种建议的解决方案,虽然它们在Linux(Ubuntu)上工作,但似乎对Windows(Windows 10 Home和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
环境变量。每次都会重新启动服务器。这些行动都没有任何效果。请注意,他们确实在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();
}
正确打印以下行(不引发异常):


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

看起来我能够回答自己的问题。建议我定义一个数据源,而不是直接使用驱动程序(@Chris也指向这个方向)。数据源可能是最好的选择,但我想避免复杂性,使用最简单的设置。。这显然不起作用

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

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

  • persistence.xml
    文件中,确保persistence unit元素按如下方式启动:

  • 
    java:全局/
    
  • 创建
    web.xml
    文件(这也可以使用Java注释完成):
  • 
    java:全局/
    com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    [主机名,例如本地主机]
    3306
    [数据库名称]
    [用户名,例如root]
    [密码]
    

    这种配置至少对我有效。希望这能帮助其他人。请注意,连接池有各种有用的设置-例如,有关更多选项,请参见。

    到要连接的代码行:

    con = DriverManager.getConnection(urlBaseDatos, usuario, clave);
    
    添加以下内容:

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

    当然,我同意这里的答案,即“在应用服务器中,您应该使用数据源”

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

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

    因此,在使用兼容JDK8+/EE8/JDBC4.2的应用程序服务器时,不应强制您注册驱动程序。或者我是这么想的

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


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

    您在连接之前是否注册了驱动程序?使用Class.forName(“Driver.something”);不,因为1)自从JDBC 4以来,这就不需要了;2)我使用的是JPA(EclipseLink),所以我没有手动创建连接,我知道自从JDBC 4以来,它就不需要了。据我所知,Netbeans不注册驱动程序就支持它,但eclipse不支持。但我不能对JPA说什么。别担心有人会帮你的☺️ 或者你可能会比自己聪明。@Abhi它与NetBeans或Eclipse无关。它内置于JRE中。自JDBC1.4以来。@EJP自Java6/JDBC4以来
    DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());