浏览 6628 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-10-14
struts+spring+hibernate+proxool配置)中已经提到有关使用SSH与proxool数据库连接池配置,当时使用的是struts1.2,并且proxool是使用单独的XML文件来实现,下面使用struts2来实现相关配置.
在我的另一篇文章(
似乎使用struts2与使用struts1.x没什么区别,只不过是在struts进行整合时在struts.xml中将spring插件增加进去,就可以了,但有个问题,那就struts2与spring进行整合时,web.xml中的spring加载必须使listener来加载,如果使用ContextLoderServlet,则会出空指向异常,报的是Struts2的objectFactory中的某处,因为绝大多数WEB容器的加载顺序是:Listener,Filter,Servlet,所以将会现struts2在spring前加载,它就找不到spring的管理容器,产生异常,解决办法使用ContextLoderListener来加载spring,好,这样一来又有问题了,spring出异常了,它又会找不到我们在applicationContext.xml所提供的数据源的别名,即:proxool.DbPool,无法管理数据库连接池了,看来struts2与proxool是鱼与熊掌,二者不可兼得,貌似我们现在没办法了,怎么办? 方法一:不用proxool(废话,不用它还写这篇文章干嘛); 方法二:将proxool的加载由servlet更改成使用listener加载,但proxool官方并没有提供给我们可用于listener加载的类,我们可以自己写一个listener来实现. 首先我们要去proxool官方下载它的源码,地址:http://nchc.dl.sourceforge.net/sourceforge/proxool/proxool-0.9.1-source.zip 此处需要注意,我没找到0.9RC3的源码,这是最新的源码0.9.1的 下载后解压打开src\java\org\logicalcobwebs\proxool\configuration\ServletConfigurator.java,也就是加载proxool的servlet,复制init()方法中的代码,放入我们自己写的listener的contextInitialized方法中去,导入相应的包,OK,一切搞定,重新启动服务器发现struts2与proxool都被正确加载了. 下面我的代码 package cn.wt.listener; import java.io.File; import java.util.Enumeration; import java.util.Properties; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.logicalcobwebs.proxool.ProxoolException; import org.logicalcobwebs.proxool.configuration.JAXPConfigurator; import org.logicalcobwebs.proxool.configuration.PropertyConfigurator; /** * @author wangtao */ public class ProxoolListener implements ServletContextListener { private static final Log LOG = LogFactory.getLog(ProxoolListener.class); private static final String XML_FILE_PROPERTY = "xmlFile"; private static final String PROPERTY_FILE_PROPERTY = "propertyFile"; private static final String AUTO_SHUTDOWN_PROPERTY = "autoShutdown"; @SuppressWarnings("unused") private boolean autoShutdown = true; public void contextDestroyed(ServletContextEvent arg0) { System.out.println("destroy database pool...."); } public void contextInitialized(ServletContextEvent contextEvent) { ServletContext context = contextEvent.getServletContext(); //对应servlet的init方法中ServletConfig.getServletContext() String appDir = contextEvent.getServletContext().getRealPath("/"); Properties properties = new Properties(); Enumeration names = context.getInitParameterNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); String value = context.getInitParameter(name); if (name.equals(XML_FILE_PROPERTY)) { try { File file = new File(value); if (file.isAbsolute()) { JAXPConfigurator.configure(value, false); } else { JAXPConfigurator.configure(appDir + File.separator + value, false); } } catch (ProxoolException e) { LOG.error("Problem configuring " + value, e); } } else if (name.equals(PROPERTY_FILE_PROPERTY)) { try { File file = new File(value); if (file.isAbsolute()) { PropertyConfigurator.configure(value); } else { PropertyConfigurator.configure(appDir + File.separator + value); } } catch (ProxoolException e) { LOG.error("Problem configuring " + value, e); } } else if (name.equals(AUTO_SHUTDOWN_PROPERTY)) { autoShutdown = Boolean.valueOf(value).booleanValue(); } else if (name.startsWith("jdbc")) { //此处以前是PropertyConfigurator.PREFIX改为jdbc properties.setProperty(name, value); } } if (properties.size() > 0) { try { PropertyConfigurator.configure(properties); } catch (ProxoolException e) { LOG.error("Problem configuring using init properties", e); } } } } 最后想说的是,我是将这个listener放在了spring的listener前面,不知道放在它后面是否会影响加载,没试过. 一句感叹:开源真好! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-12-11
你好牛啊,太感谢你了!
我花了很多时间去尝试改变加载顺序都没成功, 正准备到proxool官方网站上去查有没有listener的加载方式呢 太感谢你了! |
|
返回顶楼 | |
发表时间:2008-12-11
搞这么复杂干嘛?
直接在application.xml配上 <prop key="hibernate.proxool.xml">proxool.xml</prop> 不就OK了 |
|
返回顶楼 | |
发表时间:2008-12-13
同意楼上,呵呵
|
|
返回顶楼 | |
发表时间:2009-03-11
herowzz 写道 搞这么复杂干嘛?
直接在application.xml配上 <prop key="hibernate.proxool.xml">proxool.xml</prop> 不就OK了 偶也是这么配置的.没有什么问题.. |
|
返回顶楼 | |