全网整合营销服务商

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

免费咨询热线: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 


相关文章: 宝塔建站助手安装配置与建站模板使用全流程解析  定制建站哪家更专业可靠?推荐榜单揭晓  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  建站为何优先选择香港服务器?  如何通过.red域名打造高辨识度品牌网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何配置IIS站点权限与局域网访问?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  公司门户网站制作流程,华为官网怎么做?  如何快速查询网址的建站时间与历史轨迹?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  c# F# 的 MailboxProcessor 和 C# 的 Actor 模型  建站之星如何快速生成多端适配网站?  建站主机是否属于云主机类型?  如何挑选优质建站一级代理提升网站排名?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  在线制作视频网站免费,都有哪些好的动漫网站?  如何获取开源自助建站系统免费下载链接?  如何通过建站之星自助学习解决操作问题?  如何通过老薛主机一键快速建站?  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  韩国服务器如何优化跨境访问实现高效连接?  正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  深圳网站制作的公司有哪些,dido官方网站?  建站之星后台密码遗忘或太弱?如何重置与强化?  5种Android数据存储方式汇总  大连网站设计制作招聘信息,大连投诉网站有哪些?  宁波免费建站如何选择可靠模板与平台?  台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?  建站之星导航如何优化提升用户体验?  如何用VPS主机快速搭建个人网站?  如何在阿里云ECS服务器部署织梦CMS网站?  建站之星后台密码遗忘如何找回?  简单实现Android验证码  TestNG的testng.xml配置文件怎么写  建站之星如何修改网站生成路径?  定制建站流程解析:需求评估与SEO优化功能开发指南  建站之星代理如何优化在线客服效率?  浅谈Javascript中的Label语句  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  建站与域名管理如何高效结合?  安云自助建站系统如何快速提升SEO排名?  ,怎么用自己头像做动态表情包?  如何选择网络建站服务器?高效建站必看指南  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  建站之星安装路径如何正确选择及配置?  如何高效完成独享虚拟主机建站? 

您的项目需求

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