Tomcat 6 Web应用程序与数据源部署

发布于 2024-10-10 23:45:15 字数 267 浏览 3 评论 0原文

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

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

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

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

你如何解决这个问题?

What is the best way to deploy an app with datasource both in development and in production environments?

It is recommended to use META-INF/context.xml to specify Tomcat context but I don't understand how should I specify datasource in context.xml:

  1. it's unsafe to put database password in context.xml which can be viewed by all;

  2. how do I maintain two different datasources for production and devel mode?

How do you solve this problem?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

月竹挽风 2024-10-17 23:45:15

我不明白应该如何在 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中是不安全的;

Web用户无法查看。它只能由需要了解它们的服务器管理员查看。


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

定义两个单独的,每个数据源具有不同的名称,并通过某些方式切换开发/生产模式param 在 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");
}

I don't understand how should I specify datasource in context.xml:

So:

<?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>

And in 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>

See also:


1: it's unsafe to put database password in context.xml which can be viewed by all;

It can't be viewed by web users. It's only viewable by serveradmins who needs to know about them anyway.


2: how do I maintain two different datasources for production and devel mode?

Define two separate <Resource> each with a different name and toggle the dev/prod mode by some param in web.xml or properties file so that you can dynamically grab the one or the other datasource. E.g.

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

with

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

if (dev) {
    dataSource = getDataSource("jdbc/devdb");
} else {
    dataSource = getDataSource("jdbc/proddb");
}
树深时见影 2024-10-17 23:45:15

抱歉,在寻找一些要复制和粘贴的代码时,我发现了此问答。 BalusC 是正确的答案,应该标记为答案,但我不太同意第 2 点

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

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

  1. 数据库 - 具有不同的数据库/模式,并且每个数据库都需要特定的用户和密码。
  2. 应用程序服务器/Web 容器 - 将具有用于绑定数据库的数据源。
  3. 应用程序 - 指数据源。

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

Sorry, Looking for some code to copy and paste I found this Q&A. BalusC's is the right answer and should be marked as the answer but I don't quite agree with point 2

2: how do I maintain two different datasources for production and devel mode?

You don't need to define different context parameters or different datasources.
Let's consider:

  1. The database - has the different databases/schemas and you need specific users and passwords for each database.
  2. The application server/web container - will have datasource to bind the databases.
  3. The application - refers to the datasource.

In this scenario, your application server (or whatever you are using) binds the database using the datasource and your application only knows about the datasource. So your local tomcat or whatever you are using binds via the datasource to your local dev database. When you build, pack and deploy in your application for dev, test, production or whatever environment your might have, your application server (or whatever you are using) will have the datasource defined pointing to the right database for that enviroment. You only need to keep the same JNDI name across all app servers.

羁客 2024-10-17 23:45:15

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

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

Placing connection information in the context.xml document is safe to the point that it is not accessible from a client visiting your application, so this is where that information can sit safely. Another method of authentication would be useful for those of us who don't like seeing those passwords in plain text on the server.

Different data sources are an issue that is best solved by dependency injection in my opinion. Using a framework like Spring allows you to specify which resources you are using in configuration instead of code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文