多数据源配置

为了简单,本文的数据源使用了mango中的DriverManagerDataSource,DriverManagerDataSource只是一个用于测试的简单数据源,线上环境请使用第三方数据源

单数据源

单数据源使用SimpleDataSourceFactory。

使用单数据源,不需要在@DB注解中定义dataSource参数,下面的代码使用了单一数据源:

DataSource ds = new DriverManagerDataSource(driverClassName, url, username, password);
Mango mango = Mango.newInstance(new SimpleDataSourceFactory(ds));

或者也可以简写为:

DataSource ds = new DriverManagerDataSource(driverClassName, url, username, password);
Mango mango = Mango.newInstance(ds);;

单数据源读写分离

单数据源读写分离使用MasterSlaveDataSourceFactory。

请看下面的代码:

DataSource master = new DriverManagerDataSource(driverClassName, url, username, password);
int slaveNum = 2;
List<DataSource> slaves = new ArrayList<DataSource>();
for (int i = 0; i < slaveNum; i++) {
    // 为了简单,参数与主库一致,实际情况下从库有不同的url,username,password
    slaves.add(new DriverManagerDataSource(driverClassName, url, username, password));
}
DataSourceFactory dsf = new MasterSlaveDataSourceFactory(master, slaves);
Mango mango = Mango.newInstance(dsf);

多数据源

多数据源使用MultipleDataSourceFactory和SimpleDataSourceFactory相结合。

使用多数据源,需要在@DB注解中定义dataSource参数,下面的代码使用了多数据源:

HashMap<String, DataSourceFactory> factories = new HashMap<String, DataSourceFactory>();
factories.put("dataSource1", new DriverManagerDataSource(driverClassName1, url1, username1, password1));
factories.put("dataSource2", new DriverManagerDataSource(driverClassName2, url2, username2, password2));
DataSourceFactory dsf = new MultipleDataSourceFactory(factories);
Mango mango = Mango.newInstance(dsf);

在DAO中如果要使用数据源dataSource1,只需 @DB(dataSource = "dataSource1") 即可。

多数据源读写分离

多数据源读写分离使用MultipleDataSourceFactory和MasterSlaveDataSourceFactory相结合。

请看下面的代码:

HashMap<String, DataSourceFactory> factories = new HashMap<String, DataSourceFactory>();
for (int i = 1; i <= 2; i++) {
    DataSource master = new DriverManagerDataSource(driverClassNames, urls[i], usernames[i], passwords[i]);
    int slaveNum = 2;
    List<DataSource> slaves = new ArrayList<DataSource>();
    for (int j = 0; j < slaveNum; j++) {
        // 为了简单,参数与主库一致,实际情况下从库有不同的url,username,password
        slaves.add(new DriverManagerDataSource(driverClassName, urls[i], usernames[i], passwords[i]));
    }
    DataSourceFactory dsf = new MasterSlaveDataSourceFactory(master, slaves);
    factories.put("dataSource" + i, dsf);
}
DataSourceFactory dsf = new MultipleDataSourceFactory(factories);
Mango mango = Mango.newInstance(dsf);