0

我正在将我的应用程序移动到AWS ElasticBeanStalk,并花费无数个小时试图让我的数据库连接工作,我反复失败。Tomcat,Hibernate,ElasticBeanStalk,RDS,MySql数据库连接

第一次尝试,

我目前在使用,我想继续使用现有的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中:在java.lang.DriverManager中3306 /项目 :找到了JDBC没有合适的驱动程序:MySQL的://masdfwe.czwweehqejmbr.us-east-1.rds.amazonaws.com .getConnection(DriverManager.java:596) 在java.sql.DriverManager.getConnection(DriverManager.java:187) 在org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:192) at org.hibernate.internal.AbstractSessionImpl $ NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:278) at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297) ... 125更多

mysql驱动程序是在lib目录中的deff,所以我不知道为什么我看到这个异常。

我需要创建一个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> 

我只是不知道在哪里,什么我假设是配置。任何帮助将不胜感激,我很困惑。

在此先感谢。

回答

1

您应该不需要太多关于JNDI来让您的RDS连接正常工作。从你的描述来看,我对有什么不适合你的工作也感到困惑。尽管我使用Spring访问数据库,但我已经建立了JDBC/RDS连接,所以细节由Spring的数据源处理。

只是一个想法:你必须在你的代码中

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

加载JDBC驱动程序?

祝你好运!

+0

是的,我也不明白,我开始认为这是一个防火墙问题,但我对aws肯定不够了解。我没有驱动程序的newInstance,我使用的是hibernate.cfg.xml。 –

+0

不,从日志消息我会说这不是防火墙问题。在某些情况下,您需要更新RDS实例的安全组的防火墙规则,以允许来自Elastic Beanstalk应用程序的连接。但是,在这种情况下你会得到的错误更多的是超时,因为你将无法得到主机的响应......你确定你的JDBC.jar在/ WEB-你的.war文件的INF/lib? – joker

+0

可以在/ WEB-INF/lib中找到mysql-connector-java-5.1.27.jar,并且确实已将RDS配置为使用我的EC2安全组。我可以在连接到本地数据库时更改JDBC URL并在本地运行应用程序。也许我错了,希望你能确认,但我的印象是,我的hibernate.cfg.xml包含我的jdbc连接信息和lib目录中的mysql jar应该是所需的所有这些才能正常工作,对吧?或者您是否知道是否必须对tomcat或Beanstalk GUI进行任何手动配置,如果需要,那么需要在EC2实例中进行这些更改。 –

0

你的假设是对的。使用Hibernate,您应该可以按原样使用您的配置。无需通过名称实例化驱动程序,它适用于没有Hibernate的Java代码。

您的配置设置看起来不错。

难道是与MySQL连接器罐不知何故被损坏? stacktrace还有其他的东西吗?

+0

我认为它表示连接在驱动程序异常之前被拒绝,并且没有驱动程序没有损坏,我能够在本地使用它而没有问题。我今晚要去看看验证部署的版本实际上是否包含jar,我在本地知道打包的war是。我其实认为驱动程序异常实际上意味着你有一个糟糕的jdbc网址。如果驱动程序实际上缺少它不会导致某种类别的异常。这实际上让我相信这可能是一个防火墙问题,但小丑不认为这是问题。我不喜欢将驱动程序放在tomcat中的想法做到ami –

+0

驱动程序应该保持在WEB-INF/lib中。 – kukido

+0

查看本指南:[使用Amazon RDS和MySQL Connector/J](http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_Java.rds.html),尽管它不适用于Hibernate,但它可能有帮助。 – kukido

0

我对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数据库。