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數據庫。