package com.taobao.tddl.group.jdbc;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import com.taobao.tddl.common.mock.MockDataSource;
import com.taobao.tddl.common.mock.MockDataSource.ExecuteInfo;
import com.taobao.tddl.common.model.DBType;
public class SelectorTest {
@Before
public void setUp() {
MockDataSource.clearTrace();
}
@Test
public void test_读写分离() {
TGroupDataSource tgds = new TGroupDataSource();
tgds.setDbGroupKey("dbKey0");
List<DataSourceWrapper> dataSourceWrappers = new ArrayList<DataSourceWrapper>();
MockDataSource db1 = new MockDataSource("db", "db1");
MockDataSource db2 = new MockDataSource("db", "db2");
DataSourceWrapper dsw1 = new DataSourceWrapper("db1", "w", db1, DBType.MYSQL);
DataSourceWrapper dsw2 = new DataSourceWrapper("db2", "r", db2, DBType.MYSQL);
dataSourceWrappers.add(dsw1);
dataSourceWrappers.add(dsw2);
tgds.init(dataSourceWrappers);
TGroupConnection conn = null;
Statement stat = null;
try {
conn = tgds.getConnection();
stat = conn.createStatement();
stat.executeUpdate("update xxx set name = 'newname'");
stat.executeQuery("select 1 from test");
MockDataSource.showTrace();
Assert.assertTrue(MockDataSource.hasTrace("db", "db1", "update xxx set name = 'newname'"));
Assert.assertTrue(MockDataSource.hasTrace("db", "db2", "select 1 from test"));
} catch (SQLException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
}
}
}
}
}
@Test
public void test_相同权重() {
TGroupDataSource tgds = new TGroupDataSource();
tgds.setDbGroupKey("dbKey0");
List<DataSourceWrapper> dataSourceWrappers = new ArrayList<DataSourceWrapper>();
MockDataSource db1 = new MockDataSource("db", "db1");
MockDataSource db2 = new MockDataSource("db", "db2");
DataSourceWrapper dsw1 = new DataSourceWrapper("db1", "r20", db1, DBType.MYSQL);
DataSourceWrapper dsw2 = new DataSourceWrapper("db2", "r20", db2, DBType.MYSQL);
dataSourceWrappers.add(dsw1);
dataSourceWrappers.add(dsw2);
tgds.init(dataSourceWrappers);
TGroupConnection conn = null;
Statement stat = null;
try {
for (int i = 0; i < 1000; i++) {
conn = tgds.getConnection();
stat = conn.createStatement();
stat.executeQuery("select 1 from test");
}
int count1 = 0;
int count2 = 0;
List<ExecuteInfo> infos = MockDataSource.getTrace();
for (ExecuteInfo info : infos) {
if (info.sql != null && info.sql.startsWith("select 1 from test")) {
if ("db1".equalsIgnoreCase(info.ds.getName())) {
count1++;
} else {
count2++;
}
}
}
Assert.assertTrue(count2 > 0 && count1 > 0);
} catch (SQLException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
}
}
}
}
}
@Test
public void test_不同读优先级() {
TGroupDataSource tgds = new TGroupDataSource();
tgds.setDbGroupKey("dbKey0");
List<DataSourceWrapper> dataSourceWrappers = new ArrayList<DataSourceWrapper>();
MockDataSource db1 = new MockDataSource("db", "db1");
MockDataSource db2 = new MockDataSource("db", "db2");
DataSourceWrapper dsw1 = new DataSourceWrapper("db1", "r20p20", db1, DBType.MYSQL);
DataSourceWrapper dsw2 = new DataSourceWrapper("db2", "r20p10", db2, DBType.MYSQL);
dataSourceWrappers.add(dsw1);
dataSourceWrappers.add(dsw2);
tgds.init(dataSourceWrappers);
TGroupConnection conn = null;
Statement stat = null;
try {
for (int i = 0; i < 1000; i++) {
conn = tgds.getConnection();
stat = conn.createStatement();
stat.executeQuery("select 1 from test");
}
int count1 = 0;
int count2 = 0;
List<ExecuteInfo> infos = MockDataSource.getTrace();
for (ExecuteInfo info : infos) {
if (info.sql != null && info.sql.startsWith("select 1 from test")) {
if ("db1".equalsIgnoreCase(info.ds.getName())) {
count1++;
} else {
count2++;
}
}
}
Assert.assertTrue(count1 == 1000); // 全部选择1库
Assert.assertTrue(count2 == 0);
} catch (SQLException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
}
}
}
}
}
@Test
public void test_不同写优先级() {
TGroupDataSource tgds = new TGroupDataSource();
tgds.setDbGroupKey("dbKey0");
List<DataSourceWrapper> dataSourceWrappers = new ArrayList<DataSourceWrapper>();
MockDataSource db1 = new MockDataSource("db", "db1");
MockDataSource db2 = new MockDataSource("db", "db2");
DataSourceWrapper dsw1 = new DataSourceWrapper("db1", "w20q20", db1, DBType.MYSQL);
DataSourceWrapper dsw2 = new DataSourceWrapper("db2", "w20q10", db2, DBType.MYSQL);
dataSourceWrappers.add(dsw1);
dataSourceWrappers.add(dsw2);
tgds.init(dataSourceWrappers);
TGroupConnection conn = null;
Statement stat = null;
try {
for (int i = 0; i < 1000; i++) {
conn = tgds.getConnection();
stat = conn.createStatement();
stat.executeQuery("update xxx set name = 'newname'");
}
int count1 = 0;
int count2 = 0;
List<ExecuteInfo> infos = MockDataSource.getTrace();
for (ExecuteInfo info : infos) {
if (info.sql != null && info.sql.startsWith("update xxx set name = 'newname'")) {
if ("db1".equalsIgnoreCase(info.ds.getName())) {
count1++;
} else {
count2++;
}
}
}
Assert.assertTrue(count1 == 1000); // 全部选择1库
Assert.assertTrue(count2 == 0);
} catch (SQLException e) {
Assert.fail(ExceptionUtils.getFullStackTrace(e));
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
}
if (stat != null) {
try {
stat.close();
} catch (SQLException e) {
}
}
}
}
}
}