Spring中使用proxool连接池的配置方式与出现Attempt to refer to a unregistered pool by its alias 'ums'异常的解决办法

                                                      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文件,

                 路径和文件名都可以随你的要求只要在后面一些配置中到时候指定

                 你的文件的路径和文件名称,配置文件内容如下:                

<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
 <proxool>
  <alias>LIBARARY</alias><!-- 与applicationContext.xml中url中proxool.*里面的*一致 -->  

  <driver-url>jdbc:mysql://localhost:3306/userinfo?characterEncoding=UTF-8&amp;useUnicode=true</driver-url>
  <driver-class>com.mysql.jdbc.Driver</driver-class>
  <driver-properties>
   <property name="user" value="root"/>
   <property name="password" value="sasa" />
  </driver-properties>
  <!-- 保留线程处于睡眠状态的最长时间 -->
  <house-keeping-sleep-time>90000</house-keeping-sleep-time>
  <!-- 这是我们可一次建立的最大连接数,默认是10 -->
  <simultaneous-build-throttle>20</simultaneous-build-throttle>
  <!-- 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立  -->
  <prototype-count>3</prototype-count>
  <maximum-connection-count>30</maximum-connection-count>
  <minimum-connection-count>3</minimum-connection-count>
 </proxool>

</something-else-entirely>

 

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: 

           <!-- 使用proxool作为数据库连接池 --> 
<bean id="dataSource" 
    class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
   <property name="driverClassName"> 
    <value>org.logicalcobwebs.proxool.ProxoolDriver</value> 
   </property> 
   <property name="url"> 
    <value>proxool.dbpool</value> <!--要配置成proxool.xml中的别名-->
   </property> 
</bean> 

      4.配置web.xml 

        <servlet>
    <servlet-name>proxool</servlet-name>
    <servlet-class>
      org.logicalcobwebs.proxool.admin.servlet.AdminServlet
    </servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>proxool</servlet-name>
    <url-pattern>/proxool</url-pattern>
    </servlet-mapping>

 

    <!--proxool  -->
    <context-param>
  <param-name>xmlFile</param-name>
  <param-value>WEB-INF/classes/proxool.xml</param-value>
 </context-param>
 

     <listener>
  <!-- 一定要排在所有listener前面 -->
        <listener-class>com.test.listener.ProxoolListener</listener-class><!--这个是自定义的一个监听器,后面会贴出代码-->
    </listener>

    因为必须先初始化proxool.xml文件。因为它是连接数据库的,其他很多模块都用到数据,所以你必须首先加载它,如果你先加载applicationContext.xml

    就会报Attempt to refer to a unregistered pool by its alias 'ums'。。。。。的错误

   

     本人看到网上很多都说这个问题需要将spring的监听器

  <listener> 
    <listener-class> 
    org.springframework.web.context.ContextLoaderListener 
    </listener-class> 
    </listener> 
    换成如下配置: 
    <servlet> 
    <servlet-name>contextConfigLocation</servlet-name> 
    <servlet-class> 
    org.springframework.web.context.ContextLoaderServlet 
    </servlet-class> 
    <load-on-startup>2</load-on-startup> 
    </servlet> 
    要不然你就会遇见这样的错误: 
    Problem 
    org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its 
    alias 'db' 

然后指定proxool配置文件时再这样配置: 
<servlet-name>proxoolServletConfigurator</servlet-name> 
    <servlet-class> 
    org.logicalcobwebs.proxool.configuration.ServletConfigurator 
    </servlet-class> 
    <init-param> 
    <param-name>xmlFile</param-name> 
    <param-value>WEB-INF/proxool.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
   </servlet> 
    把<load-on-startup>的值设为1,值越小级别就越高,就先被加载初始化。一定要先于applicationContext.xml的加载。

 这个方法我也试过,但是还是报一样的错误,我不知道是不是我的版本有误还是什么的,反正不行,所以自己写了个监听器来让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);
   }
  }

 }
}

     

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Spring中使用proxool连接池的配置方式与出现Attempt to refer to a unregistered pool by its alias 'ums'异常的解决办法)