具有数据源部署的Tomcat 6 webapp

时间:2011-01-10 16:47:41

标签: tomcat datasource context.xml

在开发环境和生产环境中使用数据源部署应用程序的最佳方法是什么?

建议使用 META-INF / context.xml 指定Tomcat上下文,但我不明白如何在 context.xml 中指定数据源:< / p>

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

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

  3. 你如何解决这个问题?

3 个答案:

答案 0 :(得分:5)

  

我不明白我应该如何在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>

另见:


  

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

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


  

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

使用不同的名称定义两个单独的<Resource>,并通过web.xml或属性文件中的某个参数切换dev / prod模式,以便您可以动态获取一个或另一个数据源。 E.g。

<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 :(得分:1)

抱歉,正在寻找一些要复制和粘贴的代码,我发现了这个Q&amp; A. BalusC是正确的答案,应该标记为答案,但我不完全同意第2点

  

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

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

  1. 数据库 - 具有不同的数据库/模式,您需要每个数据库的特定用户和密码。
  2. 应用程序服务器/ Web容器 - 将具有绑定数据库的数据源。
  3. 应用程序 - 指数据源。
  4. 在这种情况下,您的应用程序服务器(或您正在使用的任何服务器)使用数据源绑定数据库,您的应用程序只知道数据源。因此,您的本地tomcat或您正在使用的任何内容都会通过数据源绑定到本地开发人员数据库。当您在应用程序中构建,打包和部署开发,测试,生产或您可能拥有的任何环境时,您的应用程序服务器(或您正在使用的任何服务器)将定义指向该环境的正确数据库的数据源。您只需要在所有应用服务器上保留相同的JNDI名称。

答案 2 :(得分:0)

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

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