【问题标题】:JDBC connection String in AWS Elastic BeanstalkAWS Elastic Beanstalk 中的 JDBC 连接字符串
【发布时间】: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时设置连接字符串?

谢谢,洛里斯

【问题讨论】:

    标签: java mysql tomcat amazon-elastic-beanstalk amazon-rds


    【解决方案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}" />
    

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2015-04-13
        • 1970-01-01
        • 2018-12-29
        • 2021-10-07
        • 1970-01-01
        • 2015-09-18
        • 2015-11-07
        • 1970-01-01
        • 2018-09-07
        相关资源
        最近更新 更多