Elastic Beanstalk 应用程序 (Tomcat 7) 中的 MySQL 连接错误

Posted

技术标签:

【中文标题】Elastic Beanstalk 应用程序 (Tomcat 7) 中的 MySQL 连接错误【英文标题】:MySQL Connection Error in Elastic Beanstalk App (Tomcat 7) 【发布时间】:2013-02-01 00:13:19 【问题描述】:

我目前正在使用 Tomcat 7 的 64 位 AmazonLinux 服务器将 maven 构建的 .war 文件部署到 Elastic Beanstalk。但是,由于以下错误(堆栈跟踪在底部):

javax.naming.NamingException: com.mysql.jdbc.Driver

我正在连接到外部 Xeround 实例。在网上阅读后,我尝试将我的应用程序的 context.xml 修改为:

<Resource auth="Container" 
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" //<- NOT THERE BEFORE
    driverClassName="com.mysql.jdbc.Driver" 
    logAbandoned="true" 
    maxActive="100" 
    maxIdle="30" 
    maxWait="10000" 
    name="jdbc/xxxx-01292013" 
    password="xxxx" 
    removeAbandoned="true" 
    removeAbandonedTimeout="60" 
    type="javax.sql.DataSource" 
    url="jdbc:mysql://instancexxxx.db.xeround.com:xxxx/xxxx-01292013?   autoReconnect=true"
    username="xxxx-general"/>

是否有其他人在将以前工作的版本上传和使用到 Elastic Beanstalk Tomcat 7 应用程序时遇到问题,并找到了让它工作的方法?

我也阅读了this post,但我不知道在 Netbeans maven 项目中的 .ebextensions 文件中的何处添加,我不明白那会做什么。感谢您的帮助。

1) 注入构造函数时出错,javax.persistence.PersistenceException: [PersistenceUnit: myapp-persist] 无法在以下位置构建 EntityManagerFactory com.berger.jpa.EntityInitializer.(EntityInitializer.java:12) 同时定位 com.berger.jpa.EntityInitializer 对于 com.nexuscop.startup.StartupListener.entityInit(StartupListener.java:40) 的字段 同时定位 com.nexuscop.startup.StartupListener

1 处错误 com.google.inject.internal.Errors.throwProvisionExceptionIfErrorsExist(Errors.java:451) 在 com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:65) 在 com.google.inject.internal.InjectorImpl.injectMembers(InjectorImpl.java:944) 在 com.nexuscop.startup.StartupListener.(StartupListener.java:41) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:532) 在 java.lang.Class.newInstance0(Class.java:372) 在 java.lang.Class.newInstance(Class.java:325) 在 org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:125) 在 org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4715) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895) 在 org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871) 在 org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) 在 org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1099) 在 org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1621) 在 java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 在 java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 在 java.util.concurrent.FutureTask.run(FutureTask.java:166) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 在 java.lang.Thread.run(Thread.java:679) 引起: javax.persistence.PersistenceException:[PersistenceUnit: nexuscop-persist] 无法在以下位置构建 EntityManagerFactory org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:915) 在 org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:57) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:63) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:47) 在 com.berger.jpa.JpaPersistService.start(JpaPersistService.java:83) 在 com.berger.jpa.EntityInitializer.(EntityInitializer.java:14) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 方法)在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:532) 在 com.google.inject.internal.DefaultConstructionProxyFactory$2.newInstance(DefaultConstructionProxyFactory.java:85) 在 com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85) 在 com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:254) 在 com.google.inject.internal.SingleFieldInjector.inject(SingleFieldInjector.java:53) 在 com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:110) 在 com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:75) 在 com.google.inject.internal.MembersInjectorImpl$1.call(MembersInjectorImpl.java:73) 在 com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1024) 在 com.google.inject.internal.MembersInjectorImpl.injectAndNotify(MembersInjectorImpl.java:73) 在 com.google.inject.internal.MembersInjectorImpl.injectMembers(MembersInjectorImpl.java:60) ... 23 更多原因:org.hibernate.HibernateException:不能 在以下位置找到数据源 org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:79) 在 org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:143) 在 org.hibernate.ejb.InjectionSettingsFactory.createConnectionProvider(InjectionSettingsFactory.java:51) 在 org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:90) 在 org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2863) 在 org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2859) 在 org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1870) 在 org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:906) ... 42 更多原因:javax.naming.NamingException: com.mysql.jdbc.Driver 在 org.apache.naming.NamingContext.lookup(NamingContext.java:860) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:154) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:831) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:154) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:831) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:154) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:831) 在 org.apache.naming.NamingContext.lookup(NamingContext.java:168) 在 org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 在 javax.naming.InitialContext.lookup(InitialContext.java:409) 在 org.hibernate.connection.DatasourceConnectionProvider.configure(DatasourceConnectionProvider.java:75)

【问题讨论】:

我找到的解决方案请参阅***.com/questions/14656320/…... 【参考方案1】:

目前,许多人似乎无法让 .ebextensions 方法正常工作。这是一个解决方法,只是为了启动和运行。我不会像这样在生产环境中运行,但是当我对 .ebextensions 感到沮丧时,我用它来进行测试/调试。

你可以将mysql驱动直接放在你的WAR中。如果您使用的是 Maven,只需将其添加到 pom.xml:

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.6</version>
    </dependency>

您也可以将其添加到 META-INF/context.xml

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" factory="org.apache.commons.dbcp.BasicDataSourceFactory" type="javax.sql.DataSource" 
      url="jdbc:mysql://XXXXXXX
       ... />

并将其放入 pom.xml 中(否则找不到 BasicDataSourceFactory):

    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>

    <dependency>
        <groupId>commons-pool</groupId>
        <artifactId>commons-pool</artifactId>
        <version>1.6</version>
    </dependency>

    <dependency>
        <groupId>commons-collections</groupId>
        <artifactId>commons-collections</artifactId>
        <version>3.2.1</version>
    </dependency>

【讨论】:

+1 - 马克,你对像这样在生产环境中运行有什么顾虑? Viccari - mysql-connector-java 应该安装在 tomcat 中,而不是打包在 WAR 中。但对这种方法更令人怀疑的是,commons-dbcp 及其依赖项实际上是 Tomcat 框架的一部分,并且将它们放在 WAR 上是多余的。如果 Tomcat 和 WAR 中的公用 JAR 版本不同,可能会导致类路径冲突。

以上是关于Elastic Beanstalk 应用程序 (Tomcat 7) 中的 MySQL 连接错误的主要内容,如果未能解决你的问题,请参考以下文章

创建新的 Elastic Beanstalk 工作程序环境时 RubyVersionMismatch

如何将 Elastic Beanstalk 获取到服务器编译的资产?

将映像从 aws ecr 部署到 aws elastic beanstalk

Amazon Elastic Beanstalk 在创建新环境时创建服务器实例

Elastic Beanstalk 中的 Apache 配置语法失败

Elastic Beanstalk - 命令“/opt/python/run/venv/bin/pip install -r /opt/python/ondeck/app/requirements.t