在开发和生产环境中使用数据源部署应用程序的最佳方式是什么?
建议使用META-INF/context.xml来指定 Tomcat 上下文,但我不明白我应该如何在context.xml中指定数据源:
将数据库密码放在所有人都可以查看的context.xml中是不安全的;
如何为生产和开发模式维护两个不同的数据源?
你怎么解决这个问题?
在开发和生产环境中使用数据源部署应用程序的最佳方式是什么?
建议使用META-INF/context.xml来指定 Tomcat 上下文,但我不明白我应该如何在context.xml中指定数据源:
将数据库密码放在所有人都可以查看的context.xml中是不安全的;
如何为生产和开发模式维护两个不同的数据源?
你怎么解决这个问题?
我不明白我应该如何在 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
以便您可以动态获取一个或另一个数据源。例如
<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");
}
对不起,寻找一些代码来复制和粘贴我发现了这个问答。BalusC 是正确答案,应该标记为答案,但我不太同意第 2 点
2:我如何为生产和开发模式维护两个不同的数据源?
您不需要定义不同的上下文参数或不同的数据源。让我们考虑一下:
在这种情况下,您的应用程序服务器(或您正在使用的任何东西)使用数据源绑定数据库,而您的应用程序只知道数据源。因此,您的本地 tomcat 或您正在使用的任何东西通过数据源绑定到您的本地开发数据库。当您为开发、测试、生产或您可能拥有的任何环境在应用程序中构建、打包和部署时,您的应用程序服务器(或您正在使用的任何环境)将定义指向该环境的正确数据库的数据源。您只需要在所有应用服务器上保持相同的 JNDI 名称。
将连接信息放在 context.xml 文档中是安全的,以至于访问您的应用程序的客户端无法访问它,因此该信息可以安全地存放在此处。对于我们这些不喜欢在服务器上以纯文本形式查看这些密码的人来说,另一种身份验证方法会很有用。
在我看来,不同的数据源是一个最好通过依赖注入来解决的问题。使用像 Spring 这样的框架允许您指定在配置中使用哪些资源而不是代码。