`

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

    博客分类:
  • 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
分享到:
评论

相关推荐

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

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

    jpaprojections:示例项目演示了如何使用Hibernate Interceptor and Envers,DTO Projection,Observer和Command设计模式

    使用命令设计模式提供一种通用方法,可将不同实体类型同步到外部源 使用DTO投影以获得实体的非Persistence Context管理的实例 使用和比较实体版本 设想 “ JPA投影”示例项目假定以下情形: 它是管理足球队(CRUD...

    领域驱动设计与模式实战

    2.4 针对具体应用程序类型的设计模式 2.5 领域模式 2.6 小结 第3章 TDD与重构 3.1 TDD 3.1.1 TDD流程 3.1.2 演示 3.1.3 设计效果 3.1.4 问题 3.1.5 下一个阶段 3.2 模拟和桩 3.2.1 典型单元测试 3.2.2 声明独立性 ...

    asp.net知识库

    ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 Ibatisnet 提供的CacheModel ASP.NET 2.0中小心Profile命名冲突 使用ASP.NET 2.0 ...

    JAVA上百实例源码以及开源项目源代码

    凯撒加密解密程序 1个目标文件 1、程序结构化,用函数分别实现 2、对文件的加密,解密输出到文件 利用随机函数抽取幸运数字 简单 EJB的真实世界模型(源代码) 15个目标文件 摘要:Java源码,初学实例,基于EJB的真实...

    ios-demos:ios应用程序示例http

    每个选项卡均实现带有硬编码数据源的CollectionViewController 。 该实现实际上是最基本的,因此有大量的重构潜力。 这是内容交付应用程序的准系统演示。 它不是本机应用程序,而是使用TVMLKit框架的javascript...

    Visual C#网络编程技术与实践源代码

     1.4 使用套接字的简单示例  1.4.1 C/S与B/S架构通信模式概述  1.4.2 编写客户端代码  1.4.3 编写服务器端代码 . 1.4.4 无阻塞套接字  1.5 本章小结 第2章 C#.NET高级网络编程技术概述  2.1 线程与...

    ASP.NET3.5从入门到精通

    8.1.2 Access 数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ 数据源控件(LinqDataSource) 8.1.5 Xml 数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource...

    Java源码包100个设计实例.zip

    Java源码包100个设计实例, 大量 实例,可以作为你的学习设计参考。 实例如下: Applet钢琴模拟程序java源码 Calendar万年历 copass源代码.rar DataBuffer在Java中使用ADO.NET.rar EJB 模拟银行ATM流程及操作源代码 ...

    java源码包---java 源码 大量 实例

     基于JAVA的UDP服务器模型源代码,内含UDP服务器端模型和UDP客户端模型两个小程序,向JAVA初学者演示UDP C/S结构的原理。 简单聊天软件CS模式 2个目标文件 一个简单的CS模式的聊天软件,用socket实现,比较简单。 ...

    Access 2000数据库系统设计(PDF)---002

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源...

    Access 2000数据库系统设计(PDF)---003

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源...

    Access 2000数据库系统设计(PDF)---018

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑...

    Access 2000数据库系统设计(PDF)---011

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑...

    Access 2000数据库系统设计(PDF)---020

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源编辑...

    Access 2000数据库系统设计(PDF)---009

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源...

    Access 2000数据库系统设计(PDF)---001

    31.2.3 DAP设计模式 51.3 为Microsoft数据引擎创建 Access数据 项目 51.3.1 新的ADP工具和对象 61.3.2 NorthwindCS项目和da Vinci工具 箱的深入研究 61.4 OfficeVBA编辑器和Access的集成 91.5 DAP和DHTML的HTML源...

    ASP.NET 3.5 开发大全11-15

    8.1.2 Access数据源控件(AccessDataSource) 8.1.3 目标数据源控件(ObjectDataSource) 8.1.4 LINQ数据源控件(LinqDataSource) 8.1.5 Xml数据源控件(XmlDataSource) 8.1.6 站点导航控件(SiteMapDataSource) ...

Global site tag (gtag.js) - Google Analytics