自己手写数据库连接池和 SpringData - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
gexyuzz
V2EX    Java

自己手写数据库连接池和 SpringData

  •  
  •   gexyuzz Jun 23, 2017 4482 views
    This topic created in 3232 days ago, the information mentioned may be changed or developed.

    GitHub : 传送门

    实际开发中最常用到连接池,连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。连接池的出现可以减少资源的频繁请求和释放。

    连接池实现的核心就是:当用户关闭连接时,我们把连接返回到池中,好使其他线程使用,而并非真正的关闭。 从这个角度分析,我们只需要重写连接的 close 方法,就可以实现一个简单的连接池。可以使用包装设计模式或者是代理模式,重写 close 方法即可。
    但是包装设计模式需要重写所有的类,比较麻烦,所以我使用的是代理模式。(具体代码可以参考cn.xiuyu.pool
    GitHub 地址:传送门

    Spring Data 是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持 map-reduce 框架和云计算数据服务。

    当 spring data 与 jpa 子项目一起使用时只需要写一个 dao 接口,继承一个 jparepository 接口。spring data 就会自动帮你生成一个代理 dao 类,并自动生成 sql 语句运行并返回结果,当有复杂操作时在方法上面添加 @Query 注解 就可以自动 sql 语句。这也是我实现的核心。

    仿照 spring data 实现了自动生成代理类,支持简单的 CURD,分页,和一些自定的复杂查询

    如何使用?

    写一个 UserResponse 类,将 UserRespons 继承Repository,再一个实体类 User 用于封装数据,然后在测试类使用ResponseFactory.getInstance()获取 ResponseFactory 的工厂实例,然后再使用工厂方法createResponse创建 dao 代理对象,然后就可以进行快乐的操作了.(这也是我设计不合理的地方,很狗血,这也是我不想继续写下去的原因)

    UserResponse 类
    public interface UserResponse extends Repository<User>{ @Delete("delete from user where id=?") public void deletebyid(int id); @Query("from User where id=?") public User QuerybyID(int id); @Updata("update user set name=?,password=? where id=?") public void updatebyID(String name,String password,int id); } 
    封装的方法使用
     public class TestOrm { //获取代理的类和封装的实体类 ResponseFactory factory = ResponseFactory.getInstance(); UserResponse createRespOnse= factory.createResponse(UserResponse.class, User.class); @Test //添加用户 public void add() throws Exception{ for(int i=0;i<100;i++){ User u = new User(i+"",i+"张三","123123"); createResponse.insert(u); } } @Test //更新用户 public void update() throws Exception{ User u = new User("1","1","1"); createResponse.update(u); } @Test //删除用户 public void delete() throws Exception{ createResponse.delete(1); } @Test //查询用户 public void query() throws Exception{ User u = createResponse.query(1); System.out.println(u); } @Test //获取总数 public void count() throws SQLException{ System.out.println(createResponse.Querycount()); } @Test //分页 public void page() throws InstantiationException, IllegalAccessException, SQLException{ //从第 0 叶开始查询 查询 3 页 PageEntity<User> queryBypage = createResponse.QueryBypage(new PageEntity<User>(0, 3)); List<User> entity = queryBypage.getEntity(); System.out.println(entity.size()); for(User u:entity){ System.out.println(u); } } @Test //通过 @Query 注解查询 public void querybysql() { User querybyID = createResponse.QuerybyID(2); System.out.println(querybyID); } @Test //通过 @Delete 注解删除 public void deletebysql(){ createResponse.deletebyid(1); } @Test //通过 @Update 注解更新 public void updatebysql(){ createResponse.updatebyID("123", "123", 2); } } 

    我的其他系列文章

    自己手写 springmvc:传送门

    jvm 虚拟机系列 :传送门

    SpringIOC 源码分析系列文章 :传送门

    SpringAOP 源码分析细类文章:传送门

    当然还有我的小博客 :传送门打一波广告(逃

    10 replies    2017-06-27 06:42:45 +08:00
    lzhr
        1
    lzhr  
       Jun 23, 2017
    gexyuzz
        2
    gexyuzz  
    OP
       Jun 23, 2017
    @lzhr 一直自用来看坑王驾到(逃
    gogohigh
        3
    gogohigh  
       Jun 25, 2017
    简单看了下
    1. useconn 只加不减,useconn>max_pool_size 后,每次 getConn 都会扩容 pool
    2. getConn 后调用 abort 之后获取的连接都是 close 的,这里要加判断
    gogohigh
        4
    gogohigh  
       Jun 25, 2017
    3l 的第一条没问题,刚刚没仔细看,嘿嘿。 话说为什么不直接用 pool.size 判断呢?
    gogohigh
        5
    gogohigh  
       Jun 25, 2017
    = = 夜里脑子不好使,忽略 4l poolsize 那个
    gexyuzz
        6
    gexyuzz  
    OP/div>
       Jun 25, 2017
    @gogohigh 如果是调用 close,连接就是回到池中的。
    gogohigh
        7
    gogohigh  
       Jun 26, 2017
    @gexyuzz 调用 abort 呢?
    gexyuzz
        8
    gexyuzz  
    OP
       Jun 26, 2017
    @gogohigh Connection 接口和他的父接口 Wrapper 并没有声明这个方法。
    gexyuzz
        9
    gexyuzz  
    OP
       Jun 26, 2017
    @gogohigh 刚刚看了下,接口没有声明,但是有确实有那个方法。如果你有需求可以重写一下,让连接返回池中,或者是真正的关闭。
    sagaxu
        10
    sagaxu  
       Jun 27, 2017 via Android
    接手过一个轮子很多的项目,慢慢的把轮子都替换成主流库,太 tm 坑了,质量太差,还没文档。你们见过连 md5 和 base64 编码都要自己造轮子的项目吗?哦,连 json 都要自己轮一下。
    About     Help     Advertise     Blog     API     FAQ     Solana     3396 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 42ms UTC 10:53 PVG 18:53 LAX 03:53 JFK 06:53
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86