Spring war 部署在 ec2 上的文件显示连接到 rds 的休眠持久性失败

Spring war file deployed on ec2 showing hibernate persistence failure connecting to rds

我们公司有一个应用程序托管在 media temple 上,我们正在迁移到 amazon ec2。我已经完成了所有教程,并获得了 apache、php、mysql、java 和 tomcat7 运行 就好了。此外,我已经能够使用 mysql workbench 连接到 rds 实例。

但是,当我将 war 文件上传到 tomcat 管理器时,我收到一条错误消息,指出它无法连接到数据库。

这是 catalina.out 文件中错误的顶部

----------------来自日志文件的片段-------------------- ----------------------

17:28:52.311 [http-bio-8080-exec-1] DEBUG o.s.b.f.s.DisposableBeanAdapter - Invoking destroy method 'close' on bean with name 'dataSource'
17:28:52.311 [http-bio-8080-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Retrieved dependent beans for bean '(inner bean)#73e12051': [org.springframework.se
curity.access.method.DelegatingMethodSecurityMetadataSource#0]
17:28:52.311 [http-bio-8080-exec-1] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Retrieved dependent beans for bean '(inner bean)#3b35dc09': [(inner bean)#73e12051]
17:28:52.312 [http-bio-8080-exec-1] **ERROR o.s.web.context.ContextLoader - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in file [/var/lib/tomcat7/webapps/clearbox/WEB
-INF/classes/META-INF/spring/applicationContext.xml]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit
: persistenceUnit] Unable to build EntityManagerFactory**
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553) ~[spring-beans-
4.0.3.RELEASE.jar:4.0.3.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) ~[spring-beans-4.0
.3.RELEASE.jar:4.0.3.RELEASE]

..等等.....

SEVERE: The web application [/clearbox] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

**------------END SNIPPET FROM LOG FILE-----------------------------**

Here is the code from the applicationContext.xml it attempts to run

**--------------SNIPPET FROM applicationContect.xml----------------**

    <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
        <property name="driverClassName" value="${database.driverClassName}"/>
        <property name="url" value="${database.url}"/>
        <property name="username" value="${database.username}"/>
        <property name="password" value="${database.password}"/>
        <property name="testOnBorrow" value="true"/>
        <property name="testOnReturn" value="true"/>
        <property name="testWhileIdle" value="true"/>
        <property name="timeBetweenEvictionRunsMillis" value="1800000"/>
        <property name="numTestsPerEvictionRun" value="3"/>
        <property name="minEvictableIdleTimeMillis" value="1800000"/>
        <property name="validationQuery" value="SELECT 1"/>
    </bean>

    <bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>

----------------结束片段------------------------ ------------------

Here is the database.properties that holds the info for applicationContext.xml

--------------------来自 database.properties 的片段---------------- --

database.driverClassName=com.mysql.jdbc.Driver
database.url=jdbc\:mysql\://localhost\:3306/clearboxdb
hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
database.username=MYUSERNAMEHERE
database.password=MYPASSWORDHERE

--------------------结束片段---------------- ----------------------

rds 有一个安全组,它具有以下 Inbound: MYSQL TCP 3306 0.0.0.0/0

目前一切都在我的本地 tomcat7 和我们现有的实时应用程序 tomcat7 上运行。所以我不确定错误在哪里。

任何人都可以帮忙,或将我指向现有 post 的答案。我已经在 Whosebug 上冲浪了几天了,决定问这个问题。

一个可能有用的提示是,在我们开始使用 ec2 之前,一位新开发人员在本地部署 war 时遇到了同样的错误。我们找到了一个解决方案,因为只有他的系统 mysql username: root 没有密码导致 war 文件工作。

所以,现在我再次看到这个错误,但我无法在实时系统上设置没有密码的 root。

您的数据库 url 设置为本地主机,如果您使用的是 RDS,则情况并非如此,您应该将其替换为 rds 控制台中提供的主机名(类似于 dbname.somerandomchars.rds.eu-西...对不起,我手头没有例子,所以这是凭记忆猜测,顺序可能略有不同)。您还需要确保将数据库用户名和密码设置为 RDS 值。

另一件事,如果你的数据库可以从 workbench 访问,这是否意味着你选择了 "publicly accessible" 如果是这样你必须更改你的安全组,允许所有流量是非常不安全的,如果它绝对必须是 public 你应该使用安全组来缩小到一个有限的集合。