NutzCN Logo
问答 nutzdao分库怎么实现?
发布于 1698天前 作者 qq_a42f26f3 1636 次浏览 复制 上一个帖子 下一个帖子
标签: ssdb

mybatis可以用@Intercepts实现,由于使用了druid,由于我nutz也是druid,我想在所有执行sql的地方进行aop,然后可以参考mybatis的实现,主要是nutzdao有提供拦截所有sql的方法吗?mybatis实现代码如下:
SQLStatementParser parser = new MySqlStatementParser(sql);
// 使用Parser解析生成AST,这里SQLStatement就是AST
SQLStatement sqlStatement = parser.parseStatement();

    MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
    sqlStatement.accept(visitor);

    Map<TableStat.Name, TableStat> mapTable =  visitor.getTables();
    for (Map.Entry<TableStat.Name, TableStat> entry : mapTable.entrySet()){
        sql = sql.replace(entry.getKey().getName(), dbinstance + "."+entry.getKey().getName());
    }
    //

    metaStatementHandler.setValue("delegate.boundSql.sql", sql);
    return invocation.proceed();
4 回复

目前可以使用MyDaoInterceptor implements DaoInterceptor实现了自定义sql的部分,但是insert(对象)不知道该怎么写,代码如下:

public class MyDaoInterceptor implements DaoInterceptor {
    public void filter(DaoInterceptorChain chain) throws DaoException {
        DaoStatement st = chain.getDaoStatement();
        if (st instanceof NutPojo) {
        	NutPojo nutpojo=(NutPojo) st;
        	nutpojo.setBefore(new PojoCallback() {
				
				@Override
				public Object invoke(Connection conn, ResultSet rs, Pojo pojo, Statement stmt) throws SQLException {
					System.out.println(pojo);
					return null;
				}
			});
            // 如果是dao.insert(user)之类的操作,会进入这个分支
        } else if (st instanceof NutSql) {
        	// 如果是自定义SQL,会进入这个分支
        	Saas_tenant_app saas=SaasCache.getApp();
            Saas_tenant_app_allocate_resource res=saas.getRes().get(DynamicDataSourceHolder.db_resource_code);
            String dbinstance=res.getDatabase_name();
            
        	NutSql nutsql=(NutSql) st;
        	String sql=nutsql.getSourceSql();
        	//使用sql解析器改造sql
            // 新建 MySQL Parser
            SQLStatementParser parser = new MySqlStatementParser(sql);
            // 使用Parser解析生成AST,这里SQLStatement就是AST
            SQLStatement sqlStatement = parser.parseStatement();

            MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
            sqlStatement.accept(visitor);

            Map<TableStat.Name, TableStat> mapTable =  visitor.getTables();
            for (Map.Entry<TableStat.Name, TableStat> entry : mapTable.entrySet()){
                sql = sql.replace(entry.getKey().getName(), dbinstance + "."+entry.getKey().getName());
            }
            
            nutsql.setSourceSql(sql);
        }
        chain.doChain();//继续下一个拦截器执行
    }
}

分库的话, 是不是找shardingsphere更专业一点

后来采用这个方式解决了,有点硬

NutPojo nutpojo=(NutPojo) st;
        	EntityTableNamePItem table=(EntityTableNamePItem) nutpojo.getItem(1);
        	StringBuilder sb=new StringBuilder();
        	table.joinSql(nutpojo.getEntity(), sb);
        	
        	MyEntityTableNamePItem mytable=new MyEntityTableNamePItem();
        	mytable.setTablename(dbinstance + "."+sb.toString());
        	nutpojo.setItem(1, mytable);

额, 这个的确硬核

添加回复
请先登陆
回到顶部