关于DBCP及使用。纯JDBC架构。

本文介绍了DBCP(Database Connection Pool)的基本概念及其在Java应用程序中的使用方法。DBCP是Apache的一个开源项目,用于提高数据库连接的复用率,减少创建和销毁连接带来的开销。文章提供了详细的代码示例,展示了如何配置和使用DBCP连接池。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DBCP(DataBase connection pool),数据库连接池

是 apache 上的一个 Java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。

目前hibernate默认的连接方式就是DBCP,可见其重要性。不过话说hibernate只是一个框架,效率低多了,基础的才是笑到最后的。使用DBCP的连接池可以快速取存连接。进行一系列操作。

不说了,土豆我就直接上代码了。纯JDBC效率肯定比hibernate高哦。说不定哪天hibernate没落了。它只是工具,底层才是王道。

package com.sinoglobal.db;  
  
import java.sql.Connection;  
import java.sql.DriverManager;  
import java.sql.ResultSet;  
import java.sql.SQLException;  
import java.sql.Statement;  
import java.util.Locale;  
import java.util.ResourceBundle;  
  
import org.apache.commons.dbcp.ConnectionFactory;  
import org.apache.commons.dbcp.DriverManagerConnectionFactory;  
import org.apache.commons.dbcp.PoolableConnectionFactory;  
import org.apache.commons.dbcp.PoolingDriver;  
import org.apache.commons.pool.ObjectPool;  
import org.apache.commons.pool.impl.GenericObjectPool;  
  
@SuppressWarnings("unchecked")  
public class PoolManager {  
    private static String driver = "net.sourceforge.jtds.jdbc.Driver"; // 驱动  
    private static String url = ""; // URL  
    private static String name = "sa"; // 用户名  
    private static String password = ""; // 密码  
    private static Class driverClass = null;  
    private static ObjectPool connectionPool = null;  
    private static String poolname = "";  
    private static ResourceBundle rb;  
  
    /** 
     * 初始化数据源 
     */  
    private static synchronized void initDataSource() {  
        if (driverClass == null) {  
            try {  
                driverClass = Class.forName(driver);  
            } catch (ClassNotFoundException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    /** 
     * 装配配置文件 initProperties 
     */  
    private static void loadProperties() {  
        rb = ResourceBundle.getBundle("config", Locale.getDefault());  
        driver = rb.getString("jdbc.sql.driverClassName");  
        url = rb.getString("jdbc.sql.url");  
        name = rb.getString("jdbc.sql.username");  
        password = rb.getString("jdbc.sql.password");  
        poolname = rb.getString("jdbc.sql.poolname");  
    }  
  
    /** 
     * 连接池启动 
     *  
     * @throws Exception 
     */  
    public static void StartPool() {  
        loadProperties();  
        initDataSource();  
        if (connectionPool != null) {  
            ShutdownPool();  
        }  
        try {  
            connectionPool = new GenericObjectPool(null);  
            ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(  
                    url, name, password);  
            new PoolableConnectionFactory(connectionFactory, connectionPool,  
                    null, null, false, true);  
            Class.forName("org.apache.commons.dbcp.PoolingDriver");  
            PoolingDriver driver = (PoolingDriver) DriverManager  
                    .getDriver("jdbc:apache:commons:dbcp:");  
            driver.registerPool(poolname, connectionPool);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 释放连接池 
     */  
    public static void ShutdownPool() {  
        try {  
            PoolingDriver driver = (PoolingDriver) DriverManager  
                    .getDriver("jdbc:apache:commons:dbcp:");  
            driver.closePool(poolname);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 取得连接池中的连接 
     *  
     * @return 
     */  
    public static Connection getConnection() {  
        Connection conn = null;  
        if (connectionPool == null)  
            StartPool();  
        try {  
            conn = DriverManager.getConnection("jdbc:apache:commons:dbcp:"  
                    + poolname);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
        return conn;  
    }  
  
    /** 
     * 获取连接 getConnection 
     *  
     * @param name 
     * @return 
     */  
    public static Connection getConnection(String name) {  
        return getConnection();  
    }  
  
    /** 
     * 释放连接 freeConnection 
     *  
     * @param conn 
     */  
    public static void freeConnection(Connection conn) {  
        if (conn != null) {  
            try {  
                conn.close();  
            } catch (SQLException e) {  
                e.printStackTrace();  
            }  
        }  
    }  
  
    /** 
     * 释放连接 freeConnection 
     *  
     * @param name 
     * @param con 
     */  
    public static void freeConnection(String name, Connection con) {  
        freeConnection(con);  
    }  
  
    /** 
     * 例子 main 
     *  
     * @param args 
     */  
    public static void main(String[] args) {  
        try {  
            Connection conn = PoolManager.getConnection();  
            System.out.println(conn.isClosed());  
            if (conn != null) {  
                Statement statement = conn.createStatement();  
                ResultSet rs = statement  
                        .executeQuery("select * from test2..log");  
                int c = rs.getMetaData().getColumnCount();  
                while (rs.next()) {  
                    System.out.println();  
                    for (int i = 1; i <= c; i++) {  
                        System.out.print(rs.getObject(i));  
                    }  
                }  
                rs.close();  
            }  
            PoolManager.freeConnection(conn);  
        } catch (SQLException e) {  
            e.printStackTrace();  
        }  
  
    }  
  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值