AWS Elastic Beanstalk 中的 JDBC 连接字符串

Posted

技术标签:

【中文标题】AWS Elastic Beanstalk 中的 JDBC 连接字符串【英文标题】:JDBC connection String in AWS Elastic Beanstalk 【发布时间】:2013-12-26 14:42:56 【问题描述】:

我想在 aws 中迁移我的应用程序,

我已经设置了我的环境。使用弹性豆茎。

在我的应用程序的当前版本中,它在本地运行正常,我用这个简单的代码设置连接:

在 web.xml 中我已经定义了资源:

<resource-ref> 
     <description> Resource reference to a factory for java.sql.Connection instances that may be used for talking to a particular database that is configured in the <Context> configuration for the web application. </description> 
     <res-ref-name>jdbc/TestDB</res-ref-name>
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
</resource-ref>

然后在 config.xml 我定义了资源

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="utente1" password="utente1" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/nazioni?autoReconnect=true" />

现在我可以通过这种方式获得连接

/* JNDI query to locate the DataSource object */ 
Context initContext = new InitialContext(); 
Context envContext = (Context)initContext.lookup("java:/comp/env") ; 

// JNDI standard naming root 
DataSource ds = (DataSource)envContext.lookup("jdbc/TestDB");

/* Ask DataSource for a connection */ 
Connection conn = ds.getConnection();

现在我的问题是:我可以在我的 config.xml 中硬编码连接字符串还是使用 System.getProperty("JDBC_CONNECTION_STRING") 更好?如果是这样,我如何在加载tomcat时设置连接字符串?

谢谢,洛里斯

【问题讨论】:

【参考方案1】:

最好使用 XML 配置,因为大部分应用程序从一个环境移动到另一个环境时。XML 可能会发生变化,所以从我的经验来看,XML 更好。

您也可以使用属性文件,但在大多数情况下,当您想要一些像标签一样经常更改的属性而不是基于配置的东西 DB 连接字符串、SMTP 等时,这会有所帮助。

WEB.XML 的名称是部署描述符,因为在部署时,它有助于加载基于不同环境的应用程序的详细信息。

【讨论】:

所以你认为在config.xml中硬编码连接字符串更好? 没想到,大部分项目都是这样的,我们已经做了。因为大部分时间都会配置基于环境的xml。【参考方案2】:

Tomcat Configuration Reference 提到支持 Ant 风格的变量替换:

支持 Apache Ant 风格的变量替换;系统属性 可以在配置文件中使用名为 propname 的 语法 $propname。所有系统属性都可用,包括 那些使用 -D 语法设置的,那些自动提供的 JVM 和那些在 $CATALINA_BASE/conf/catalina.properties 文件。

表示如果在.ebextensions/&lt;environment-name&gt;.config内定义一个属性如:

option_settings:
  - option_name: JDBC_CONNECTION_STRING
    value: jdbc:mysql://localhost:3306/nazioni?autoReconnect=true

那么您应该可以在配置文件中引用该属性:

<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="utente1" password="utente1" driverClassName="com.mysql.jdbc.Driver" url="JDBC_CONNECTION_STRING" />

与硬编码相比,该方法至少有两个好处:

    可以在正在运行的实例上的 AWS Beanstalk 控制台中手动更改该值 可以在正在运行的实例上以编程方式更改该值

【讨论】:

【参考方案3】:

一般来说,最好不要在您的应用程序(或其他类似的应用程序配置)中硬编码连接字符串信息。理想情况下,您希望将应用程序配置外部化,以便您的应用程序可以在环境之间移植。

对于 Elastic Beanstalk,您可以同时在不同的 Beanstalk 环境(可能是 QA 和 PROD 环境)中部署相同的应用程序 WAR,如果您对连接字符串进行硬编码,那么两个 WAR 文件都将指向到同一个数据库实例。

同样,您可能需要在某些时候更改连接字符串,可能是因为您的数据库实例名称已更改,如果您对连接字符串进行硬编码,则您将不得不重新构建和部署新的 JAR。

如果您使用 Elastic Beanstalk 提供的 JDBC_CONNECTION_STRING 配置并在运行时读取这些配置,那么您可以使用 Elastic Beanstalk 控制台或 API 轻松更改连接字符串,还可以维护单个 WAR 在不同环境之间的可移植性。

【讨论】:

以上是关于AWS Elastic Beanstalk 中的 JDBC 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 中的 Python:私有包依赖项

AWS Elastic Beanstalk 中的 mysqlclient 安装错误

一个 AWS 账户中的 Elastic Beanstalk 能否与另一个 AWS 账户中的 RDS 通信?

如何解决 AWS Elastic Beanstalk 中的“容器命令构建失败”一般错误?

AWS Elastic Beanstalk 中的 JDBC 连接字符串

AWS Elastic Beanstalk 中的工作人员“dyno”