Zebra源码分析-SingleDataSource
1. 简介
上一篇文章主要对Zebra数据库中间件做了简单的介绍,并且整理了JDBC相关的知识,接下来开始按照数据源的类型对Zebra进行源码级别的分析。本篇文章将会分析SingleDataSource的继承关系,以及初始化和执行SQL的流程和设计模式。
1.1 层级结构
AbstractDataSource
是一个抽象类,对DataSource
接口进行了包装,而其他的DataSource
都是由它的子类,SingleDataSource
和GroupDataSource
则是通过继承c3p0的适配而来。总而言之,他们都是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&socketTimeout=60000&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" -->