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 上运行。所以我不确定错误在哪里。
- 是否在 ec2/rds 安全组级别?
- 是否处于休眠/spring持久化级别?
- 是mysql用户级别吗?
任何人都可以帮忙,或将我指向现有 post 的答案。我已经在 Whosebug 上冲浪了几天了,决定问这个问题。
一个可能有用的提示是,在我们开始使用 ec2 之前,一位新开发人员在本地部署 war 时遇到了同样的错误。我们找到了一个解决方案,因为只有他的系统 mysql username: root 没有密码导致 war 文件工作。
所以,现在我再次看到这个错误,但我无法在实时系统上设置没有密码的 root。
您的数据库 url 设置为本地主机,如果您使用的是 RDS,则情况并非如此,您应该将其替换为 rds 控制台中提供的主机名(类似于 dbname.somerandomchars.rds.eu-西...对不起,我手头没有例子,所以这是凭记忆猜测,顺序可能略有不同)。您还需要确保将数据库用户名和密码设置为 RDS 值。
另一件事,如果你的数据库可以从 workbench 访问,这是否意味着你选择了 "publicly accessible" 如果是这样你必须更改你的安全组,允许所有流量是非常不安全的,如果它绝对必须是 public 你应该使用安全组来缩小到一个有限的集合。
我们公司有一个应用程序托管在 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 上运行。所以我不确定错误在哪里。
- 是否在 ec2/rds 安全组级别?
- 是否处于休眠/spring持久化级别?
- 是mysql用户级别吗?
任何人都可以帮忙,或将我指向现有 post 的答案。我已经在 Whosebug 上冲浪了几天了,决定问这个问题。
一个可能有用的提示是,在我们开始使用 ec2 之前,一位新开发人员在本地部署 war 时遇到了同样的错误。我们找到了一个解决方案,因为只有他的系统 mysql username: root 没有密码导致 war 文件工作。
所以,现在我再次看到这个错误,但我无法在实时系统上设置没有密码的 root。
您的数据库 url 设置为本地主机,如果您使用的是 RDS,则情况并非如此,您应该将其替换为 rds 控制台中提供的主机名(类似于 dbname.somerandomchars.rds.eu-西...对不起,我手头没有例子,所以这是凭记忆猜测,顺序可能略有不同)。您还需要确保将数据库用户名和密码设置为 RDS 值。
另一件事,如果你的数据库可以从 workbench 访问,这是否意味着你选择了 "publicly accessible" 如果是这样你必须更改你的安全组,允许所有流量是非常不安全的,如果它绝对必须是 public 你应该使用安全组来缩小到一个有限的集合。