Spring中使用proxool连接池的配置方式与出现
Attempt to refer to a unregistered pool by its alias 'ums'异常的解决办法
1.首先找到proxool连接池的两个jar包 proxool-cglib.jar,proxool-0.9.1.jar
我使用的spring是3.1.1版本的
我这里主要讲的是通过自己的一个proxool.xml来将连接池的一些参数进行配置,
也可以使用spring的配置文件将一些参数进行配置,此时就不需要proxool.xml
文件了,这种方法我就不讲解了,因为本人觉得全都配置在spring配置文件中可能造成
配置文件比较臃肿
2.将两个jar拷贝到工程的lib目录中,在src目录下建立一个proxool.xml的xml文件,
路径和文件名都可以随你的要求只要在后面一些配置中到时候指定
你的文件的路径和文件名称,配置文件内容如下:
alias:数据源的别名
driver-url:url连接串,须确定用户名和密码
driver-class:驱动名
username:用户名(proxool没有使用,但是不能没有)
password:密码(proxool没有使用,但是不能没有)
maximum-connection-count:最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定
minimum-connection-count:最小连接数(默认2个)
house-keeping-sleep-time:proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒)
prototype-count:最少保持的空闲连接数(默认2个)
maximum-new-connections:没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受
3.配置applicationContext.xml,整合Spring和proxool
Spring配置文件applicationContext.xml中设置一个数据源(dataSource)的bean:
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
4.配置web.xml
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
因为必须先初始化proxool.xml文件。因为它是连接数据库的,其他很多模块都用到数据,所以你必须首先加载它,如果你先加载applicationContext.xml
就会报Attempt to refer to a unregistered pool by its alias 'ums'。。。。。的错误
本人看到网上很多都说这个问题需要将spring的监听器
org.springframework.web.context.ContextLoaderListener
换成如下配置:
org.springframework.web.context.ContextLoaderServlet
要不然你就会遇见这样的错误:
Problem
org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its
alias 'db'
然后指定proxool配置文件时再这样配置:
org.logicalcobwebs.proxool.configuration.ServletConfigurator
把
这个方法我也试过,但是还是报一样的错误,我不知道是不是我的版本有误还是什么的,反正不行,所以自己写了个监听器来让proxool.xml先于spring配置文件之前初始化
自己写的监听器代码如下
package com.founder.base.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.log4j.Logger;
import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
import org.logicalcobwebs.proxool.configuration.PropertyConfigurator;
public class ProxoolListener implements ServletContextListener {
private static final Logger logger = Logger.getLogger(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";
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) {
logger.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) {
logger.error("Problem configuring " + value, e);
}
} else if (name.equals(AUTO_SHUTDOWN_PROPERTY)) {
autoShutdown = Boolean.valueOf(value).booleanValue();
} else if (name.startsWith("jdbc")) {
properties.setProperty(name, value);
}
}
if (properties.size() > 0) {
try {
PropertyConfigurator.configure(properties);
} catch (ProxoolException e) {
logger.error("Problem configuring using init properties", e);
}
}
}
}