全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java 自己实现DataSource实现实例

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 


相关文章: 如何用y主机助手快速搭建网站?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  微信网站制作公司有哪些,民生银行办理公司开户怎么在微信网页上查询进度?  ,购物网站怎么盈利呢?  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  如何用西部建站助手快速创建专业网站?  建站之星如何实现网站加密操作?  网站企业制作流程,用什么语言做企业网站比较好?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  宝塔新建站点为何无法访问?如何排查?  建站之星安装模板失败:服务器环境不兼容?  如何高效配置IIS服务器搭建网站?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  建站168自助建站系统:快速模板定制与SEO优化指南  焦点电影公司作品,电影焦点结局是什么?  如何通过商城自助建站源码实现零基础高效建站?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  如何快速查询域名建站关键信息?  建站之星伪静态规则如何设置?  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站之星如何优化SEO以实现高效排名?  如何在Golang中指定模块版本_使用go.mod控制版本号  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  宝塔面板创建网站无法访问?如何快速排查修复?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何在景安云服务器上绑定域名并配置虚拟主机?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  如何选择靠谱的建站公司加盟品牌?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  ,怎么用自己头像做动态表情包?  建站之星如何开启自定义404页面避免用户流失?  图册素材网站设计制作软件,图册的导出方式有几种?  建站之星五站合一营销型网站搭建攻略,流量入口全覆盖优化指南  网站代码制作软件有哪些,如何生成自己网站的代码?  平台云上自助建站如何快速打造专业网站?  如何制作算命网站,怎么注册算命网站?  沈阳制作网站公司排名,沈阳装饰协会官方网站?  定制建站哪家更专业可靠?推荐榜单揭晓  攀枝花网站建设,攀枝花营业执照网上怎么年审?  如何在腾讯云免费申请建站?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  c++ stringstream用法详解_c++字符串与数字转换利器  广州商城建站系统开发成本与周期如何控制?  建站之星×万网:智能建站系统+自助建站平台一键生成  如何在企业微信快速生成手机电脑官网?  开封网站制作公司,网络用语开封是什么意思?  如何实现建站之星域名转发设置? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。