现在的位置: 首页 > 综合 > 正文

struts2 – spring -hibernate -proxool配置

2012年08月17日 ⁄ 综合 ⁄ 共 7077字 ⁄ 字号 评论关闭

项目做完了。可是项目的性能相当的差。上面说检查下是不是连接池没有关闭导致很快将池填满了?

为此我就想做个连接池监测下信息。

首先

按照网上的例子谢了

proxool.xml

-----------------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
    <proxool-config>
    <proxool>

<!--为数据源指定一个别名-->
    <alias>DB</alias>
    <driver-url>jdbc:mysql://localhost:3306/books?useUnicode=true&amp;characterEncoding=utf-8</driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>

    <driver-properties>

<!--数据库登陆用户名-->
    <property name="user" value="root" />

<!--数据库登陆用户密码-->
    <property name="password" value="root" />
    </driver-properties>
    <house-keeping-sleep-time>90000</house-keeping-sleep-time>
       <!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的  
用户连接就不会被接受(正式库10,测试库1)--> 
    <maximum-new-connections>20</maximum-new-connections>
    <!-- 最少保持的空闲连接数(正式库10,测试库1)--> 
    <prototype-count>10</prototype-count>
    <!-- 连接池允许的最大连接数(正式库700,测试库10)--> 
    <maximum-connection-count>1000</maximum-connection-count>
    <!-- 连接池开启的最小连接数(正式库350,测试库5)--> 
    <minimum-connection-count>350</minimum-connection-count>

<!-- 一个活动连接的最长时间15分钟,单位毫秒 --> 
<maximum-active-time>900000</maximum-active-time> 
<!-- 一个连接的最长活动时间4小时,单位毫秒 --> 
<maximum-connection-lifetime>14400000</maximum-connection-lifetime> 
<!-- 自动检查连接是否断掉开关 --> 
<test-before-use>true</test-before-use> 
<!-- 自动检查连接是否断的测试sql语句 --> 
<house-keeping-test-sql>select sysdate() from dual</house-keeping-test-sql>
    </proxool>
    </proxool-config>

 

--------------------------------------------------------------------------------------------------------

this is db.xml(spring)

--------------------------------------------------------------------------------------------------------

<?xml version="1.0" encoding="UTF-8"?>
<beans
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">
  <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>org.logicalcobwebs.proxool.ProxoolDriver</value>
    </property>
    <property name="url">

<!--这里url引用上面指定的别名 proxool.DB-->
    <value>proxool.DB</value>
    </property>
    </bean>
 <bean id="sessionFactory"
  class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource">
   <ref bean="dataSource" />
  </property>
  <property name="mappingDirectoryLocations">
   <list>
    <value>classpath:com/mobile/hbm/</value>
   </list>
  </property>
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLDialect
    </prop>
    <prop key="hibernate.show_sql">
     true
    </prop>
   </props>
  </property>
 </bean>
</beans>

--------------------------------------------------------------------------------------------------------------

this  is  web.xml   问题在这里产生了。

网上找了很多例子都说必须将

 <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>

替换后出现问题了。spring 不可以没有监听器的存在。必须加入。

不替换直接用listener则出现

java.sql.SQLException: org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its alias 'DB'

这个错误。网上说出现这个错误就是要把listener替换掉。

替换掉有出了错。

我现在不知道怎么办了。

继续网上搜索。看到一篇blog写到相同的错误。

blog中说道:

 

,但有个问题,那就struts2spring进行整合时,web.xml中的spring加载必须使listener来加载,如果使用ContextLoderServlet,则会出空指向异常,报的是Struts2的objectFactory中的某处,因为绝大多数WEB容器的加载顺序是:Listener,Filter,Servlet,所以将会现struts2spring前加载,它就找不到spring的管理容器,产生异常,解决办法使用ContextLoderListener来加载spring,好,这样一来又有问题了,spring出异常了,它又会找不到我们在applicationContext.xml所提供的数据源的别名,即:proxool.DbPool,无法管理数据库连接池了,看来struts2proxool是鱼与熊掌,二者不可兼得,貌似我们现在没办法了,怎么办?
方法一:不用proxool(废话,不用它还写这篇文章干嘛);
方法二:将proxool的加载由servlet更改成使用listener加载,但proxool官方并没有提供给我们可用于listener加载的类,我们可以自己写一个listener来实现. 

 

按照他的方法写了个监听类。依然存在问题。

 

--------------------------------------------------------------------------------------------------------

 <?xml version="1.0" encoding="UTF-8"?>
 <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
 
    <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/proxool.xml</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
     </servlet>
 <servlet>
   <servlet-name>contextConfigLocation</servlet-name>
   <servlet-class>
     org.springframework.web.context.ContextLoaderServlet
   </servlet-class>
   <load-on-startup>2</load-on-startup>
 </servlet>
 
   <servlet> 
          <servlet-name>Admin  </servlet-name>
         <servlet-class> 
             org.logicalcobwebs.proxool.admin.servlet.AdminServlet  
        </servlet-class> 
     </servlet>
        <servlet-mapping> 
          <servlet-name>Admin</servlet-name> 
          <url-pattern>/admin</url-pattern> 
      </servlet-mapping>
    <!-- spring配置文件位置 -->
   <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:spring-config/*.xml</param-value>
   </context-param>
  
  <!-- log4j属性文件位置 -->
  <context-param>
   <param-name>log4jConfigLocation</param-name>
   <param-value>/WEB-INF/classes/log4j.properties</param-value>
  </context-param>
    
     <!-- 延迟会话到view界面后在关闭-->
  <filter>
   <filter-name>openSession</filter-name>
   <filter-class>
    org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
   </filter-class>
  </filter>
  <filter-mapping>
   <filter-name>openSession</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
 
 
  <!-- struts2在请求前清理以前请求留下的Action实例 -->
  <filter>
   <filter-name>struts2-cleanup</filter-name>
   <filter-class>
    org.apache.struts2.dispatcher.ActionContextCleanUp
   </filter-class>
  </filter>

  <filter-mapping>
   <filter-name>struts2-cleanup</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <!-- Struts2的过滤器-->
  <filter>
   <filter-name>struts2</filter-name>
   <filter-class>
    org.apache.struts2.dispatcher.FilterDispatcher
   </filter-class>
  </filter>
  <filter-mapping>
   <filter-name>struts2</filter-name>
   <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
     <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
 </web-app>
----------------------------------------------------------------------------------------

现在又出现这种问题了:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection,  message from server: "Too many connections"

请问:

org.logicalcobwebs.proxool.ProxoolException: Attempt to refer to a unregistered pool by its alias 'DB'这个问题到底该怎么解决?

 

如果有struts2-spring-plugin-2.0.11.jar这个jar就必须得写监听器listener.

网上还有很多少把这个去掉。

我试着去掉了还是不行,

出现:

Cannot locate the chosen ObjectFactory implementation: spring - [unknown location]

 

现在这个proxool的配置到底要怎么配?

它到底是怎样的一个思维?

谁能帮帮我?

 

抱歉!评论已关闭.