数据库连接池实践——c3p0

之前转载了一个关于连接池的博客:http://blog.csdn.net/qq407388356/article/details/78869653介绍了连接池的原理。后来在Spring整合的项目中使用到了连接池的一些操作。

下面以c3p0连接池与不使用连接池进行一个比较操作,使用maven比较简单获得c3p0的jar包。

<dependency>

     <groupId>c3p0</groupId>

     <artifactId>c3p0</artifactId>

     <version>0.9.1.1</version>

</dependency>

下面简单demo需要导入相关jar包:c3p0-0.9.1.1.jar。当然还需要mysql驱动的jar包mysql-connector-java-5.1.7-bin.jar。

ConnectionManager.java

c3p0连接池的Manager,通过ConnectionManager.getInstance().getConnection();获得数据库的Connection。

package test_c3p0;

import
com.mchange.v2.c3p0.ComboPooledDataSource;
import
java.beans.PropertyVetoException;
import
java.sql.Connection;
import
java.sql.SQLException;

public class
ConnectionManager {
   
//使用单例模式创建数据库连接池
   
private static ConnectionManager instance;
    private static
ComboPooledDataSource dataSource;

    private
ConnectionManager() throws PropertyVetoException{
       
dataSource = new ComboPooledDataSource();

       
dataSource.setUser("root");     //用户名
       
dataSource.setPassword("root"); //密码
       
dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");//数据库地址
       
dataSource.setDriverClass("com.mysql.jdbc.Driver");
       
dataSource.setInitialPoolSize(5); //初始化连接数
       
dataSource.setMinPoolSize(1);//最小连接数
       
dataSource.setMaxPoolSize(10);//最大连接数
       
dataSource.setMaxStatements(50);//最长等待时间
       
dataSource.setMaxIdleTime(60);//最大空闲时间,单位毫秒
   
}

   
public static final ConnectionManagergetInstance() {
       
if (instance == null) {
           
try {
               
instance = new ConnectionManager();
           
} catch (Exception e) {
                e.printStackTrace()
;
           
}
        }
       
return instance;
   
}

   
public synchronized final Connection getConnection() {
        Connection conn =
null;
        try
{
            conn =
dataSource.getConnection();
       
} catch (SQLException e) {
            e.printStackTrace()
;
       
}
       
return conn;
   
}
}

Main.java

测试函数,包括使用连接池和不使用连接池的情况。

import test_c3p0.ConnectionManager;

import java.sql.*;

public class Main {

    public static void main(String[] args) throws SQLException {
        System.out.println("使用连接池................................");
        for (int i = 0; i < 20; i++) {
            long beginTime = System.currentTimeMillis();
            Connection conn = ConnectionManager.getInstance().getConnection();
            query(conn);
            long endTime = System.currentTimeMillis();
            System.out.println("" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));
        }

        System.out.println("不使用连接池................................");
        final String URL = "jdbc:mysql://localhost:3306/test";
        final String USER = "root";
        final String PASSWORD = "root";
        for (int i = 0; i < 20; i++) {
            long beginTime = System.currentTimeMillis();
            Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
            query(conn);
            long endTime = System.currentTimeMillis();
            System.out.println("" + (i + 1) + "次执行花费时间为:"
                    + (endTime - beginTime));
        }
    }

    public static void query(Connection conn) {
        try {
            PreparedStatement pstmt = conn.prepareStatement("select * from test");
            ResultSet rs = pstmt.executeQuery();
            while (rs.next()) {
                // do nothing...
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

 

 

输出:

使用连接池................................

二月 25, 20183:08:59 下午com.mchange.v2.log.MLog <clinit>

信息: MLogclients using java 1.4+ standard logging.

二月 25, 20183:08:59 下午com.mchange.v2.c3p0.C3P0Registry banner

信息:Initializing c3p0-0.9.1.1 [built 15-March-2007 01:32:31; debug? true; trace:10]

二月 25, 20183:09:00 下午com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource getPoolManager

信息:Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource (连接池初始化信息…)

第1次执行花费时间为:1619

第2次执行花费时间为:2

第3次执行花费时间为:2

第19次执行花费时间为:3

第20次执行花费时间为:1

不使用连接池................................

第1次执行花费时间为:28

第2次执行花费时间为:26

第19次执行花费时间为:19

第20次执行花费时间为:72

 

明显可以看出使用连接池时,第一次初始化时间比较长,后面获得连接时间很短。而不使用连接池每次都会有一定的耗时(比较平均)。在Javaweb一些应用中,面对海量的查询操作必然需要使用连接池的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值