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对象放入到缓存池中,而不是关闭对象。
分享到:
相关推荐
下面,我们自己动手实现了一个精简的数据源,代码如下: public class MyDataSource { private LinkedList<Connection> connectionPool = new LinkedList(); public MyDataSource() { for (int i = 0; i ; i++)...
在IT行业中,Spring Boot 和 ...建议参考这些资源,结合本文的解释,动手实践以更好地理解和掌握多数据源配置。如果在实践过程中遇到问题,可以访问原作者纯洁的微笑的博客(http://www.ityouknow.com/)寻找更多帮助。
本教程旨在带领大家深入了解SpringBoot的工作原理,并尝试自己动手实现一个简易的SpringBoot框架。通过这个过程,我们将深入理解Spring Boot的核心组件和设计理念,提升我们的编程技艺。 一、SpringBoot概述 ...
这个"手写Spring IOC注解实现版本"项目旨在帮助我们深入理解Spring框架的工作原理,通过实际动手实现来增强对IoC容器和注解驱动编程的理解。 在Spring中,IOC意味着应用程序不再直接创建对象,而是将对象的创建和...
在“看书写的小例子”这个压缩包中,我们聚焦于JAVA编程的学习,它是一个逐步深入、从基础到高级的教程。这个资源包含了作者为《JAVA从入门到精通》一书精心编写的示例代码和练习题,旨在帮助读者通过实践掌握JAVA...
学习JDBC包括理解DataSource、Connection、Statement和ResultSet等核心概念,以及如何处理事务和异常。 SQL,即结构化查询语言,是用于管理关系数据库的标准化语言。在JavaWeb实例中,开发者会遇到如何编写SQL语句...
自己动手! 这是标准的像素跟踪类型的应用程序。 有关指示; 部署,使用和查看此应用程序收集的数据,请参阅下文。 部署要求 JDK 16(或Docker) Oracle19c 部署方式 有关如何部署应用程序的步骤。 JVM参数: --...
在移动应用开发中,数据可视化是一项重要的功能,它能够帮助用户直观地理解复杂的数据信息。Smobiler是一款针对移动平台...记住,实践是检验理解和掌握新知识的最好方式,尝试自己动手实现一个功能齐全的Bar Chart吧!
因此,为了弥补这一空白,MyBatis社区决定自己动手,创建了一个名为MyBatis-Spring的小型库,旨在为Spring和MyBatis之间搭建桥梁。 **关键特点:** - **简化配置**:减少用户配置MyBatis和Spring环境所需的样板...
SpringBoot与MyBatis整合详解 在现代Java开发中,SpringBoot因其简化配置、快速启动的优势,成为构建应用的首选...现在,你已经了解了如何在SpringBoot项目中使用XML配置方式整合MyBatis,可以尝试自己动手实践一下。
**JDBC(Java Database Connectivity)**是Java编程语言中用于与数据库交互的一种接口规范,它由Sun Microsystems开发并随Java SDK发布。JDBC提供了一种标准的API...记得动手实践,结合理论和实例,将知识转化为技能。
SpringBoot的整合项目通常涉及到将各种技术组件与SpringBoot框架集成,以构建高效、便捷的Web应用程序。...通过理解并动手操作,可以深入掌握SpringBoot的自动化配置、数据访问以及RESTful API设计等核心概念。
JavaWeb是Java技术在Web开发中的应用,涵盖了Servlet、JSP、JSTL、Filter、Listener等核心概念。...同时,实践操作是提高技能的最佳途径,因此,不仅要理解和记忆知识点,更要动手实践,解决实际问题。
在Java应用服务器中,JNDI(Java Naming and Directory Interface)是一种标准接口,用于查找和绑定数据源、EJB、邮件会话等服务。...记住,实践是检验理论的最好方式,动手操作才能真正掌握这个技能。
Java Web是一种基于Java技术的Web应用开发平台,它允许开发者创建动态、交互式的网页应用程序。这个案例涵盖了登录功能...对于初学者来说,理解并动手实践这个案例可以帮助他们深入理解Java Web开发的核心概念和技术。
在iOS开发中,轮播图(Carousel)是一种常见的UI组件,用于展示一系列的图片或内容,用户可以通过滑动实现内容的切换。本压缩包提供的资源包括了两种...记得尝试修改代码,添加自己的功能,以加深理解并提升动手能力。
ASP.NET是微软公司开发的一种用于构建Web应用程序的框架,它基于.NET ...为了深入了解并从中学习,你需要打开文件,查看代码,理解每个部分的功能,并尝试自己动手实践。这将帮助你巩固理论知识,并提升实际开发技能。
MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。在本案例中,我们将深入探讨如何使用MyBatis进行数据库的增删...但这个基础案例已经涵盖了MyBatis的核心概念,为你提供了动手实践的基础。
Spring JDBC是Spring框架的一部分,它提供了一种抽象层,使得开发者可以更方便地使用Java数据库连接(JDBC)来操作数据库。...记得动手实践,将理论知识与实际代码结合起来,这将有助于巩固你的技能。