我在使用jersey构建的java中有一个REST Web服务,出于安全考虑,我想在OS环境变量中保存方法的参数:DriverManager.getConnection();
。网址,用户名和密码。
由于每个请求都需要创建自己的连接,我想知道是否有很多对System.getenv("key");
的调用是性能问题?
这样做的想法来自这篇文章:http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-rds.html#java-rds-javase
拥有这样的东西会是更好的选择:
public class EnvironmentHelper {
static final String URL;
static final String USERNAME;
static final String PASSWORD;
static {
URL = System.getenv("URL");
USERNAME = System.getenv("USERNAME");
PASSWORD = System.getenv("PASSWORD");
}
}
这样我只加载变量一次,对吗?无论我收到多少请求。
答案 0 :(得分:3)
System.getEnv(name)
转换为ProcessEnvironment.getEnv
实际上是对HashMap的查找(ProcessEnvironment是HashMap的扩展)这个HashMap加载在一个静态块中,该块在类initilaization上运行 - 所以这个
看起来非常快,因为查找很有可能是O(1)。
答案 1 :(得分:1)
我怀疑与每个请求创建一个新连接相比,对getenv的调用会造成更大的性能问题,但我相信如果使用上面使用的静态加载方法来解决问题,那将是最好的。这消除了为每个新连接搜索环境列表的任务。
根据operating system manual for the getenv function,它确实需要搜索环境列表以查找值,但根据我的C知识,我知道这不需要系统调用,因为环境变量被复制到程序中。