【问题标题】:Tomcat, Hibernate, ElasticBeanStalk, RDS, MySql Database connectionTomcat、Hibernate、ElasticBeanStalk、RDS、MySql 数据库连接
【发布时间】:2014-02-15 03:01:41
【问题描述】:

我正在将我的应用程序移动到 AWS ElasticBeanStalk,并且在花费无数小时试图让我的数据库连接正常工作后,我一再失败。

第一次尝试,

我目前有一个正在使用的现有 RDS 数据库,我想继续使用它。我尝试用一​​个普通的旧 jdbc 连接来连接它,如下所示。

    <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

    <property name="hibernate.connection.url">jdbc:mysql://masdfwe.czwweehqejmbr.us-east-1.rds.amazonaws.com:3306/project</property>
    <property name="hibernate.connection.username">root</property>
    <property name="hibernate.connection.password">xxxxx</property> 

但是在日志中发现如下异常。

原因:java.sql.SQLException:找不到适合 jdbc:mysql://masdfwe.czwweehqejmbr.us-east-1.rds.amazonaws.com:3306/project 的驱动程序 在 java.sql.DriverManager.getConnection(DriverManager.java:596) 在 java.sql.DriverManager.getConnection(DriverManager.java:187) 在 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:192) 在 org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:278) 在 org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297) ... 125 更多

mysql 驱动程序位于 lib 目录中,因此我不确定为什么会看到此异常。

我需要创建 JNDI 连接吗?如果是这样,我该如何更改 ElasticBeanStalk 上的 tomcat7 中的配置文件?我是想通过 ssh 进入 ec2 实例,还是进入 ElasticBeanStalk 实例?

我会在我的hibernate.cfg.xml 文件中使用类似的东西吗?

<property name="hibernate.connection.datasource">java:comp/env/jdbc/project</property>

web.xml

 <resource-ref>
   <description>MyDatabase Description</description>
    <res-ref-name>jdbc/project</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
 </resource-ref>

我只是不确定我应该在哪里或配置什么。任何帮助将不胜感激,我很困惑。

提前致谢。

【问题讨论】:

    标签: mysql hibernate amazon-web-services tomcat7 amazon-elastic-beanstalk


    【解决方案1】:

    我在使用 RDS 和 MySQL 时遇到了类似的问题。我尝试复制驱动程序的 jar 文件并操作类路径,但这些似乎都没有必要,也没有帮助。最终,我更改了初始化 DataSource 的代码,以传入我的连接字符串,而不是单独传递每个属性(例如,ds.setUser(xxx))。这解决了我的问题。

    所以最后,我的属性文件包含这些属性:

    app.jdbc.driverClassName=com.mysql.jdbc.Driver
    app.jdbc.url=jdbc\:mysql\://xyz.rds.amazonaws.com:3306/schema?user=username&password=mypassword
    

    还有我的数据源配置:

    ComboPooledDataSource ds = new ComboPooledDataSource();
    ds.setDriverClass( jdbcDriverClassName );
    ds.setJdbcUrl( jdbcUrl );
    // other ds configuration parameters follow
    

    通过此更改,我能够克服“驱动程序”异常并按预期连接到 RDS 数据库。

    【讨论】:

      【解决方案2】:

      你的假设是正确的。使用 Hibernate,您应该能够按原样使用您的配置。无需按名称实例化驱动程序,适用于没有 Hibernate 的 Java 代码。

      您的配置设置看起来正确。

      会不会是带有 MySQL 连接器的 jar 被损坏了? stacktrace 中还有其他内容吗?

      【讨论】:

      • 我认为它在驱动程序异常之前表示连接被拒绝,并且驱动程序没有损坏,我可以在本地使用它而不会出现问题。我今晚要查看以验证部署的版本实际上包含 jar,我知道本地打包的战争确实如此。我实际上认为驱动程序异常实际上意味着您的 jdbc url 错误。如果驱动程序实际上丢失了,它不会导致某种类型的类异常。这实际上让我相信这可能是一个防火墙问题,但小丑认为这不是问题所在。我不喜欢将驱动程序放入 tomcat do to ami 的想法
      • 驱动应该留在WEB-INF/lib中。
      • 查看本指南:Using Amazon RDS and MySQL Connector/J,虽然它不适用于 Hibernate,但它可能会有所帮助。
      【解决方案3】:

      您无需过多使用 JNDI 即可使您的 RDS 连接正常工作。根据您的描述,我也对什么不适合您感到有些困惑。尽管我使用 Spring 访问数据库,但我的 JDBC/RDS 连接设置没有问题,因此详细信息由 Spring 的数据源处理。

      只是一个想法:你确实有一个

      Class.forName ("com.mysql.jdbc.Driver").newInstance ();
      

      在代码中加载 JDBC 驱动程序?

      祝你好运!

      【讨论】:

      • 是的,我也不明白,我开始认为这是一个防火墙问题,但我对 aws 的了解还不够,无法确定。我没有驱动程序的 newInstance,我正在使用 hibernate.cfg.xml。
      • 不,从日志消息中我会说这不是防火墙问题。在某些情况下,您确实需要更新 RDS 实例的安全组的防火墙规则以允许来自您的 Elastic Beanstalk 应用程序的连接。但是您在这种情况下遇到的错误更像是超时,因为您将无法从主机获得响应...您确定您的 JDBC .jar 在 /WEB- .war 文件的 INF/lib?
      • mysql-connector-java-5.1.27.jar 可以在 /WEB-INF/lib 中找到,并且我确实将 RDS 配置为使用我的 EC2 安全组。我可以在连接到本地数据库时更改 JDBC url 并在本地运行应用程序。也许我错了,希望你能确认,但我的印象是我的 hibernate.cfg.xml 包含我的 jdbc 连接信息和 lib 目录中的 mysql jar 应该是让它工作所需要的,对吧?或者您知道我是否必须对 tomcat 或 Beanstalk GUI 进行任何手动配置,如果需要,是否需要在 EC2 实例中进行这些更改。
      • 您“不应该”需要对 Tomcat 实例、Beanstalk 配置或 EC2 实例进行任何更改。您“应该”需要的所有内容都应该能够进入您部署到 Elastic Beanstalk 环境的 .war 文件中。但是,我发现了这个:link。您可以尝试从您的 WEB-INF/lib 中删除 MySQL jar 并将其添加到 EC2 上的 Tomcat 的 lib 中,以查看这是否会改变错误行为...
      • 很好的发现,今晚晚些时候我会试一试,看看能不能解决问题。我的最后一个问题是我对 AWS 如此绿色,我是否只需将 jar 添加到 EC2 实例并且 AMI 会自动更新?我不确定 EC2 实例如何与 AMI 交互。非常感谢。如果它有效,我今晚会标记你的答案。
      猜你喜欢
      • 1970-01-01
      • 2020-11-03
      • 2015-01-29
      • 2012-01-13
      • 2020-04-08
      • 2017-09-07
      • 2019-05-03
      • 2010-10-25
      • 2018-11-29
      相关资源
      最近更新 更多