在很多IT服务中,我看到一些复杂的过程来根据环境管理Java EE应用程序配置: - 使用数据库与否的自定义工具,以管理属性文件中的替换(解压缩,替换,压缩战争......) - 在服务器的obscure目录中外化属性文件(以及一些时间更新它的过程)和一些JNDI配置的时间... - maven个人资料和大量属性文件
但是对于数据库连接,每个人都使用jndi数据源。
为什么对于依赖于环境的所有配置都没有推广这个?
更新:我想要处理除数据源之外的其他变量,对数据源没有任何疑问:它是在JNDI中为Java EE应用程序配置的。如果你想破解JNDI ......
答案 0 :(得分:6)
在应用程序服务器中的某处设置数据库连接(如用户名,密码,URL,驱动程序等)与在WAR中自行完成相比有几个优点:
DataSource
实例,而不再需要担心用户名和密码。如果您有多个具有不同数据库URL和凭据的应用服务器(一个实时系统,一个测试系统,多个开发人员计算机),那么您可以单独在每个应用服务器中配置它并部署WAR文件,而无需更改数据库设置(见下文)。对于app服务器提供的其他服务也是如此,例如JavaMail。
在其他情况下,您要配置特定于某个Web应用程序的某些内容并且不依赖于环境(应用程序服务器),例如日志记录(尽管也可以在应用程序服务器中设置) 。在这些情况下,您可能更喜欢使用静态配置文件,例如log4j.properties
。
我想进一步说明第三点:... 假设您在三个应用服务器(开发人员计算机,测试服务器,实时服务器)中有一个WAR。
创建database.properties
:
db.url=jdbc:mysql://localhost:3306/localdb
db.user=myusername
db.pass=mysecretpassword
#db.url=jdbc:mysql://10.1.2.3:3306/testdb
#db.user=myusername
#db.pass=mysecretpassword
#db.url=jdbc:mysql://10.2.3.4:3306/livedb
#db.user=myusername
#db.pass=mysecretpassword
在某处部署之前,您需要检查您的设置是否指向正确的数据库!
此外,如果您将此文件检入某个版本控制系统,那么您可能不希望将您的数据库用户名/密码发布到本地计算机。
假设您已使用各自的数据库设置配置了三台服务器,并且每台服务器都使用JNDI路径java:database/mydb
注册数据库。
然后您可以像这样检索DataSource
:
Context context = new InitialContext();
DataSource dataSource = (DataSource) context.lookup("java:database/mydb");
这适用于每个应用服务器实例,您可以部署WAR而无需修改任何内容。
通过将配置移动到应用服务器,您可以根据应用代码中的环境分离设置。每当你有涉及IP地址,凭证等的设置时,我都会喜欢这个。
另一方面,使用静态.properties
文件更易于管理。在处理与环境没有依赖关系的设置或时,我更喜欢这个选项。