具有数据源部署的 Tomcat 6 webapp

Posted

技术标签:

【中文标题】具有数据源部署的 Tomcat 6 webapp【英文标题】:Tomcat 6 webapp with datasource deployment 【发布时间】:2011-06-06 15:46:30 【问题描述】:

在开发和生产环境中部署具有数据源的应用的最佳方式是什么?

推荐使用META-INF/context.xml来指定Tomcat上下文,但我不明白如何在context.xml中指定数据源:

    把数据库密码放在所有人都可以查看的context.xml中是不安全的;

    如何为生产和开发模式维护两个不同的数据源?

你如何解决这个问题?

【问题讨论】:

【参考方案1】:

在 context.xml 文档中放置连接信息是安全的,以至于访问您的应用程序的客户端无法访问它,因此这些信息可以安全地存放在此处。对于我们这些不喜欢在服务器上以纯文本形式查看这些密码的人来说,另一种身份验证方法会很有用。

在我看来,不同的数据源是一个最好通过依赖注入来解决的问题。使用像 Spring 这样的框架可以让你指定你在配置而不是代码中使用的资源。

【讨论】:

【参考方案2】:

我不明白我应该如何在 context.xml 中指定数据源:

所以:

<?xml version="1.0" encoding="UTF-8"?>

<Context>
    <Resource
        type="javax.sql.DataSource"
        name="jdbc/dbname" 
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://localhost:3306/dbname"
        username="java" 
        password="d$7hF_r!9Y"
        maxActive="100" maxIdle="30" maxWait="10000" 
    />
</Context>

web.xml:

<resource-env-ref>
    <resource-env-ref-name>jdbc/dbname<resource-env-ref-name>
    <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
</resource-env-ref>

另见:

Tomcat JNDI resources HOWTO

1:将数据库密码放在所有人都可以查看的context.xml中是不安全的;

网络用户无法查看。只有无论如何都需要了解它们的服务器管理员才能查看它。


2:如何为生产和开发模式维护两个不同的数据源?

定义两个独立的&lt;Resource&gt;,每个都有不同的名称,并通过web.xml 或属性文件中的一些参数切换开发/生产模式,以便您可以动态获取一个或另一个数据源。例如

<context-param>
    <param-name>dev</param-name>
    <param-value>true</param-value>
</context-param>

boolean dev = Boolean.valueOf(getServletContext().getInitParameter("dev"));

if (dev) 
    dataSource = getDataSource("jdbc/devdb");
 else 
    dataSource = getDataSource("jdbc/proddb");

【讨论】:

+1。我很感兴趣为什么您在示例中更喜欢&lt;resource-env-ref&gt; 而不是&lt;resource-ref&gt;。我的意思是,在这种情况下是否不需要指定&lt;res-auth&gt;(在&lt;resource-ref&gt; 中可用)?如果您使用&lt;resource-ref&gt;,会有什么不同?几句话,没有在javaee_7.xsd中找到过于复杂的细节。 @info: &lt;resource-ref&gt; 创建一个新资源实例,&lt;resource-env-ref&gt; 使用现有资源实例(在 Tomcat 的情况下,因此在 context.xml 中定义为 &lt;Resource&gt; 有趣,不知道。用&lt;resource-env-ref&gt;是不是更实用?还有&lt;res-auth&gt;呢,&lt;resource-env-ref&gt;里没有。 @info: auth 仅在创建期间使用。在context.xml 中的&lt;Resource&gt; 的情况下,这隐含地是容器本身。 如果不介意,可以在您的答案之外添加:或者,可以使用@Resource 注释。使用此注解时,不再需要在部署描述符中定义资源(即,在 web.xml 中不需要 &lt;resource-ref&gt; 和/或 &lt;resource-env-ref&gt; 元素)。【参考方案3】:

对不起,寻找一些代码来复制和粘贴我找到了这个问答。 BalusC 是正确答案,应该标记为答案,但我不太同意第 2 点

2:我如何为生产和开发模式维护两个不同的数据源?

您不需要定义不同的上下文参数或不同的数据源。 让我们考虑一下:

    数据库 - 具有不同的数据库/架构,您需要为每个数据库设置特定的用户和密码。 应用程序服务器/Web 容器 - 将有数据源来绑定数据库。 应用程序 - 指的是数据源。

在这种情况下,您的应用程序服务器(或您正在使用的任何东西)使用数据源绑定数据库,而您的应用程序只知道数据源。因此,您的本地 tomcat 或您正在使用的任何东西通过数据源绑定到您的本地开发数据库。当您为开发、测试、生产或您可能拥有的任何环境在应用程序中构建、打包和部署时,您的应用程序服务器(或您正在使用的任何环境)将定义指向该环境的正确数据库的数据源。您只需在所有应用服务器上保持相同的 JNDI 名称即可。

【讨论】:

以上是关于具有数据源部署的 Tomcat 6 webapp的主要内容,如果未能解决你的问题,请参考以下文章

eclipse部署web项目至本地tomcat, webapps中找不到

Linux Tomcat部署常用命令

无法在 Apache Tomcat 6 上部署战争

idea部署项目到tomcat,tomcat webapps下没有项目

使用tomcat 6在spring webapp中设置Commons Logging / Log4j的问题

Tomcat 7:在 webapp 的子目录中部署一个 war 文件