配置Spring的Proxool数据源

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。 http://lavasoft.blog.51cto.com/62575/212616
配置Spring的Proxool数据源
 
Proxool单独应用比较麻烦,毕竟自己实现的数据库连接池管理工具难免有不足之处,因此可以考虑与Spring结合,形成一个DataSource对象来操作数据库,这样比较简单灵活,可靠性也高。
 
下面是在上文例子的基础上所改写的,环境如下:
Spring 2.0
proxool-0.9.1
JDK1.5
 
1、写Spring的配置文件
 
syndsconfig.xml
<? 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.logicalcobwebs.proxool.ProxoolDataSource" >
                 < property name ="driver" >
                         < value >oracle.jdbc.driver.OracleDriver </ value >
                 </ property >
                 < property name ="driverUrl" >
                         < value >jdbc:oracle:thin:@192.168.104.192:1521:tim </ value >
                 </ property >
                 < property name ="user" value ="tim" />
                 < property name ="password" value ="tim_8968888" />
                 < property name ="alias" value ="Pool_dbname" />
                 < property name ="maximumActiveTime" value ="300000" />
                 < property name ="prototypeCount" value ="0" />
                 < property name ="maximumConnectionCount" value ="50" />
                 < property name ="minimumConnectionCount" value ="2" />
                 < property name ="simultaneousBuildThrottle" value ="50" />
                 < property name ="houseKeepingTestSql" value ="select CURRENT_DATE" />
         </ bean >
</ beans >
 
2、写Spring的上下文环境管理工具
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2009-10-15 10:21:38
*/

public class ApplicationContextUtil {
         private static ApplicationContext applicationContext;

         static {
                 if (applicationContext == null)
                        applicationContext = rebuildApplicationContext();
        }

         /**
         * 重新构建Spring应用上下文环境
         *
         * @return ApplicationContext
         */

         public static ApplicationContext rebuildApplicationContext() {
                 return new ClassPathXmlApplicationContext( "/syndsconfig.xml");
        }

         /**
         * 获取Spring应用上下文环境
         *
         * @return
         */

         public static ApplicationContext getApplicationContext() {
                 return applicationContext;
        }

         /**
         * 简单的上下文环境测试
         */

         public static void main(String[] args) {
                rebuildApplicationContext();
                 if (applicationContext == null) {
                        System.out.println( "ApplicationContext isnull");
                } else {
                        System.out.println( "ApplicationContext is notnull!");
                }
        }
}
 
3、写测试类
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;


/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2009-10-10 17:59:47
*/

public class TestProxool {
         public static String dburl = "jdbc:oracle:thin:@192.168.104.192:1521:tim";
         public static String user = "tim";
         public static String password = "tim_8968888";

         /**
         * JDBC方式测试
         *
         * @throws Exception
         */

         public static void test1() throws Exception {
                String testsql = "select * from village t where lastid = 346";
                 //1:注册驱动类
                Class.forName( "oracle.jdbc.driver.OracleDriver");
                 //2:创建数据库连接
//                Connection conn = DriverManager.getConnection(dburl, user, password);
                DataSource ds = (DataSource) ApplicationContextUtil.getApplicationContext().getBean( "dataSource");
                Connection conn = ds.getConnection();
                 //3:创建执行SQL的对象
                Statement stmt = conn.createStatement();
                 //4:执行SQL,并获取返回结果
                ResultSet rs = stmt.executeQuery(testsql);
                 //5:处理返回结果,此处打印查询结果
                 while (rs.next()) {
                        System.out.print(rs.getLong( "id") + "\t");
                        System.out.print(rs.getString( "name") + "\t");
                        System.out.println();
                }
                 //6:关闭数据库连接
                conn.close();
        }


         public static void main(String[] args) throws Exception {
                test1();
        }
}
 
控制台输出如下:
2009-10-15 12:37:03    - INFO    org.springframework.core.CollectionFactory         - JDK 1.4+ collections available
2009-10-15 12:37:03    - INFO    org.springframework.beans.factory.xml.XmlBeanDefinitionReader         - Loading XML bean definitions from class path resource [syndsconfig.xml]
2009-10-15 12:37:04    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=9737354]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [dataSource]; root of BeanFactory hierarchy
2009-10-15 12:37:04    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - 1 beans defined in application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=9737354]
2009-10-15 12:37:04    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@10655dd]
2009-10-15 12:37:04    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@c8f6f8]
2009-10-15 12:37:04    - INFO    org.springframework.beans.factory.support.DefaultListableBeanFactory         - Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [dataSource]; root of BeanFactory hierarchy]
5411  张一村    
5412  张二村    
5413  张三村    
5414  张四村    
5415  南原村    
5416  辛庄村    
5417  凡村    
5418  西阳村    
5419  人马村    
5420  前关村    
5421  后关村    
5422  赵村    
5423  水淆村    
5424  沟东村    
5425  陈村    
5426  窑店村    
5427  坡头村    
20588  大安头    
20589  涧里村    
20590  人马寨    
20591  白草村    
20592  窑院村    
20593  寺下村    
20594  反上村    
33651  小安头    
33652  五花岭    
33653  东沟    
33654  西沟    
33655  南沟    
33656  王村    
33657  营前    
33659  东阳    
33661  太阳    
33663  丰阳    
33665  宜村    
33667  窑头    
32225  石原村    
32226  庙上村    
32227  庙洼    
38739  丁管营    
38841  涧西    
2009-10-15 12:37:05    - INFO    org.logicalcobwebs.proxool.Pool_dbname         - Shutting down 'Pool_dbname' pool immediately [Shutdown Hook]
2009-10-15 12:37:05    - INFO    org.logicalcobwebs.proxool.PrototyperController         - Stopping Prototyper thread
2009-10-15 12:37:05    - INFO    org.logicalcobwebs.proxool.HouseKeeperController         - Stopping HouseKeeper thread

Process finished with exit code 0
 
info日志是log4j输出的。
 
当然,可以在Spring中配置多个DataSource,都没问题的。
 
----------------------
另外今天有个同事说Proxool不能配置多个连接池,我经过测试,Proxool可以配置多个连接池,可以放心使用。
配置文件如下小:
<? 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.logicalcobwebs.proxool.ProxoolDataSource" >
                 < property name ="driver" >
                         < value >oracle.jdbc.driver.OracleDriver </ value >
                 </ property >
                 < property name ="driverUrl" >
                         < value >jdbc:oracle:thin:@192.168.104.192:1521:tim </ value >
                 </ property >
                 < property name ="user" value ="tim" />
                 < property name ="password" value ="tim_8968888" />
                 < property name ="alias" value ="proxool.a2" />
                 < property name ="maximumActiveTime" value ="300000" />
                 < property name ="prototypeCount" value ="0" />
                 < property name ="maximumConnectionCount" value ="50" />
                 < property name ="minimumConnectionCount" value ="2" />
                 < property name ="simultaneousBuildThrottle" value ="50" />
                 < property name ="houseKeepingTestSql" value ="select CURRENT_DATE" />
         </ bean >
         < bean id ="dataSource2"
                     class ="org.logicalcobwebs.proxool.ProxoolDataSource" >
                 < property name ="driver" >
                         < value >oracle.jdbc.driver.OracleDriver </ value >
                 </ property >
                 < property name ="driverUrl" >
                         < value >jdbc:oracle:thin:@192.168.104.164:1521:orcl </ value >
                 </ property >
                 < property name ="user" value ="rural" />
                 < property name ="password" value ="rural" />
                 < property name ="alias" value ="proxool.a1" />
                 < property name ="maximumActiveTime" value ="300000" />
                 < property name ="prototypeCount" value ="0" />
                 < property name ="maximumConnectionCount" value ="50" />
                 < property name ="minimumConnectionCount" value ="2" />
                 < property name ="simultaneousBuildThrottle" value ="50" />
                 < property name ="houseKeepingTestSql" value ="select CURRENT_DATE" />
         </ bean >
</ beans >
 
另外,进行极刑的变态测试,代码***,目的是为了将程序高挂,可惜没挂,呵呵!
import org.springframework.context.ApplicationContext;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;

/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2009-10-15 17:39:50
*/

public class Test {

         public static void main(String[] args) throws SQLException {
             ApplicationContext ctx = ApplicationContextUtil.getApplicationContext();
                DataSource ds1 = (DataSource)ctx.getBean( "dataSource");
                DataSource ds2 = (DataSource)ctx.getBean( "dataSource2");

                Connection conn1 = ds1.getConnection();
                Connection conn2 = ds2.getConnection();

                Statement stmt = conn1.createStatement();
                 //4:执行SQL,并获取返回结果
                ResultSet rs = stmt.executeQuery( "select * from city");
                 //5:处理返回结果,此处打印查询结果
                 while (rs.next()) {
                        System.out.print(rs.getLong( "id") + "\t");
                        System.out.print(rs.getString( "name") + "\t");
                        System.out.println();

                        Statement stmt2 = conn2.createStatement();
                         //4:执行SQL,并获取返回结果
//                        ResultSet rs2 = stmt2.executeQuery("select * from city");
                        ResultSet rs2 = stmt2.executeQuery( "select * from lm where lm_id = "+rs.getLong( "id"));
                         //5:处理返回结果,此处打印查询结果
                         while (rs2.next()) {
                                System.out.println(rs2.getLong(1));
                        }
                        System.out.println( "<<<<");
                         //6:关闭数据库连接

                }
                 //6:关闭数据库连接
                conn1.close();
                conn2.close();
                

//                System.out.println("----------");
//
//                Statement stmt2 = conn2.createStatement();
//                //4:执行SQL,并获取返回结果
//                ResultSet rs2 = stmt2.executeQuery("select count(*) from lm");
//                //5:处理返回结果,此处打印查询结果
//                while (rs2.next()) {
//                        System.out.println(rs2.getLong(1));
//                }
//                //6:关闭数据库连接
//                conn2.close();


        }
}
 
输出如下:
2009-10-15 18:25:37    - INFO    org.springframework.core.CollectionFactory         - JDK 1.4+ collections available
2009-10-15 18:25:37    - INFO    org.springframework.beans.factory.xml.XmlBeanDefinitionReader         - Loading XML bean definitions from class path resource [syndsconfig.xml]
2009-10-15 18:25:37    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=6161922]: org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [dataSource,dataSource2]; root of BeanFactory hierarchy
2009-10-15 18:25:37    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - 2 beans defined in application context [org.springframework.context.support.ClassPathXmlApplicationContext;hashCode=6161922]
2009-10-15 18:25:37    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - Unable to locate MessageSource with name 'messageSource': using default [org.springframework.context.support.DelegatingMessageSource@18dfef8]
2009-10-15 18:25:37    - INFO    org.springframework.context.support.ClassPathXmlApplicationContext         - Unable to locate ApplicationEventMulticaster with name 'applicationEventMulticaster': using default [org.springframework.context.event.SimpleApplicationEventMulticaster@134bed0]
2009-10-15 18:25:37    - INFO    org.springframework.beans.factory.support.DefaultListableBeanFactory         - Pre-instantiating singletons in factory [org.springframework.beans.factory.support.DefaultListableBeanFactory defining beans [dataSource,dataSource2]; root of BeanFactory hierarchy]
410100  郑州市    
<<<<
410200  开封市    
<<<<
410300  洛阳市    
<<<<
410400  平顶山市    
<<<<
410500  安阳市    
<<<<
410600  鹤壁市    
<<<<
410700  新乡市    
<<<<
410800  焦作市    
<<<<
410881  济源市    
<<<<
410900  濮阳市    
<<<<
411000  许昌市    
<<<<
411100  漯河市    
<<<<
411200  三门峡市    
<<<<
411300  南阳市    
<<<<
411400  商丘市    
<<<<
411500  信阳市    
<<<<
411600  周口市    
<<<<
411700  驻马店市    
<<<<
2009-10-15 18:25:39    - INFO    org.logicalcobwebs.proxool.proxool.a2         - Shutting down 'proxool.a2' pool immediately [Shutdown Hook]
2009-10-15 18:25:39    - INFO    org.logicalcobwebs.proxool.proxool.a1         - Shutting down 'proxool.a1' pool immediately [Shutdown Hook]
2009-10-15 18:25:39    - INFO    org.logicalcobwebs.proxool.PrototyperController         - Stopping Prototyper thread
2009-10-15 18:25:39    - INFO    org.logicalcobwebs.proxool.HouseKeeperController         - Stopping HouseKeeper thread

Process finished with exit code 0
 
如果大家想看Web应用的例子,可以参看:
 

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/212616

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值