数据库连接池实现(JAVA SE)实现

最近呢 一直在忙导师的一个数据抓取的项目 大家都知道数据抓取项目是一个需要不断和数据库打交道的东东 这里面涉及到的难点呢 有一下几个

1、频繁的访问数据库

2、海量数据的存储

3、海量数据的去重问题

4、程度断开的二次连接问题

今天我主要是想说说第一个问题 频繁的访问库的问题  在这个项目中目前使用的数据库是MYSQL数据库 我们都知道JAVA中访问数据库的方式最先接触的应该是JDBC 所以我最初呢也是采用了JDBC这种数据库的访问方式  我们知道 JDBC访问数据库的一般步骤是建立连接-获取连接-进行数据库操作-关闭连接 这样一套步骤  建议连接这个操作是最耗时间的  一般在几秒钟左右  可能大家觉得几秒钟也没什么  但是如果频率一大 几百万个几秒钟那就是一个很大的数了 就会耗掉很多系统资源

那么怎么解决呢?要知道不可能只有你一个人碰到问题  一般情况下我们碰到一个问题时一定有很多人也碰到了同样的问题 这里互联网的作用就体现出来了  这里我们得感谢一下互联网  通过网上搜索 我发现大多数人都是用连接池技术来解决频繁访问数据库问题、并发问题 然后我果断选择尝试用连接池技术实现

但是你自己去搜 网上一大堆的是关于WEB的连接池技术配置  没有纯JAVA的连接池实现程序给参考 然后我果断下了现在比较流行的C3PO连接池JAR包 然后还下了它的源码

这里先解释一下什么叫连接池技术

数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量  使用情况,为系统开发测试及性能调整提供依据。

现在贴一下我的代码 (这段代码是根据网上的代码修改的  这个完全是RP让我碰到 省去我看源码的时间)

package com.tencent.weibo.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Test {
	private static ComboPooledDataSource datasource;//定义一个数据库连接池
	private static Test instance;//定义一个外部接口
	/**
	 * 定义一个私有的构造函数
	 */
	private Test(){
       datasource = new ComboPooledDataSource();
        try {
            datasource.setUser("root");//设置数据库用户名
            datasource.setPassword("1314");//设置数据库密码
            datasource.setJdbcUrl("jdbc:mysql://localhost:3306/ScnuCrawler");//设置数据连接地址
            datasource.setDriverClass("com.mysql.jdbc.Driver");//设置数据库驱动
            datasource.setInitialPoolSize(5);//连接池初始大小
            datasource.setMinPoolSize(1);//连接池最小数目
            datasource.setMaxPoolSize(20);//连接池最大数目
            datasource.setMaxIdleTime(600);//连接对象最长空闲时间
            datasource.setMaxStatements(50);//连接对象最大实例数
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
         
    }
	/**
	 * 采用单例模式获取唯一的连接池管理类对象
	 * @return
	 */
	 public static Test getManagerConnection(){
	        if(instance == null){
	            instance = new Test();
	        }
	        return instance;
	    }
	     
	    /**
	     * 从连接池中获取数据库连接 
	     * @return
	     */
	    public static Connection getConnection(){
	        Connection con = null;
	        try {
	            con = datasource.getConnection();
	        } catch (SQLException e) {
	            // TODO Auto-generated catch block
	            e.printStackTrace();
	        }
	        return con;
	         
	    }	  
	public static void main(String[] args) {	         	       
	     //使用连接池进行操作
	     for(int i=0 ; i< 10 ; i++){
	         long beginTime = System.currentTimeMillis();
	         Connection con = Test.getManagerConnection().getConnection();//从连接池获取数据库连接
	         try{
	                PreparedStatement   pst = con.prepareStatement("select * from tencentmicroblogdata");
	                ResultSet rs = pst.executeQuery();
	                while(rs.next()){
	                			/*暂不操作 嘿嘿*/
	                }
	          }catch(SQLException e){
	                e.printStackTrace();
	         }finally{
	                try {
	                    con.close();
	               } catch (SQLException e) {
	                    // TODO Auto-generated catch block
	                    e.printStackTrace();
	               }
	         }
	         long endTime = System.currentTimeMillis();
	         System.out.println("第 " + i +" 次 ,总共用了 "+(endTime-beginTime)+" ms");
	      }
	 
	    }

}

从代码中 我们可以看到 有了C3PO的JAR包后 我们要实现连接池技术 所要做的就是配置好初始参数  然后直接声明一个ComboPooledDataSource  数据库连接池对象就可以方便地进行数据库操作了

运行结果

六月 06, 2014 3:58:56 下午 com.mchange.v2.log.MLog <clinit>
INFO: MLog clients using java 1.4+ standard logging.
六月 06, 2014 3:58:56 下午 com.mchange.v2.c3p0.C3P0Registry banner
INFO: Initializing c3p0-0.9.1.2 [built 21-May-2007 15:05:05; debug? true; trace: 10]
六月 06, 2014 3:58:57 下午 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager
INFO: Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, automaticTestTable -> null, breakAfterAcquireFailure -> false, checkoutTimeout -> 0, connectionCustomizerClassName -> null, connectionTesterClassName -> com.mchange.v2.c3p0.impl.DefaultConnectionTester, dataSourceName -> 1hge16092v4m1jml37qrx|5fa0280d, debugUnreturnedConnectionStackTraces -> false, description -> null, driverClass -> com.mysql.jdbc.Driver, factoryClassLocation -> null, forceIgnoreUnresolvedTransactions -> false, identityToken -> 1hge16092v4m1jml37qrx|5fa0280d, idleConnectionTestPeriod -> 0, initialPoolSize -> 5, jdbcUrl -> jdbc:mysql://localhost:3306/ScnuCrawler, maxAdministrativeTaskTime -> 0, maxConnectionAge -> 0, maxIdleTime -> 600, maxIdleTimeExcessConnections -> 0, maxPoolSize -> 20, maxStatements -> 50, maxStatementsPerConnection -> 0, minPoolSize -> 1, numHelperThreads -> 3, numThreadsAwaitingCheckoutDefaultUser -> 0, preferredTestQuery -> null, properties -> {user=******, password=******}, propertyCycle -> 0, testConnectionOnCheckin -> false, testConnectionOnCheckout -> false, unreturnedConnectionTimeout -> 0, usesTraditionalReflectiveProxies -> false ]
第 0 次 ,总共用了 670 ms
第 1 次 ,总共用了 42 ms
第 2 次 ,总共用了 37 ms
第 3 次 ,总共用了 26 ms
第 4 次 ,总共用了 23 ms
第 5 次 ,总共用了 24 ms
第 6 次 ,总共用了 31 ms
第 7 次 ,总共用了 23 ms
第 8 次 ,总共用了 30 ms
第 9 次 ,总共用了 24 ms


我们可以看到上面的运行结果  使用了连接池技术后 只是第一次初始化连接池时消耗的时间较长 但后面几乎都是秒实现  正所谓一次实现 终身服务  还是挺花得来的



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值