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

时间:2018-04-01 14:59:32

标签: jpa jdbc glassfish eclipselink payara

相信我,我知道这个问题已被多次询问并且已经多次得到答案,这些答案似乎对某些用户有效。我花了很多时间尝试各种提议的解决方案,虽然它们在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无法找到它(?)

3 个答案:

答案 0 :(得分:2)

看起来我能够回答我自己的问题。我asked the exact same question on the Payara Forum并且建议定义数据源而不是直接使用驱动程序(@Chris也指向此方向)。无论如何,数据源可能是最好的方式,但我想避免复杂性并使用最简单的设置......这显然不起作用。

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

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

  2. persistence.xml文件中,确保persistence-unit元素如下所示:

  3. <persistence-unit name="ROM" transaction-type="JTA">
         <jta-data-source>java:global/<connection pool name></jta-data-source>
    
    1. 创建一个web.xml文件(这也可以使用Java Annotations完成):
    2. <?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 会做正确的事情并自动加载驱动程序而无需手动注册它。