java 自己实现DataSource实现实例

发布时间 - 2026-01-11 01:07:33    点击率:

java 自己实现DataSource实现代码

  DataSource 对象所表示的物理数据源的连接。作为 DriverManager 工具的替代项。DataSource能提供最高性能的对数据库的并发访问,数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用。

         数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少了创建数据库连接的次数,提高了系统性能。下面,我们自己动手实现个精简的数据源,代码如下:

public class MyDataSource { 
  private LinkedList<Connection> connectionPool = new LinkedList<Connection>(); 
 
  public MyDataSource() { 
    for (int i = 0; i < 10; i++) { 
      connectionPool.add(new MyConnection(creatConnection(),this)); 
    } 
  } 
  private Connection creatConnection() { 
    try { 
      return DriverManager.getConnection( 
          "jdbc:mysql://localhost:3306/test", "root", "root"); 
    } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      throw new ExceptionInInitializerError(); 
    } 
  } 
   
  public Connection getConnection(){ 
    System.out.println(connectionPool.size()); 
    return connectionPool.removeFirst(); 
  } 
   
  public void freeConnection(Connection conn){ 
    System.out.println("DataSource Close Connection"); 
    connectionPool.addLast(conn); 
  } 
} 
 

Java代码 

public class MyConnection implements Connection{ 
  private Connection connection; 
  private MyDataSource datasource; 
  public Connection getConnection() { 
    return connection; 
  } 
 
  public void setConnection(Connection connection) { 
    this.connection = connection; 
  } 
 
  public MyConnection(Connection realconnection,MyDataSource datasource){ 
    this.connection=realconnection; 
    this.datasource=datasource; 
  } 
   
  @Override 
  public void close() throws SQLException { 
    // TODO Auto-generated method stub 
    System.out.println("MyConnection Close"); 
    datasource.freeConnection(this); 
  } 
  ... 
} 

        我们通过DataSource获得的Connection是经过包裹后的对象,这里应用到了代理模式。下面我们使用jdk的动态代理来改写MyDataSource:

Java代码

public class MyDataSource { 
  private LinkedList<Connection> connectionPool = new LinkedList<Connection>(); 
 
  public MyDataSource() { 
    for (int i = 0; i < 10; i++) { 
      connectionPool.add(GetProxy(creatConnection())); 
    } 
  } 
 
  private Connection GetProxy(final Connection connection) { 
    // TODO Auto-generated method stub 
    return (Connection)Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class[]{Connection.class}, new InvocationHandler(){ 
      @Override 
      public Object invoke(Object proxy, Method method, Object[] args) 
          throws Throwable { 
        // TODO Auto-generated method stub 
        Object value; 
        if(method.getName().equalsIgnoreCase("close")){ 
          connectionPool.addLast((Connection)proxy); 
          System.out.println(connectionPool.size()); 
          return null; 
        }else{ 
          value=method.invoke(connection, args); 
        } 
        System.out.println(connectionPool.size()); 
        return value; 
      } 
       
    }); 
     
  } 
 
  private Connection creatConnection() { 
    try { 
      return DriverManager.getConnection( 
          "jdbc:mysql://localhost:3306/test", "root", "root"); 
    } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      throw new ExceptionInInitializerError(); 
    } 
  } 
   
  public Connection getConnection(){ 
    System.out.println(connectionPool.size()); 
    return connectionPool.removeFirst(); 
  } 
   
  public void freeConnection(Connection conn){ 
    System.out.println("DataSource Close Connection"); 
    connectionPool.addLast(conn); 
  } 
} 

       通过这种方式获得的Connection是通过jdk的动态代理生成的一个代理对象,该代理对象实现了Connection接口。

       以上两种方式实现了我们自己的DataSource,在我们通过DataSource获得的Connection对象的close方法都已经被改写过了。在Connection对象调用close方法时,会将该Connection对象放入到缓存池中,而不是关闭对象。

       感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # DataSource  # DataSource自己实现  # Springboot mybatis plus druid多数据源解决方案 dynamic-data  # Spring Boot 自定义数据源DruidDataSource代码  # 详解spring cloud config实现datasource的热部署  # 浅谈利用Spring的AbstractRoutingDataSource解决多数据源的问题  # 详解利用Spring的AbstractRoutingDataSource解决多数据源的问题  # Spring(AbstractRoutingDataSource)实现动态数据源切换示例  # 使用Spring的AbstractRoutingDataSource实现多数据源切换示例  # 如何在MyBatis中实现DataSource  # 自己的  # 实现了  # 过了  # 两种  # 希望能  # 谢谢大家  # 并能  # 将该  # 自己动手  # 池中  # 复用  # 在内部  # 而不是  # 提高了  # 减少了  # return  # creatConnection  # jdbc  # getConnection  # int 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何有效防御Web建站篡改攻击?  Python3.6正式版新特性预览  实例解析angularjs的filter过滤器  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  焦点电影公司作品,电影焦点结局是什么?  php做exe能调用系统命令吗_执行cmd指令实现方式【详解】  如何获取PHP WAP自助建站系统源码?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】  如何用西部建站助手快速创建专业网站?  Laravel如何配置Horizon来管理队列?(安装和使用)  Java遍历集合的三种方式  如何在IIS7中新建站点?详细步骤解析  微信h5制作网站有哪些,免费微信H5页面制作工具?  常州企业网站制作公司,全国继续教育网怎么登录?  重庆市网站制作公司,重庆招聘网站哪个好?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  nginx修改上传文件大小限制的方法  长沙企业网站制作哪家好,长沙水业集团官方网站?  长沙做网站要多少钱,长沙国安网络怎么样?  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  linux写shell需要注意的问题(必看)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Laravel如何为API生成Swagger或OpenAPI文档  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  如何做网站制作流程,*游戏网站怎么搭建?  教你用AI润色文章,让你的文字表达更专业  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  如何在腾讯云免费申请建站?  bing浏览器学术搜索入口_bing学术文献检索地址  php 三元运算符实例详细介绍  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  javascript中的数组方法有哪些_如何利用数组方法简化数据处理  SQL查询语句优化的实用方法总结  Laravel API资源类怎么用_Laravel API Resource数据转换  个人摄影网站制作流程,摄影爱好者都去什么网站?  Laravel如何使用Blade组件和插槽?(Component代码示例)  如何利用DOS批处理实现定时关机操作详解  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何为不同团队 ID 动态生成多个“认领值班”按钮  Laravel怎么连接多个数据库_Laravel多数据库连接配置  Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验