JavaEE-JDBC基础-连接池(数据源)

数据库连接池(数据源): 批量创建和数据库之间的连接,缓存到连接池中,提高连接性能。

1.编写连接池

1)实现javax.sql.DataSource接口,批量创建与数据库的连接,存到集合对象;
2)实现getConnection方法,从集合对象取出Connection;
3)动态代理改造Connection.close方法,把连接返回到集合对象。

改造类的方法: 继承/装饰/动态代理(java.lang.reflect.Proxy)

public class connDataSource implements DataSource {
    private static final List<Connection> connList = new LinkedList<>();
    
    static {
        Class.forName(数据库驱动类全名);
        // 批量创建与数据库的连接,存入connList对象
        for (int i = 0; i < 10; i++) {
            Connection conn = DriverManager.getConnection(url);
            // 动态代理改造close方法
            Connection connProxy = (Connection) Proxy.newProxyInstance(conn.getClass().getClassLoader(), 
                                    conn.getClass().getInterfaces(), 
                                    new InvocationHandler(){
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    if ("close".equals(method.getName())) {
                        // 改造close方法,把连接返回到connList对象       
                        if (conn != null && !conn.isClosed()) {
                            connList.add(conn);                         
                        }                   
                        return null;
                    } else {
                        // 其它方法继续保持不变
                        return method.invoke(conn, args);
                    }
                }
            });
            connList.add(connProxy);
        }
    }

    public Connection getConnection() throws SQLException {     
        Connection connProxy = connList.remove(0);
        return connProxy;
    }
}

2.开源数据库连接池

①.DBCP数据源

Apache软件基金组织下的开源数据库连接池实现, Tomcat连接池也是采用该连接池来实现。
导入的jar包: commons-dbcp.jar(连接池的实现)、commons-pool.jar(连接池实现的依赖库)

获取连接方式1
    BasicDataSource source = new BasicDataSource();
    source.setDriverClassName(数据库驱动类全名);
    source.setUrl(数据库地址);
    source.setUsername(用户);
    source.setPassword(密码);
    Connection conn = source.getConnection();

获取连接方式2
    Properties prop = new Properties();
    prop.load(new FileReader(配置文件));
    DataSource source = BasicDataSourceFactory.createDataSource(prop);
    Connection conn = source.getConnection();

    在配置文件中
    driverClassName=数据库驱动类全名
    url=数据库地址
    username=用户
    password=密码 
    initialSize=初始化连接数  
    maxActive=最大连接数 
    maxIdle=最大空闲连接数 
    minIdle=最小空闲连接数 
    maxWait=超时等待时间(毫秒)  
    defaultAutoCommit=是否自动提交
    defaultTransactionIsolation=事务隔离级别

②.C3P0数据源

导入c3p0的jar包

获取连接方式1
    ComboPooledDataSource source = new ComboPooledDataSource();
    source.setDriverClass(数据库驱动类全名);
    source.setJdbcUrl(数据库地址);
    source.setUser(用户);
    source.setPassword(密码);
    Connection conn = source.getConnection();

获取连接方式2 
    // 自动加载位于类加载目录下c3p0-config.xml配置文件
    ComboPooledDataSource source = new ComboPooledDataSource();
    Connection conn = source.getConnection();
    
    在类加载目录下名为c3p0-config.xml配置文件
    <c3p0-config>
        <default-config>
            <property  name="driverClass">数据库驱动类全名</property >
            <property name="jdbcUrl">数据库地址</property >
            <property name="user">用户</property>
            <prope rty name="password">密码</property>
        </default-config>
        <named-config name="mySoruce"> 
            <property name="driverClass">数据库驱动类全名</property >
            <property name="jdbcUrl">数据库地址</property >
            <property name="user">用户</property>
            <property name="password">密码</property>
        </named-config>
    </c3p0-config>      

③.tomcat内置数据源(DBCP)

tomcat服务器已经内置了DBCP数据源

1)在Context中配置数据源
    在tomcat/conf/context.xml配置<Context>                 被tomcat所有web应用共享        
    在tomcat/conf/Catalina/主机名/context.xml配置<Context>    被当前虚拟主机所共享  
    
    在tomcat/conf/servler.xml的<Host>标签下配置<Context>   只对当前web应用起作用
    在tomcat/conf/Catalina/主机名/XXXXXX.xml配置<Context> 只对当前web应用起作用        
    在web应用的META-INF目录创建context.xml配置<Context>       只对当前web应用起作用        
                
2)在<Cotext>中配置
    <Resource
    name="mySource" 在数据源绑定到jndi容器时使用的名字
    auth="Container" 
    type="javax.sql.DataSource" 当前对象类型
    username=用户名
    password=密码
    driverClassName=数据库驱动类全名
    url=数据库地址
    maxActive=最大连接数
    maxIdle=最大空闲连接数 />
        
3)在Servlet中获取数据源
    必须在Servlet中执行,才能获取tomcat内置数据源
    Context jndi = (Context) new InitialContext().lookup("java:comp/env");
    DataSource source = (DataSource) jndi.lookup("mySource");       
    Connection conn = source.getConnection();
    
    JNDI(Java Naming and Directory Interface),对应于J2SE的javax.naming包     
    把Java对象放在JNDI容器,为java对象取名,通过名称可检索出对象,
    Context代表JNDI容器,context.lookup方法可检索容器中的对象。

简书: http://www.jianshu.com/p/a0fa35f1899f
CSDN博客: http://blog.csdn.net/qq_32115439/article/details/54767154
GitHub博客:http://lioil.win/2017/01/27/JDBC-DataSource.html
Coding博客:http://c.lioil.win/2017/01/27/JDBC-DataSource.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,384评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,845评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,148评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,640评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,731评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,712评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,703评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,473评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,915评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,227评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,384评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,063评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,706评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,302评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,531评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,321评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,248评论 2 352

推荐阅读更多精彩内容