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/<environment-name>.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 中的“容器命令构建失败”一般错误?