|
阅读:2390回复:7
【0000进】Tomcat缓存刷新问题
我最近在个人完成一项CMS系统,目前可以完成网站静态页面的发布,具体开发情况如下:
系统分两部分: (1)项目名暂定为cms_live(抄袭了一下M$的命名方式)这个是给客户使用的一个,支持多网站的管理平台,设计的业务比较复杂,其中,不同的用户可以维护属于自己的网站内容,比如建立频道,通过开源的编辑器编辑,增加内容等……最后添加好了内容,通过velocity模板语言(在定制页面时写好的)取出内容值,最后通过一个多线程程序发布所有内容,并生成网站; (2)项目名暂定为cms_admin,用于管理cms_live的配置信息,比如网站目录,模板目录……等,还可以维护cms_live的超级管理员用户…… 我的问题是,在项目多次压力测试时发现这样一个问题:就是在cms_admin中我们可能经常根据需要改变一些配置信息,比如网站目录,模板目录……考虑到多用户,可能我们在修改这些配置信息时,live中有用户在使用,所以讲配置信息加载至缓存,可更改之后缓存并没有更新,有啥解决方案吗? 谢谢oooo |
|
|
1C#
发布于:2006-09-23 13:39
Re:【0000进】Tomcat缓存刷新问题
package tidemedia.cms.system;
/** * @author ???? * @version 1.0 */ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Hashtable; import java.util.Properties; import tidemedia.cms.system.*; import tidemedia.cms.*; import tidemedia.cms.base.*; import tidemedia.cms.util.*; /** * @author Administrator * * TODO To change the template for this generated type comment go to Window - * Preferences - Java - Code Style - Code Templates */ public class CmsCache { private static Hashtable channels = new Hashtable(); private static Config config; static { try { long beginTime = System.currentTimeMillis(); try { InitChannel(); } catch (tidemedia.cms.base.MessageException e) { // TODO Auto-generated catch block e.printStackTrace(); } InitConfig(); System.out.println("time:" + (System.currentTimeMillis() - beginTime) + "seconds"); } catch (MessageException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e1) { e1.printStackTrace(); } } public CmsCache() { } public static void InitConfig() throws MessageException, SQLException, IOException { // InputStream in = Config.class.getResourceAsStream("/cms.config.xml"); // 使用getResourceAsStream会被tomcat进行cache,得不到最新的文件内容 config = new Config(); URL path = null; TableUtil tu = new TableUtil(); path = tu.getClass().getClassLoader().getResource("cms.config.xml"); InputStream in = new FileInputStream(Config.getConfigFile(path .getFile())); Properties Props = new Properties(); Props.load(in); config.SiteFolder = Util.convertNull(Props.getProperty("SiteFolder")); config.SiteAddress = Util.convertNull(Props.getProperty("SiteAddress")); if (config.SiteAddress.endsWith("/")) config.SiteAddress = config.SiteAddress.substring(0, config.SiteAddress.length() - 1); // TempFolder = Util.convertNull(Props.getProperty("TempFolder")); config.TemplateFolder = Util.convertNull(Props .getProperty("TemplateFolder")); config.BackupFolder = Util.convertNull(Props .getProperty("BackupFolder")); config.connString = Util.convertNull(Props.getProperty("connString")); config.PublishMode = Util.parseInt(Props.getProperty("PublishMode")); config.FileExt = Util.convertNull(Props.getProperty("FileExt")); config.IsProtect = Util.convertNull(Props.getProperty("IsProtect")); config.Charset = Util.convertNull(Props.getProperty("Charset")); if (config.Charset.equals("")) config.Charset = "gb2312"; config.SleepTime = Util.parseInt(Props.getProperty("SleepTime")); if (config.SleepTime > 20 || config.SleepTime < 0) config.SleepTime = 0; config.OtherModuleAddress = Util.convertNull(Props .getProperty("OtherModuleAddress")); in.close(); Props.clear(); Props = null; } private static void InitChannel() throws tidemedia.cms.base.MessageException, SQLException { // Init(); System.out.println("channel cache init"); TableUtil tu = null; try { tu = new TableUtil(); } catch (MessageException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } channels.clear(); String Sql = ""; Sql = "select * from channel where Type=0 or Type=1"; ResultSet Rs = null; try { Rs = tu.executeQuery(Sql); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (MessageException e) { // TODO Auto-generated catch block e.printStackTrace(); } while (Rs.next()) { int id = Rs.getInt("id"); // System.out.println(id); Channel channel = new Channel(id); if (channel.isRootChannel()) channels.put("0", channel); channels.put(id + "", channel); } tu.closeRs(Rs); } public static synchronized Channel getChannel(int id) throws MessageException, SQLException { if (channels == null) { try { InitChannel(); } catch (tidemedia.cms.base.MessageException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Channel channel = (Channel) channels.get(id + ""); if (channel == null) { try { channel = new Channel(id); } catch (tidemedia.cms.base.MessageException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } channels.put(id + "", channel); } // else // System.out.println("new channel from cache "+id); return channel; } public static synchronized Config getConfig() throws MessageException, SQLException, IOException { if (config == null) { InitConfig(); } return config; } public static synchronized void delChannel(int id) { channels.remove(id + ""); } } |
|
|
2C#
发布于:2006-09-23 15:07
Re:【0000进】Tomcat缓存刷新问题
异常是什么?
重启一下服务可以么?你是要一直保持系统处于可访问状态? |
|
|
3C#
发布于:2006-09-23 17:04
Re:【0000进】Tomcat缓存刷新问题
异常是什么? 对不起小弟弟,如何处理异常这样的问题我不会问的,没有意义,很easy! 重启一下服务可以么?你是要一直保持系统处于可访问状态? 当然不可以重启,要一直处于可访问状态! |
|
|
4C#
发布于:2006-09-24 11:21
Re:【0000进】Tomcat缓存刷新问题
0000 fans
呵呵 |
|
|
|
5C#
发布于:2006-09-24 13:39
Re:【0000进】Tomcat缓存刷新问题
我的问题是,在项目多次压力测试时发现这样一个问题:就是在cms_admin中我们可能经常根据需要改变一些配置信息,比如网站目录,模板目录……考虑到多用户,可能我们在修改这些配置信息时,live中有用户在使用,所以讲配置信息加载至缓存,可更改之后缓存并没有更新,有啥解决方案吗? 你们的缓存机制是什么? 没有很明白你们的缓存是怎么工作的,还没有看你的代码 对于像这种配置信息的缓存我理解的工作流程是这样的: 服务器启动-->加载配置信息至缓存(也许只是一个Map,也许更复杂)-->启动系统(你的产品)-->修改配置(管理功能)-->更新配置信息但不刷新缓存-->某个时刻刷新缓存 但是你什么时候来刷新缓存呢?一般情况下这样的配置信息的修改要么即时生效要么只能重新启动吧,更复杂的是根据用户的访问逐个更新配置,就是说当前正在使用的用户仍然按照以前的配置,而新进的用户(即新建的session)按新修改后的配置运行 BTW:师太说最近风声紧 |
|
|
|
6C#
发布于:2006-09-24 13:53
Re:【0000进】Tomcat缓存刷新问题
试图看你的代码……终于明白语法加亮的好处了~~~
我有以下理解,不知道是不是正确: 在CmsCache类初始化的时候初始化配置(这里没有问题),而在你修改配置后并没有重新初始化配置,所以配置看起来没有生效,这样的初始化只能在服务重新启动的时候才会被加载 在你修改配置的地方调用一下CmsCache.initConfig() ?这是让配置立即生效的办法,要用其它方式重新初始化配置,参见上面的回复 |
|
|
|
7C#
发布于:2006-09-25 09:52
RMI了
只能这样了,还有一个方法就是写一个表的监听程序,发生变化则INIT,不过这样好像是又增加了数据库的压力了哈:)
在此谢谢0000先生 |
|