`
xm_king
  • 浏览: 395340 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
Group-logo
Spring技术内幕读书笔...
浏览量:15658
社区版块
存档分类
最新评论

自己动手写DataSource

    博客分类:
  • JAVA
阅读更多

       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);
	}
}
 
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:

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实现实例

    下面,我们自己动手实现了一个精简的数据源,代码如下: public class MyDataSource { private LinkedList&lt;Connection&gt; connectionPool = new LinkedList(); public MyDataSource() { for (int i = 0; i ; i++)...

    springboot+mybatis多数据源配置下载

    在IT行业中,Spring Boot 和 ...建议参考这些资源,结合本文的解释,动手实践以更好地理解和掌握多数据源配置。如果在实践过程中遇到问题,可以访问原作者纯洁的微笑的博客(http://www.ityouknow.com/)寻找更多帮助。

    手写springboot

    本教程旨在带领大家深入了解SpringBoot的工作原理,并尝试自己动手实现一个简易的SpringBoot框架。通过这个过程,我们将深入理解Spring Boot的核心组件和设计理念,提升我们的编程技艺。 一、SpringBoot概述 ...

    手写SpringIOC注解实现版本

    这个"手写Spring IOC注解实现版本"项目旨在帮助我们深入理解Spring框架的工作原理,通过实际动手实现来增强对IoC容器和注解驱动编程的理解。 在Spring中,IOC意味着应用程序不再直接创建对象,而是将对象的创建和...

    看书写的小例子

    在“看书写的小例子”这个压缩包中,我们聚焦于JAVA编程的学习,它是一个逐步深入、从基础到高级的教程。这个资源包含了作者为《JAVA从入门到精通》一书精心编写的示例代码和练习题,旨在帮助读者通过实践掌握JAVA...

    自己用滴javaWeb实例

    学习JDBC包括理解DataSource、Connection、Statement和ResultSet等核心概念,以及如何处理事务和异常。 SQL,即结构化查询语言,是用于管理关系数据库的标准化语言。在JavaWeb实例中,开发者会遇到如何编写SQL语句...

    progress-tracker

    自己动手! 这是标准的像素跟踪类型的应用程序。 有关指示; 部署,使用和查看此应用程序收集的数据,请参阅下文。 部署要求 JDK 16(或Docker) Oracle19c 部署方式 有关如何部署应用程序的步骤。 JVM参数: --...

    Smobiler实现barchart源码

    在移动应用开发中,数据可视化是一项重要的功能,它能够帮助用户直观地理解复杂的数据信息。Smobiler是一款针对移动平台...记住,实践是检验理解和掌握新知识的最好方式,尝试自己动手实现一个功能齐全的Bar Chart吧!

    mybatis-spring中文配置

    因此,为了弥补这一空白,MyBatis社区决定自己动手,创建了一个名为MyBatis-Spring的小型库,旨在为Spring和MyBatis之间搭建桥梁。 **关键特点:** - **简化配置**:减少用户配置MyBatis和Spring环境所需的样板...

    springbootmybaties.zip

    SpringBoot与MyBatis整合详解 在现代Java开发中,SpringBoot因其简化配置、快速启动的优势,成为构建应用的首选...现在,你已经了解了如何在SpringBoot项目中使用XML配置方式整合MyBatis,可以尝试自己动手实践一下。

    jdbc和xml培训文档

    **JDBC(Java Database Connectivity)**是Java编程语言中用于与数据库交互的一种接口规范,它由Sun Microsystems开发并随Java SDK发布。JDBC提供了一种标准的API...记得动手实践,结合理论和实例,将知识转化为技能。

    SbringBoot的整合项目

    SpringBoot的整合项目通常涉及到将各种技术组件与SpringBoot框架集成,以构建高效、便捷的Web应用程序。...通过理解并动手操作,可以深入掌握SpringBoot的自动化配置、数据访问以及RESTful API设计等核心概念。

    JavaWeb课后习题1-8章(选择、填空、判断、简答)

    JavaWeb是Java技术在Web开发中的应用,涵盖了Servlet、JSP、JSTL、Filter、Listener等核心概念。...同时,实践操作是提高技能的最佳途径,因此,不仅要理解和记忆知识点,更要动手实践,解决实际问题。

    在tomcat6.0.18下手动配置jndi

    在Java应用服务器中,JNDI(Java Naming and Directory Interface)是一种标准接口,用于查找和绑定数据源、EJB、邮件会话等服务。...记住,实践是检验理论的最好方式,动手操作才能真正掌握这个技能。

    java web案例

    Java Web是一种基于Java技术的Web应用开发平台,它允许开发者创建动态、交互式的网页应用程序。这个案例涵盖了登录功能...对于初学者来说,理解并动手实践这个案例可以帮助他们深入理解Java Web开发的核心概念和技术。

    ios自动轮播实现,分为左右轮播和上下轮播

    在iOS开发中,轮播图(Carousel)是一种常见的UI组件,用于展示一系列的图片或内容,用户可以通过滑动实现内容的切换。本压缩包提供的资源包括了两种...记得尝试修改代码,添加自己的功能,以加深理解并提升动手能力。

    asp.net代码练习 work021

    ASP.NET是微软公司开发的一种用于构建Web应用程序的框架,它基于.NET ...为了深入了解并从中学习,你需要打开文件,查看代码,理解每个部分的功能,并尝试自己动手实践。这将帮助你巩固理论知识,并提升实际开发技能。

    mybatis增删改查案例

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在本案例中,我们将深入探讨如何使用MyBatis进行数据库的增删...但这个基础案例已经涵盖了MyBatis的核心概念,为你提供了动手实践的基础。

    spring jdbc 实例源码

    Spring JDBC是Spring框架的一部分,它提供了一种抽象层,使得开发者可以更方便地使用Java数据库连接(JDBC)来操作数据库。...记得动手实践,将理论知识与实际代码结合起来,这将有助于巩固你的技能。

Global site tag (gtag.js) - Google Analytics