分享

S2SH+proxool JNDI 数据源

 CevenCheng 2010-09-16

网上很多朋友讲到了hibernate怎么用proxool

单独的怎么配置proxool,却很少把struts2和spring2还有hibernate整合起来的.花了一天的时候,才把配置整成功,分享出来给大家,希望可以少走弯路吧.

 

这里和大家讲一下,为什么要用tomcat来启动数据库连接池.除了资源控制一块,还有一个很大的原因是因为struts2要求spring的加载方式为<listener>

而spring会整合hibernate,在实例化的时候,会去加载proxool数据链接池.

因为proxool的加载方式是通过<servlet>方式来的,加载顺序在<listener>之后,也就是spring的后面加载.这样加载会不成功.

所以proxool的加载只能是在spring之前加载.网上有一个网友把proxool的加载方式改成了 <listener> 放在spring之前加载,这样太麻烦了,还要改源码.

于是这个方式成本就最低了.

当然,也有网友提到

写道
直接在application.xml配上
<prop key="hibernate.proxool.xml">proxool.xml</prop>

 以上引用,我配置后,并没有作用.估计那位网友使用的版本和我的不同吧.反正我试了半天是没有成功.

 

 

tomcat/conf/context.xml 配置proxool.

加在

Xml代码 
  1. </Context>  

 元素的前面 proxool的配置元素,就不多讲了,网上有很多详细的介绍.这里给大家一个链接:http://wallimn./blog/486550

Xml代码 
  1. <Resource name="jdbc/mysql"    
  2.     auth="Container"        
  3.     type="javax.sql.DataSource"    
  4.     factory="org.logicalcobwebs.proxool.ProxoolDataSource"        
  5.     proxool.alias="DBPool"        
  6.     user="root"      
  7.     password="root"        
  8.     delegateProperties="foo=bar"    
  9.     proxool.jndi-name="mysqljndi"       
  10.     proxool.driver-url="jdbc:mysql://127.0.0.1:3306/webgame?characterEncoding=utf-8"        
  11.     proxool.driver-class="com.mysql.jdbc.Driver"    
  12.     proxool.house-keeping-sleep-time="40000"  
  13.     proxool.house-keeping-test-sql="SELECT ''"  
  14.     proxool.maximum-connection-count="100"  
  15.     proxool.minimum-connection-count="20"  
  16.     proxool.maximum-connection-lifetime="18000000"  
  17.     proxool.simultaneous-build-throttle="20"  
  18.     proxool.recently-started-threshold="40000"  
  19.     proxool.overload-without-refusal-lifetime="50000"  
  20.     proxool.maximum-active-time="60000"  
  21.     proxool.verbose="true"  
  22.     proxool.trace="true"  
  23.     proxool.fatal-sql-exception="Fatal error"  
  24.     proxool.prototype-count="2"  
  25.     proxool.statistics-log-level="ERROR  
  26.     />  

 现在就不需要单独的来配置proxool.properies 和proxool.xml了.

记得把proxool-0.9.1.jar和proxool-cglib.jar包复制到tomcat/lib文件夹下,否则会报找不到

Xml代码 
  1. org.logicalcobwebs.proxool.ProxoolDataSource  

错误.把包放到自己项目下的话,会报这个错,但是也可以运行的.

 

接下来是配置web.xml

Xml代码 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="2.5" xmlns="http://java./xml/ns/javaee"  
  3.     xmlns:xsi="http://www./2001/XMLSchema-instance"  
  4.     xsi:schemaLocation="http://java./xml/ns/javaee   
  5.     http://java./xml/ns/javaee/web-app_2_5.xsd">  
  6.     <welcome-file-list>  
  7.         <welcome-file>index.jsp</welcome-file>  
  8.     </welcome-file-list>  
  9.     <context-param>  
  10.         <param-name>log4jConfigLocation</param-name>  
  11.         <param-value>classpath:log4j.properties</param-value>  
  12.     </context-param>  
  13.     <filter>  
  14.         <filter-name>struts2</filter-name>  
  15.         <filter-class>  
  16.             org.apache.struts2.dispatcher.FilterDispatcher  
  17.         </filter-class>  
  18.     </filter>  
  19.     <filter-mapping>  
  20.         <filter-name>struts2</filter-name>  
  21.         <url-pattern>/*</url-pattern>  
  22.     </filter-mapping>  
  23.     <!-- 加载数据连接池及监控数据连接池功能 -->  
  24.     <!-- 由于已经通过tomcat的jndi来加载了数据连接,所以这样里以不需要了  
  25.         <servlet>  
  26.         <servlet-name>ServletConfigurator</servlet-name>  
  27.         <servlet-class>  
  28.         org.logicalcobwebs.proxool.configuration.ServletConfigurator  
  29.         </servlet-class>  
  30.         <init-param>  
  31.         <param-name>propertyFile</param-name>  
  32.         <param-value>  
  33.         WEB-INF\classes\proxool.properties  
  34.         </param-value>  
  35.         </init-param>  
  36.         <load-on-startup>1</load-on-startup>  
  37.         </servlet>  
  38.     -->  
  39.     <servlet>  
  40.         <servlet-name>Admin</servlet-name>  
  41.         <servlet-class>  
  42.             org.logicalcobwebs.proxool.admin.servlet.AdminServlet  
  43.         </servlet-class>  
  44.     </servlet>  
  45.     <servlet-mapping>  
  46.         <servlet-name>Admin</servlet-name>  
  47.         <url-pattern>/proxool.admin</url-pattern>  
  48.     </servlet-mapping>  
  49.       
  50.     <!-- 加载spring文件 -->  
  51.     <listener>  
  52.         <listener-class>  
  53.             org.springframework.web.context.ContextLoaderListener  
  54.         </listener-class>  
  55.     </listener>  
  56.     <context-param>  
  57.         <param-name>contextConfigLocation</param-name>  
  58.         <param-value>/WEB-INF/applicationContext.xml</param-value>  
  59.     </context-param>  
  60. </web-app>  

 

applicationContext.xml

Xml代码 
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www./schema/beans"  
  3.     xmlns:xsi="http://www./2001/XMLSchema-instance" xmlns:p="http://www./schema/p"  
  4.     xmlns:aop="http://www./schema/aop" xmlns:tx="http://www./schema/tx"  
  5.     xmlns:context="http://www./schema/context"  
  6.     xsi:schemaLocation="http://www./schema/beans http://www./schema/beans/spring-beans-2.5.xsd http://www./schema/tx http://www./schema/tx/spring-tx-2.5.xsd http://www./schema/aop http://www./schema/aop/spring-aop-2.5.xsd http://www./schema/context http://www./schema/context/spring-context-2.5.xsd">  
  7.     <import resource="classes/xml/spring/games.xml" />  
  8.     <import resource="classes/xml/spring/blcx.xml" />  
  9.   
  10.     <!-- 使用tomcat jndi数据连接池 ,这里项目中的servlet就不用配置启动连接池了-->  
  11.     <bean id="dataSource"  
  12.         class="org.springframework.jndi.JndiObjectFactoryBean">  
  13.         <property name="jndiName">  
  14.             <value>java:comp/env/jdbc/mysql</value>  
  15.         </property>  
  16.     </bean>  
  17.     <!-- Hibernate设置 -->  
  18.     <!-- 会话工厂设置,读取Hibernate数据库配置信息 -->  
  19.     <bean id="sessionFactory"  
  20.         class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
  21.         <property name="dataSource" ref="dataSource" />  
  22.         <property name="hibernateProperties">  
  23.             <props>  
  24.                 <prop key="hibernate.dialect">  
  25.                     org.hibernate.dialect.MySQLDialect  
  26.                 </prop>  
  27.                 <prop key="hibernate.proxool.existing_pool">true</prop>  
  28.                 <prop key="hibernate.format.sql">true</prop>  
  29.                 <prop key="hibernate.show.sql">true</prop>  
  30.             </props>  
  31.         </property>  
  32.         <property name="mappingResources">  
  33.             <list>  
  34.                 <value>com/webgame/account/form/WebgameAccount.hbm.xml</value>  
  35.                 <value>com/webgame/account/form/WebgameAccountIndex.hbm.xml</value>  
  36.                 <value>com/webgame/pay/form/WebgameAccountFinancingLog.hbm.xml</value>  
  37.                 <value>com/webgame/pay/form/WebgameCategoriesRate.hbm.xml</value>  
  38.             </list>  
  39.         </property>  
  40.   
  41.     </bean>  
  42.   
  43.     <!-- Spring设置 -->  
  44.     <!-- 会话模板 -->  
  45.     <bean id="hibernateTemplate"  
  46.         class="org.springframework.orm.hibernate3.HibernateTemplate">  
  47.         <property name="sessionFactory">  
  48.             <ref bean="sessionFactory" />  
  49.         </property>  
  50.     </bean>  
  51.   
  52.     <!-- 事务管理器 -->  
  53.     <bean id="transactionManager"  
  54.         class="org.springframework.orm.hibernate3.HibernateTransactionManager">  
  55.         <property name="sessionFactory">  
  56.             <ref local="sessionFactory" />  
  57.         </property>  
  58.     </bean>  
  59.   
  60.     <!-- 配置事务拦截器-->  
  61.     <bean id="transactionInterceptor"  
  62.         class="org.springframework.transaction.interceptor.TransactionInterceptor">  
  63.         <!-- 事务拦截器bean 需要依赖注入一个事务管理器-->  
  64.         <property name="transactionManager">  
  65.             <ref local="transactionManager" />  
  66.         </property>  
  67.         <property name="transactionAttributes">  
  68.             <!-- 下面定义事务传播属性-->  
  69.             <props>  
  70.                 <prop key="save">PROPAGATION_REQUIRED</prop>  
  71.                 <prop key="dele*">PROPAGATION_REQUIRED</prop>  
  72.             </props>  
  73.         </property>  
  74.     </bean>  
  75.   
  76.     <!--注入到dao类里-->  
  77.     <bean id="accountIndexDao" class="com.webgame.account.dao.impl.AccountIndexDao"  
  78.         p:hibernateTemplate-ref="hibernateTemplate"   
  79.     />  
  80. </beans>  

 

以上配置基本解决了启动方面的问题.

 

使用:

Java代码 
  1. package com.webgame.account.dao.impl;  
  2.   
  3. import java.sql.SQLException;  
  4. import java.util.ArrayList;  
  5. import java.util.Date;  
  6. import java.util.List;  
  7.   
  8. import org.apache.log4j.Logger;  
  9. import org.hibernate.HibernateException;  
  10. import org.hibernate.Session;  
  11. import org.hibernate.criterion.Restrictions;  
  12. import org.springframework.orm.hibernate3.HibernateCallback;  
  13. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;  
  14.   
  15. import com.webgame.account.dao.interfaces.IAccountDao;  
  16. import com.webgame.account.form.AccountBean;  
  17.   
  18. /** 
  19.  * 类实现全局所有种类游戏的账号信息数据操作类 
  20.  *  
  21.  *  
  22.  */  
  23. public class AccountDao extends HibernateDaoSupport implements IAccountDao{  
  24.     private static final Logger logger = Logger.getLogger(AccountDao.class);  
  25.   
  26.     /* 
  27.      * (non-Javadoc) 
  28.      *  
  29.      * @see com.webgame.accout.dao.interfaces.IAccountDao#getAccountBean(java.lang.String, 
  30.      *      java.lang.String[]) 
  31.      */  
  32.     public AccountBean getAccountBean(String sql) throws SQLException {  
  33.         AccountBean form = new AccountBean();  
  34.         List list = getHibernateTemplate().find(sql);  
  35.         if (list.size() == 1)  
  36.             form = (AccountBean) list.get(0);  
  37.         return form;  
  38.     }  
  39.   
  40.     /* 
  41.      * (non-Javadoc) 
  42.      *  
  43.      * @see com.webgame.account.dao.interfaces.IAccountDao#getAccountCount(java.lang.String) 
  44.      */  
  45.     @Override  
  46.     public int getAccountCount(String sql) throws SQLException {  
  47.         int reInt = 0;  
  48.         List list = getHibernateTemplate().find(sql);  
  49.         reInt = list.size();  
  50.         return reInt;  
  51.     }  
  52.   
  53.     /* 
  54.      * (non-Javadoc) 
  55.      *  
  56.      * @see com.webgame.account.dao.interfaces.IAccountDao#getAccountList(java.lang.String) 
  57.      */  
  58.     @SuppressWarnings("unchecked")  
  59.     @Override  
  60.     public List<AccountBean> getAccountList(String sql) throws SQLException {  
  61.         List<AccountBean> list = new ArrayList<AccountBean>();  
  62.         list = getHibernateTemplate().find(sql);  
  63.         return list;  
  64.     }  
  65.   
  66.   
  67.     @Override  
  68.     public boolean checkAccountExist(final String property,final String value) {  
  69.         return (Boolean)getHibernateTemplate().execute(new HibernateCallback(){  
  70.             @SuppressWarnings("unchecked")  
  71.             public Object doInHibernate(Session session)  
  72.                     throws HibernateException, SQLException {  
  73.                 List<AccountBean> list = session.createCriteria(AccountBean.class).add(Restrictions.eq(property, value)).list();  
  74.                 if(list != null && list.size() > 0 )  
  75.                     return true;  
  76.                 else return false;  
  77.             }  
  78.         });  
  79.     }  
  80.   
  81.     @Override  
  82.     public AccountBean getAccountBeanByName(final String accountName) {  
  83.         return (AccountBean)getHibernateTemplate().execute(new HibernateCallback(){  
  84.             public Object doInHibernate(Session session)  
  85.                     throws HibernateException, SQLException {  
  86.                 return session.createCriteria(AccountBean.class).add(  
  87.                                 Restrictions.eq("accountName", accountName))  
  88.                                 .setMaxResults(1).uniqueResult();  
  89.             }  
  90.         });  
  91.     }  
  92.           
  93.     public boolean saveAccount(AccountBean bean) throws SQLException {  
  94.         bean.setInTime(new Date());  
  95.         getHibernateTemplate().save(bean);  
  96.         return true;  
  97.     }  
  98.   
  99. }  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多