一个关于properties文件读取的奇怪问题?在线等!

时间:2022-06-09 00:33:04
我读取db.properties文件的时候,为什么在修改了该文件之后,读取的还是原来的内容,甚至当我删除了该文件以后,读取的还是原来的内容,只有第一次创建该文件的时候,才是正确的读取内容?
程序代码:
<%@ page import="java.util.*"%>
<%
PropertyResourceBundle configBundle =
(PropertyResourceBundle)PropertyResourceBundle.
         getBundle("db");
       String strUrl=  configBundle.getString("url");
out.println(strUrl);
%>

12 个解决方案

#1


是不是应用服务器在工作目录有了一份同样的拷贝?

#2


工作目录的位置是在哪里,我用的是websphere

#3


我的上面程序是放在web目录下的jsp文件,而调用的db.properties是放在servlets目录下的,这种情况就会出现上面的问题
而另外一种情况是,我用放在servlets目录下的javaBean来调用db.properties文件,就不会出现上面的问题,请问这是什么原因
javabean的程序代码:
try {
InputStream is = getClass().getResourceAsStream("db.properties");
prop.load(is);
if (is != null)
is.close();
} catch (IOException e) {
System.out.println("[ConnectionPool]打开文件时出现错误");
}

//----------------------------------------------------------------------
//从Property文件中读取Property
//----------------------------------------------------------------------
String driver = prop.getProperty("drivers");

#4


贴一段代码给你看: 每次调实际是在cache中调,不是你的程序问题.
getBundle---> getBundleImpl-->

.....
  Object lookup = findBundleInCache(loader, bundleName, defaultLocale);
  if (lookup == NOTFOUND) {
     throwMissingResourceException(baseName, locale);
  } else if (lookup != null) {
     return (ResourceBundle)lookup;
  }

#5


估计是你的PropertyResourceBundle 类的问题,它在执行getBundle("db")
的时候先看看 类型为db的Properties是否创建,如果未创建则new一个,否则
不作任何操作,因为配置文件一般来说是在系统启动时候会读取到内存,以
后的属性的访问完全是内存操作,而不是每次都去读取配置文件,这样效率
太低,而且意义不大

而你下面在javabean中的语句则是每次调用方法的时候都会先读取配置文件,
当然每次都是最新的信息了

#6


第一次调JSP调入文件,然后每次都从Cache中调.

#7


不好意思,findBundleInCache好像不是标准的api,我在sun的网站的java.util.resourcebundle里面都找不到该方法

#8


对.findBundleInCache是私有的函数,在文档中是找不到的,我是断点调试才找到的.

实际很简单,做一个测试程序就知道了.

#9


几个疑惑:
1。我上面的两种方法到底有什么区别,是不是这样
jsp的那段代码将db.properties读入缓存,以后怎么变都不会再读取,除非是重启服务器
javabean的那段代码,是每次都动态读却db.properties中的内容

2。那么如果不重启服务器,重启web服务能否将缓存释放掉,如果是这样的话,它的执行过程好像和jsp就不一样,因为如果不该动jsp代码,重新启动web服务器或web服务,jsp文件都不会重新编译

#10


可是它的参数loader, bundleName, defaultLocale,basename,我都不知道如何填写,大概能解释一下吗,如何调用一些默认的值呢

#11


最关键是bundleName,就是你的"db". basename="db" also.
1. 对. 
2. 我不是很清楚服务器与web服务器的关系,但我知道你至少需要重启(servlet engine).因为虽然jsp生成的类不会变,但每次重启servlet engine后,内存中的映像消失,下一次服务就必须再调入该类.就可以读入新的db.properties中的内容.

#12


你是要写测试程序吗? 这些参数都是缺省的,除bundleName外. 再有,你不能直接调用findBundleInCache(...), 因为它是私有的.

#1


是不是应用服务器在工作目录有了一份同样的拷贝?

#2


工作目录的位置是在哪里,我用的是websphere

#3


我的上面程序是放在web目录下的jsp文件,而调用的db.properties是放在servlets目录下的,这种情况就会出现上面的问题
而另外一种情况是,我用放在servlets目录下的javaBean来调用db.properties文件,就不会出现上面的问题,请问这是什么原因
javabean的程序代码:
try {
InputStream is = getClass().getResourceAsStream("db.properties");
prop.load(is);
if (is != null)
is.close();
} catch (IOException e) {
System.out.println("[ConnectionPool]打开文件时出现错误");
}

//----------------------------------------------------------------------
//从Property文件中读取Property
//----------------------------------------------------------------------
String driver = prop.getProperty("drivers");

#4


贴一段代码给你看: 每次调实际是在cache中调,不是你的程序问题.
getBundle---> getBundleImpl-->

.....
  Object lookup = findBundleInCache(loader, bundleName, defaultLocale);
  if (lookup == NOTFOUND) {
     throwMissingResourceException(baseName, locale);
  } else if (lookup != null) {
     return (ResourceBundle)lookup;
  }

#5


估计是你的PropertyResourceBundle 类的问题,它在执行getBundle("db")
的时候先看看 类型为db的Properties是否创建,如果未创建则new一个,否则
不作任何操作,因为配置文件一般来说是在系统启动时候会读取到内存,以
后的属性的访问完全是内存操作,而不是每次都去读取配置文件,这样效率
太低,而且意义不大

而你下面在javabean中的语句则是每次调用方法的时候都会先读取配置文件,
当然每次都是最新的信息了

#6


第一次调JSP调入文件,然后每次都从Cache中调.

#7


不好意思,findBundleInCache好像不是标准的api,我在sun的网站的java.util.resourcebundle里面都找不到该方法

#8


对.findBundleInCache是私有的函数,在文档中是找不到的,我是断点调试才找到的.

实际很简单,做一个测试程序就知道了.

#9


几个疑惑:
1。我上面的两种方法到底有什么区别,是不是这样
jsp的那段代码将db.properties读入缓存,以后怎么变都不会再读取,除非是重启服务器
javabean的那段代码,是每次都动态读却db.properties中的内容

2。那么如果不重启服务器,重启web服务能否将缓存释放掉,如果是这样的话,它的执行过程好像和jsp就不一样,因为如果不该动jsp代码,重新启动web服务器或web服务,jsp文件都不会重新编译

#10


可是它的参数loader, bundleName, defaultLocale,basename,我都不知道如何填写,大概能解释一下吗,如何调用一些默认的值呢

#11


最关键是bundleName,就是你的"db". basename="db" also.
1. 对. 
2. 我不是很清楚服务器与web服务器的关系,但我知道你至少需要重启(servlet engine).因为虽然jsp生成的类不会变,但每次重启servlet engine后,内存中的映像消失,下一次服务就必须再调入该类.就可以读入新的db.properties中的内容.

#12


你是要写测试程序吗? 这些参数都是缺省的,除bundleName外. 再有,你不能直接调用findBundleInCache(...), 因为它是私有的.