将 Tomcat 配置为使用属性文件加载数据库连接信息

2022-09-01 09:58:32

创建从属性文件中读取配置参数的 Tomcat 部署的可接受做法是什么?

如果能够提供 WAR 文件并指定客户端只需在特定目录中创建或编辑属性文件,那就太好了。这是一种有点常规的做事方式吗?有没有比这更好的方法?


答案 1

我们通常通过提供 WAR 和 Context XML 文件来分发 Web 应用程序,该文件会放入您的目录中,并且可以从任何路径加载 web 应用程序。这里有一个参考文件。这具有以下优点:tomcat/conf/Catalina/localhost

  • 上下文参数可以在此处配置,并由 web 应用程序读取
  • 可以在此处定义和配置数据源
  • WAR实际上可以存在于文件系统上的任何位置,这意味着如果Tomcat升级,只需要将这个配置文件移动到新的Tomcat安装中,Web应用程序和任何其他文件都可以保留在原地。

如果确实需要属性文件,可以在上下文 XML 文件中设置一个指向属性文件的参数,在 ServletContextListener 中读取该参数,然后在属性文件中读取。


答案 2

我们处理这个问题的方式:

  1. 让客户端使用我们商定的资源名称在 GlobalNamingResources 中创建连接池。数据库驱动程序需要位于 Tomcat 的类路径中。
  2. 我们的 war 文件包括一个 META-INF/context.xml 文件,该文件具有链接到步骤 1 中配置的连接池的资源链接

这比简单地改变上下文更需要一些前期工作.xml直接连接信息,但随着时间的推移,它应该会得到回报。开发服务器将设置其指向开发的GlobalNamingResources,以及指向测试的测试服务器等。然后,可以将相同的 WAR 文件复制到每个服务器,而无需编辑任何内容。

这不是使用属性文件,但我认为它实现了相同的目标。允许用户/客户设置数据库连接信息。

全球命名资源示例:

<Resource name="jdbc/dbconnection" auth="Container"
type="javax.sql.DataSource" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1546:SID"
username="scott" password="tiger" maxActive="8" maxIdle="4"
validationQuery="select 1 from dual"
testOnBorrow="true"/>

战争文件中的上下文.xml示例:

<Context path="/MyWebApp" docBase="MyWebApp" debug="5" reloadable="true">
    <ResourceLink name="jdbc/dbconnection" global="jdbc/dbconnection" 
          type="javax.sql.DataSource"/>
</Context>