Zebra源码分析-SingleDataSource

Zebra源码分析-SingleDataSource

1. 简介


上一篇文章主要对Zebra数据库中间件做了简单的介绍,并且整理了JDBC相关的知识,接下来开始按照数据源的类型对Zebra进行源码级别的分析。本篇文章将会分析SingleDataSource的继承关系,以及初始化和执行SQL的流程和设计模式。

1.1 层级结构

AbstractDataSource是一个抽象类,对DataSource接口进行了包装,而其他的DataSource都是由它的子类,SingleDataSourceGroupDataSource则是通过继承c3p0的适配而来。总而言之,他们都是DataSource接口的实现。

DataSource继承关系

1.2 内部结构

每一个SingleDataSource实际上都是对真实的数据库连接池进行包装,再其外部增加上配置文件的合并,连接和断开的监控。需要注意的是内部有一个拦截器,通过责任链的设计模式将获取链接、关闭连接、执行语句等通过一个个Filter进行处理。

2. 使用示例


2.1 直接使用JDBC

和使用普通的数据源类似,使用时需要先通过各类参数初始化数据源,获取连接后创建statement对象,并通过它执行对应的SQL语句,最后释放连接。

package com.dianping.zebra.sample.jdbc;

import com.dianping.zebra.group.jdbc.GroupDataSource;
import com.dianping.zebra.single.jdbc.SingleDataSource;
import org.junit.Test;

import java.sql.*;

public class SingleDataSourceSample {
   
    @Test
    public void singleTest() {
   
        SingleDataSource ds = buildDs();
        selectValue(ds);
    }

    private void selectValue(SingleDataSource ds) {
   
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
//从数据源中获取连接,并创建执行语句,执行完成后获得结果,并最终关闭连接
        try {
   
            conn = ds.getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery("SELECT * From `user`");

            while (rs.next()) {
   
                System.out.println("mis : " + rs.getString(2));
            }
        } catch (SQLException e) {
   
        } finally {
   
            if (rs != null) {
   
                try {
   
                    rs.close();
                } catch (SQLException e) {
   
                }
            }
            if (stmt != null) {
   
                try {
   
                    stmt.close();
                } catch (SQLException e) {
   
                }
            }

            if (conn != null) {
   
                try {
   
                    conn.close();
                } catch (SQLException e) {
   
                }
            }
        }
    }
// 设置地址、用户名、密码以及数据库链接驱动等信息,对数据源进行初始化  
    private SingleDataSource buildDs() {
   
        SingleDataSource ds = new SingleDataSource();
        ds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zebra?characterEncoding=UTF8&socketTimeout=60000&useSSL=false");
        ds.setPoolType("hikaricp");
        ds.setUser("root");
        ds.setPassword("123456");
        ds.setDriverClass("com.mysql.jdbc.Driver");
        ds.setMinPoolSize(1);
        ds.setMaxPoolSize(1);
        ds.setInitialPoolSize(1);
        ds.setCheckoutTimeout(1000);
        ds.setPreferredTestQuery("select 1");
        ds.init();
        return ds;
    }
}

2.2 结合MyBatis以及Spring

需要指定dataSource的参数以及初始化和销毁对象指定的方法,将初始化和销毁对象单独抽出形成方法是为了让filter感知到数据源的操作,并上报至各类监控系统中

<bean id="dataSource" class="com.dianping.zebra.single.jdbc.SingleDataSource" init-method="init"
          destroy-method="close">
        <property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/zebra?characterEncoding=UTF8&amp;socketTimeout=60000&amp;useSSL=false"/>
        <property name="user" value="root"/>
        <property name="password" value="123456"/>
        <property name="driverClass" value="com.mysql.jdbc.Driver"/>
        <!-- 选填,默认值为"c3p0",还支持"tomcat-jdbc"或者"druid" -->
        <property name="poolType" value="hikaricp"/>
        <!-- c3p0的minPoolSize,该值对应tomcat-jdbc或druid的"minIdle" -->
        <property name="minPoolSize" value="2"/>
        <!-- c3p0的maxPoolSize,该值对应tomcat-jdbc或druid的"maxActive" -->
        
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值