`

简单数据源演示示例,基于设计模式

    博客分类:
  • Java
阅读更多

声明:以下只是个人的一些理解,并非正确,仅供借鉴参考。

数据库的操作是开发中经常会碰见的一个问题,对于刚刚开始学习JAVA的朋友来说,可能对于数据源、连接池这些概念还不熟悉,本文主要是通过一个简单的示例,帮助大家认识这些东西,当然本文的一些观点并不一定完全正确,仅做参考。下面下介绍下连接池,连接池的目的主要是为了解决重复、频繁地创建数据库连接,解决一些资源与效果方面的问题。建立数据库连接就好比是在一条河上建一座桥,数据的传输就好比是桥建成后,交通工具借助其的使用。由此看来,建立数据库连接的成本是比较高的。建立数据库连接池主要是事先先建立一堆连接放入连接池中,就好比先建好几座桥,然后具体要用数据库连接的时候便可以去连接池中取,就好比要用的时候去选一座桥到河的另一岸。不知道绕来绕去绕了半天大家是否对连接池有了初步的一些认识。而我这里所谓的数据源其实也就是对于这一系列机制及操作的一种封装。

 

以下是核心代码部分,其实实现写的比较简单,同时对SimpleConnection类也省略了部分代码,需要的朋友可以点击下载工程。这里主要是做一个简单的演示,便于刚学习的朋友能够快速了解。同时,在SimpleConnection类中也使用了代理模式,在JdbcUtils类中使用了单例模式,希望对于大家认识设计模式也有所帮助。大家可以点击下载工程,工程的使用方法是解压,直接导入Myeclipse即可使用,Global类中,是对于一些全局量的定义,方便演示,所以也并没有采取读配置文件的方式实现。也可点击http://sites.google.com/site/gwikimo/ 进行下载。

(1)数据源,主要是实现了连接池的功能,因为在池中对于连接的存取操作比较频繁,所以在此使用了LinkedList实现,相对来说效率 上应该优于ArrayList

 

package org.wiki.datasource.core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.LinkedList;

import org.wiki.datasource.global.Global;

/**
 * 数据源核心类,用于对于数据库连接的管理
 * @author Wiki.M
 * @version 0.1
 */
public class SimpleDataSource {
	
	//初始化数据源连接数
	private int initCount = Global.INIT_COUNT;
	
	//数据源最大连接数数
	private int maxCount = Global.MAX_COUNT;
	
	//数据源当前存在的链接数
	private int currentCount = 0;
	
	//创建连接池对象示例
	private LinkedList<Connection> connectionPool = new LinkedList<Connection>();
	
	/**
	 * 默认构造方法,初始化连接池
	 */
	public SimpleDataSource(){
		try {
			initConnction();
		} catch (SQLException e) {
			e.printStackTrace();
			//初始化失败
			throw new ExceptionInInitializerError(e);
		}
	}
	
	/**
	 * 创建数据库链接
	 * @return 返回Connection类型
	 * @throws SQLException 数据库异常类
	 */
	private Connection createConnection() throws SQLException{
		return new SimpleConnection(DriverManager.getConnection(Global.URL, Global.USER_NAME, Global.PASSWORD),this);
	}
	
	/**
	 * 初始化连接,根据初始连接数,创建多个连接放入连接池
	 * 即放入一个LinkedList对象中
	 * @throws SQLException 数据库异常类
	 */
	private void initConnction() throws SQLException{
		for(int i = 0;i < initCount;i++){
			connectionPool.add(createConnection());
			currentCount++;
		}
	}
	
	/**
	 * 获取数据源连接池中的连接
	 * @return 返回Connection类型
	 * @throws SQLException 数据库异常类
	 * @throws InterruptedException 异常类
	 */
	public Connection getConnection() throws SQLException, InterruptedException{
		//锁定连接池对象,防止多线程操作时产生的错误
		synchronized(connectionPool){
			//当连接池中还有连接时
			if(connectionPool.size() > 0){
				return connectionPool.removeFirst();//默认从LinkedList头部取连接对象
			}else if(currentCount < maxCount){
				//当连接池中连接已用完,但当前连接数仍没超过允许的最大连接数时
				return createConnection();
			}else {
				//除以上两种情况外抛出异常
				throw new SQLException("连接已用完。。。");
			}
		}
	}
	
	/**
	 * 释放连接资源
	 * @param conn 数据库连接Connection
	 * @param st Statement对象实例
	 * @param rs ResultSet对象
	 */
	public void free(Connection conn,Statement st,ResultSet rs){
		free(conn);
		try{
			if(null != st) st.close();
		}catch(SQLException e){
			e.printStackTrace();
		}finally{
			try{
				if(null != rs) rs.close();
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 释放连接,即将当前连接放回连接池中
	 * @param conn Connection对象实例
	 */
	public void free(Connection conn){
		connectionPool.addLast(conn);//默认放入LinkedList尾部
	}
}

 (2)自定义Connection实现,写这个类的用途已在类说明中注明

package org.wiki.datasource.core;

import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;

/**
 * 自定义Connection的实现,
 * 主要为解决利用Connection的close()方法释放连接时将当前连接放回连接池而非关闭连接
 * 基于代理模式实现,持有realConnection真实连接与dataSource数据源对象,实现了对
 * 真实连接的代理
 * @author Wiki.M
 * @version 0.1
 */
public class SimpleConnection implements Connection{

	//真实连接对象
	private Connection realConnection;
	
	//数据源对象
	private SimpleDataSource dataSource;
	
	/**
	 * 有参构造方法
	 * @param realConnection 真实连接对象实例
	 * @param dataSource 数据源对象
	 */
	public SimpleConnection(Connection realConnection,SimpleDataSource dataSource){
		this.realConnection = realConnection;
		this.dataSource = dataSource;
	}
	
	/**
	 * 实现了对连接对象的释放
	 */
	public void close() throws SQLException {
		System.out.println("SimpleConnection close()....");
		dataSource.free(this);
	}

}

 (3)JDBC数据库操作工具类

package org.wiki.datasource.utils;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.wiki.datasource.core.SimpleDataSource;
import org.wiki.datasource.global.Global;

/***
 * JDBC工具类,用于数据库相关操作,采用单例模式实现
 * @author Wiki.M
 * @version 0.1
 */
public class JdbcUtils {
	
	private static JdbcUtils jdbcUtils = null;//JDBC用户类实例对象
	
	private static SimpleDataSource sds = null;

	/**
	 * 加载数据库驱动,初始化连接数据库的相关属性。
	 */
	static {
		try {
			//加载数据库驱动
			Class.forName(Global.DATABASE_DRIVER);
			//创建数据源
			sds = new SimpleDataSource();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError(e);
		}
	}

	/**
	 * 私有构造方法,
	 * 防止new JdbcUtils()方式创建对象
	 */
	private JdbcUtils() {
	}

	/**
	 * 获取JdbcUtils对象示例,单例
	 * @return 返回JdbcUtils对象实例
	 */
	public static JdbcUtils getInstance() {
		if (jdbcUtils == null) {
			//锁定当前对象,防止多线程操作时创建多个对象
			synchronized (JdbcUtils.class) {
				if (jdbcUtils == null) {
					jdbcUtils = new JdbcUtils();
					return jdbcUtils;
				}
			}
		}
		return jdbcUtils;
	}

	/**
	 * 创建数据库连接
	 * @return 返回Connection对象实例
	 * @throws InterruptedException 
	 * @throws SQLException 
	 */
	public static Connection getConnection() throws SQLException, InterruptedException {
		return sds.getConnection();
	}

	/**
	 * 释放数据库操作资源
	 * @param conn
	 * @param st
	 * @param rs
	 */
	public static void free(Connection conn, Statement st, ResultSet rs) {
		sds.free(conn,st,rs);
	}
}
0
0
分享到:
评论

相关推荐

    PPT设计模式 示例源代码

    PPT设计模式通常指的是在创建PowerPoint演示文稿时采用的一些结构化方法,而在这个上下文中,"PPT设计模式 示例源代码"更可能是指使用设计模式来构建的PowerPoint相关的应用程序或库的源代码。 三层架构是一种常见...

    iReport使用JavaBean作为数据源——最简单的示例

    7. **应用示例**:这个示例特别适合初学者,它演示了如何从头开始创建一个基于JavaBean的报表。这对于那些需要根据业务对象生成动态报告的项目非常有用,比如从数据库获取数据后,通过JavaBean进行进一步处理,然后...

    spring3+springmvc+jpa+hibernate多数据源

    "spring3+springmvc+jpa+hibernate多数据源"是一个示例项目,它演示了如何在一个应用中集成Spring 3、Spring MVC、JPA 2.0以及Hibernate,以实现对多个数据源的支持。下面将详细介绍这些技术及其集成的关键点。 **...

    Java多线程设计模式源代码

    本资料包含的源代码将深入探讨各种多线程设计模式,帮助开发者理解和应用这些模式。 一、线程基础 在Java中,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。`Runnable`接口允许你将任务逻辑封装在一个类...

    C++模式设计-基于QT4开源跨平台开发框架源代码

    在这个压缩包中,我们可以找到多个源代码文件,每个文件都代表了特定的设计模式或Qt4库的使用示例: 1. **polymorphic1.cc 和 polymorphic2.cc**:这两个文件很可能展示了多态性在C++中的应用。多态性是面向对象...

    springboot+jpa配置多数据源.zip

    首先,`springboot+jpa配置多数据源.zip`这个压缩包可能包含了一个示例项目,用于演示如何在Spring Boot中集成JPA并配置多个数据源。JPA是Java平台上的ORM(Object-Relational Mapping)标准,它简化了与关系型...

    Spring+Mybatis 多数据源配置

    这在大型分布式系统中是常见的设计模式,有助于提高系统的可扩展性和灵活性。 实现Spring+Mybatis的多数据源配置,通常涉及以下几个步骤: 1. **配置数据源**:Spring提供了AbstractDataSource类作为抽象基类,...

    Android开发-设计模式博客演示代码

    本资源“Android开发-设计模式博客演示代码”提供了Android应用开发中常见设计模式的实际示例,旨在帮助开发者更好地理解和应用这些模式。 1. **单例模式**:确保一个类只有一个实例,并提供全局访问点。在Android...

    DemoCollections,一些演示、示例.zip

    4. **设计模式**:示例可能演示了常见的软件设计模式,如单例、工厂、观察者等,帮助开发者理解如何在实际项目中应用这些模式。 5. **算法与数据结构**:可能包括排序、搜索、图论等基础算法的实现,以及数组、链表...

    设计模式例子(高手可以不看)

    总之,这个压缩包中的"student"项目可能是为了演示如何在实际场景中应用设计模式,通过解决学生管理问题,让学习者掌握如何在自己的代码中有效地使用这些模式。通过对这些示例的分析和学习,开发者可以提升自己的...

    组合模式代码示例

    组合模式是一种设计模式,属于结构型模式,它允许我们以统一的方式处理单个对象和对象的集合。在软件工程中,这种模式常用于构建树形结构,使得客户端代码可以一致地处理单个对象和组合对象,而无需关心它们的具体...

    用于演示Nop平台基本开发流程的示例工程 功能设计与数据结构设计仿照开源的litemall项目

    通过这个示例工程,开发者不仅可以学习到Nop平台的基本开发流程,还能了解到新零售/网店/商城系统的常见设计模式和最佳实践。对于想要进入电商系统开发领域的开发者来说,这是一个非常有价值的实战项目。

    amazon-dynamodb-design-patterns:此存储库包含示例数据模型以演示 Amazon DynamoDB 的设计模式

    此存储库包含示例数据模型和源代码,用于演示 Amazon DynamoDB 的设计模式。 例子 数据模型和源代码在/examples文件夹下列出。 设备状态日志 - [数据模型] 网上商店 - [数据模型] 使用 Amazon Dynamodb 实现版本...

    spark2官方示例源代码

    Spark是Apache软件基金会下的一个开源大数据处理框架,以其高效的分布式计算能力和易用性而闻名。Spark2官方示例源代码...通过这些示例,你不仅可以学习如何使用Spark,还可以了解到大数据处理的最佳实践和设计模式。

    Struts2.0+Spring2.0+Hibernate3.1登录及增删改查的完整演示示例

    Struts2是一个开源的基于MVC设计模式的Web应用框架,用来帮助开发者进行Web层的开发工作。Spring是一个开源的轻量级框架,它解决了企业应用开发的复杂性,提供了更为丰富的功能,如依赖注入、面向切面编程等。...

    Pcie接口PIO设计示例与仿真详解--7系列.docx

    根端口模型用于生成、使用和检查 PCI Express 总线数据交互的测试台,而 PIO 示例设计是一个完整的 PCI Express 应用程序,响应对其应用程序的内存空间读写请求。 在仿真设计中,事务从根端口模型发送到核心(配置...

    Elasticsearch示例数据 logs.json

    在本场景中,我们关注的是一个名为 "logs.json" 的示例数据文件,它通常包含了一系列结构化的JSON记录,这些记录是为演示或测试Elasticsearch的功能而设计的。 在Elasticsearch中,数据通常是以JSON格式存储的,...

    观察者设计模式demo

    BaseAdapter是ListView的数据源,负责提供数据项到ListView的视图。BaseAdapter使用观察者模式来处理数据变化与UI更新之间的关系。当数据集发生变化时,Adapter会通知ListView,ListView进而更新对应的视图项,以...

    C#2008示例源程序

    1. **LINQ (Language Integrated Query)**: C# 2008引入了 LINQ,这是一种内置于语言中的查询能力,可以用于数据库、XML文档和集合等多种数据源的查询。学习这些示例,你可以理解如何使用`from`、`where`、`select`...

Global site tag (gtag.js) - Google Analytics