本人最近因为用c3p0连接池时,总是有内存泄露(应该是我自己的问题,但找了好久都没有找到在哪里泄露),想到prolool的管理界面可以查看连接状态以及泄露状态,于是便想将c3p0换成proxool。
具体配置我就不多说了,网上垃圾的,好的一大堆,自己找一下就可以了。我只说说我出现的错误。
正如标题所写,其中文字面意思是“试图引用别名为 'xxx'的连接池是未被注册的 ”。怎么理解呢?根据这句话来说,我们一般想到的就是启动顺序。于是我查看了web.xml,发现proxool的配置是最先启动的,说明不是这个问题。接着我在网上搜索资料,大部分都千篇一律。。。找了大量资料,主要说法有以下几种:
1、直接在java类中用main方法执行才会出现这个问题
2、复制了别人的代码出现该问题,自己手写,问题解决
3、
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
说的是在applicationContext.xml里如果用<listener>就不行,需要换成下面的配置:
<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
事实证明换了错误更多了,可能是我们其他的配置不同。
4、还有重写proxool的,因为<listener>的加载会先于proxool,所以某位大牛自己写了一个jar,说导进去就可以,还得把下面这段配置换成他定义的配置
<!-- proxool配置 -->
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator
</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>WEB-INF/spring-configure/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
他的配置我没记,因为换了还是报错,不起作用。
那么上述几种权威说法,我认为有意义的只有3、4,不过仍然无法解决我报错的问题。绞尽脑汁,突然灵光一闪:想起自己原来配置hibernate+struts+proxool时,proxool.xml里如果出现中文 就会出错,即使注释也不可以 ,于是马上着手将配置文件中的中文注释一删而净。果然问题解决!