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 连接字符串的主要内容,如果未能解决你的问题,请参考以下文章