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对象放入到缓存池中,而不是关闭对象。

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

(0)

相关推荐

  • JAVA8 十大新特性详解

    "Java is still not dead-and people are starting to figure that out." 本教程将用带注释的简单代码来描述新特性,你将看不到大片吓人的文字. 一.接口的默认方法 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: 复制代码 代码如下: interface Formula {    double calculate(int a); default do

  • JAVA 十六进制与字符串的转换

    toHexString public static String toHexString(int i)以十六进制的无符号整数形式返回一个整数参数的字符串表示形式. 如果参数为负,那么无符号整数值为参数加上 232:否则等于该参数.将该值转换为十六进制(基数 16)的无前导 0 的 ASCII 数字字符串.如果无符号数的大小值为零,则用一个零字符 '0' ('\u0030') 表示它:否则,无符号数大小的表示形式中的第一个字符将不是零字符.用以下字符作为十六进制数字: 0123456789abcd

  • java中File类的使用方法

    构造函数 复制代码 代码如下: public class FileDemo {     public static void main(String[] args){         //构造函数File(String pathname)         File f1 =new File("c:\\abc\\1.txt");         //File(String parent,String child)         File f2 =new File("c:\\a

  • java写入文件的几种方法分享

    一,FileWritter写入文件 FileWritter, 字符流写入字符到文件.默认情况下,它会使用新的内容取代所有现有的内容,然而,当指定一个true (布尔)值作为FileWritter构造函数的第二个参数,它会保留现有的内容,并追加新内容在文件的末尾. 1. 替换所有现有的内容与新的内容. new FileWriter(file);2. 保留现有的内容和附加在该文件的末尾的新内容. 复制代码 代码如下: new FileWriter(file,true); 追加文件示例 一个文本文件,

  • Java 正则表达式详解

    如果你不熟悉这个术语,那么"正则表达式"(Regular Expression)就是一个字符构成的串,它定义了一个用来搜索匹配字符串的模式. 正则表达式30分钟入门教程 常用正则表达式 许多语言,包括Perl.PHP.Python.JavaScript和JScript,都支持用正则表达式处理文本,一些文本编辑器用正则表达式实现高级"搜索-替换"功能.那么Java又怎样呢?本文写作时,一个包含了用正则表达式进行文本处理的Java规范需求(Specification R

  • java list用法示例详解

    |--List:元素是有序的(怎么存的就怎么取出来,顺序不会乱),元素可以重复(角标1上有个3,角标2上也可以有个3)因为该集合体系有索引,  |-- ArrayList:底层的数据结构使用的是数组结构(数组长度是可变的百分之五十延长)(特点是查询很快,但增删较慢)线程不同步  |-- LinkedList:底层的数据结构是链表结构(特点是查询较慢,增删较快)  |-- Vector:底层是数组数据结构 线程同步(数组长度是可变的百分之百延长)(无论查询还是增删都很慢,被ArrayList替代了

  • java 自己实现DataSource实现实例

    java 自己实现DataSource实现代码 DataSource 对象所表示的物理数据源的连接.作为 DriverManager 工具的替代项.DataSource能提供最高性能的对数据库的并发访问,数据源技术是Java操作数据库的一个很关键技术,流行的持久化框架都离不开数据源的应用. 数据源提供了一种简单获取数据库连接的方式,并能在内部通过一个池的机制来复用数据库连接,这样就大大减少了创建数据库连接的次数,提高了系统性能.下面,我们自己动手实现个精简的数据源,代码如下: public cl

  • java中Spring Security的实例详解

    java中Spring Security的实例详解 spring security是一个多方面的安全认证框架,提供了基于JavaEE规范的完整的安全认证解决方案.并且可以很好与目前主流的认证框架(如CAS,中央授权系统)集成.使用spring security的初衷是解决不同用户登录不同应用程序的权限问题,说到权限包括两部分:认证和授权.认证是告诉系统你是谁,授权是指知道你是谁后是否有权限访问系统(授权后一般会在服务端创建一个token,之后用这个token进行后续行为的交互). spring

  • java操作mongoDB查询的实例详解

    java操作mongo查询的实例详解 前言: MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型.Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且

  • Java实现单链表翻转实例代码

    Java实现单链表反转,递归和非递归两种形式 /** * 反转单链表 */ /** * 定义链表 * * @author 16026 * */ class Node { int val; Node next; public Node(int val) { this.val = val; } } public class ReverseList { /** * 反转链表 * * @param head * @return */ public static Node reverseList(Node

  • Java 中This用法的实例详解

     Java 中This用法的实例详解 用类名定义一个变量的时候,定义的只是一个引用,外面可以通过这个引用来访问这个类里面的属性和方法. 那们类里面是够也应该有一个引用来访问自己的属性和方法纳? 呵呵,Java提供了一个很好的东西,就是 this 对象,它可以在类里面来引用这个类的属性和方法.先来个简单的例子: public class ThisDemo { String name="Mick"; public void print(String name){ System.out.pr

  • Shell执行/调用Java/Jar程序例子的实例详解

    Shell执行/调用Java/Jar程序例子的实例详解 前言: 最近要写一个独立的Java程序去监控Hadoop和Oozie,通过Shell去调用.写代码到现在也4年多了,貌似就从来没在生产环境中写过一个独立的Java程序,不是部署到Tomcat就是直接丢给Hadoop.于是参考Hadoop等开源环境,自己写了一个demo,并且可以通过Ant打包生成可运行的程序.所以这里有三步:Java程序,Shell,Ant      1.首先建立Java程序,由于是例子,所以这里很简单,只是输出传入参数的个

  • java 中自定义OutputFormat的实例详解

    java 中 自定义OutputFormat的实例详解 实例代码: package com.ccse.hadoop.outputformat; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apa

  • Java实现LRU缓存的实例详解

    Java实现LRU缓存的实例详解 1.Cache Cache对于代码系统的加速与优化具有极大的作用,对于码农来说是一个很熟悉的概念.可以说,你在内存中new 了一个一段空间(比方说数组,list)存放一些冗余的结果数据,并利用这些数据完成了以空间换时间的优化目的,你就已经使用了cache. 有服务级的缓存框架,如memcache,Redis等.其实,很多时候,我们在自己同一个服务内,或者单个进程内也需要缓存,例如,lucene就对搜索做了缓存,而无须依赖外界.那么,我们如何实现我们自己的缓存?还

  • java中的interface接口实例详解

     java中的interface接口实例详解 接口:Java接口是一些方法表征的集合,但是却不会在接口里实现具体的方法. java接口的特点如下: 1.java接口不能被实例化 2.java接口中声明的成员自动被设置为public,所以不存在private成员 3.java接口中不能出现方法的具体实现. 4.实现某个接口就必须要实现里面定义的所有方法. 接下来看一个实现接口的案例: package hello;   interface competer{ //定义接口 void set_comp

  • java发送email一般步骤(实例讲解)

    java发送email一般步骤 一.引入javamail的jar包: 二.创建一个测试类,实现将要发送的邮件内容写入到计算机本地,查看是否能够将内容写入: public static void main(String[] args) throws Exception { // 1. 创建一封邮件 Properties props = new Properties(); // 用于连接邮件服务器的参数配置(发送邮件时才需要用到) Session session= Session.getDefaul

随机推荐