为vert x框架添加druid连接池支持

vert.x

vert.x是一个优秀的,领先的,快速更新的异步网络服务框架,可以支持tcp/udp/http等多种网络服务,功能强大,性能优越。

vert.x官网

vert.x框架支持多种语言,包括java,javascript,groovy,ruby等,在此处采用java语言。

vert.x从来不吝于支持最先进的技术,比如最新的vert.x已经充分支持了java8的各种特性。代码风格很接近node.js。简洁有效。

异步框架的通病在于回调地狱,相比于node.js的promise等方案,vert.x也提供了类似的方案,更可以采用协程的方式一劳永逸的解决回调地狱,同时享受更好的性能。

解析

vert.x默认采用的数据库连接池是c3p0连接池。由阿里巴巴提供的druid连接池无疑是现在可用的最优秀的免费连接池之一,同时也是为了和其它项目保持同步,以及c3p0的一些坑。决定换用druid连接池。

可是vert.x并没有提供druid连接池的支持,在官方的文档上对于连接池也是语焉不详,于是一怒之下clone源码来看。

在vert-jdbc-client项目下,我不出意料的找到了这么一句话:

String DEFAULT_PROVIDER_CLASS =  "io.vertx.ext.jdbc.spi.impl.C3P0DataSourceProvider";
复制代码

然后在实现类中找到了这么一段:

String providerClass = config.getString("provider_class");
        if (providerClass == null) {
          providerClass = DEFAULT_PROVIDER_CLASS;
        }
复制代码

可见在这里通过配置provider_class可以指定一个数据源。那么下一步就是仿照着C3P0DataSourceProvider来实现一个provider咯。

public interface DataSourceProvider {

  int maximumPoolSize(DataSource dataSource, JsonObject config) throws SQLException;

  DataSource getDataSource(JsonObject config) throws SQLException;

  void close(DataSource dataSource) throws SQLException;
}
复制代码

我们需要实现的就是这么一个接口,其实关键的就在于getDataSource这么一个方法。

实现

druid的数据源入口是DruidDataSource。我们需要在getDataSource方法中根据参数配置一个数据源并返回。

druid的配置参数还是很多的,一个个去判断十分麻烦,这里采用了一个偷懒的方法,用反射的方式去调用set方法来设置参数。

需要注意的是在反射调用中,Integer类型和int类型是不能通用的两个类型,也就是说没有自动装箱一类的机制。所以需要对配置中涉及到的几个基本变量做一下判断和处理。否则会导致无法正确找到set方法并复制.

@Override
    public DataSource getDataSource(JsonObject config) throws SQLException {
        DruidDataSource ds = new DruidDataSource();
        Method[] methods = DruidDataSource.class.getMethods();
        Map<String,Method> methodmap = new HashMap<>();
        for (Method method : methods) {
            methodmap.put(method.getName(),method);
        }

        for (Map.Entry<String, Object> entry : config) {
            String name = entry.getKey();

            if ("provider_class".equals(name)) {
                continue;
            }

            String mName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);

            try {
                Class paramClazz = entry.getValue().getClass();
                if(paramClazz.equals(Integer.class)){
                    paramClazz = int.class;
                }else if(paramClazz.equals(Long.class)){
                    paramClazz = long.class;
                }else if(paramClazz.equals(Boolean.class)){
                    paramClazz = boolean.class;
                }
                Method method = DruidDataSource.class.getMethod(mName, paramClazz);
                method.invoke(ds, entry.getValue());
            } catch (NoSuchMethodException e) {
                logger.warn("no such method:" + mName);
                System.out.println(entry.getValue().getClass());
                );
            } catch (InvocationTargetException | IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }
        return ds;
    }

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值