`
kevin_wanwei
  • 浏览: 117687 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jdbc数据源

阅读更多

数据源设计思想和数据库连接池设计思想基本相似。大家知道在操作数据库程序时,创建连接所占用时间最多,为了提高程序的效率,便出现了数据库连接池技术。

                  数据库连接池实现原理:在系统启动时便创建一定数量连接,将它们放在线程安全的集合中(这便称为数据库连接池),当某段程序要连接数据库时,不必再去创建连接而直接去从池中去取,这样也就减少了创建连接时间。在关闭连接时,也不是真正关闭而是将其重新放回池中。从而提高系统效能。

一下说我最近写的一个数据源类,仅供大家参考:

package dataSource;

import java.io.File;
import java.io.InputStream;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;


public class DataSource implements javax.sql.DataSource{
	/**驱动*/
	private String driver;
	/**url*/
	private String url;
	/**用户名*/
	private String user;
	/**密码*/
	private String password;
	/**初始化连接数*/
	private int initCount;
	/**连接池中最大连接数*/
	private int maxCount;
	/**当前使用连接数*/
	private int currentCount=0;
	/**等待连接最长时间*/
	private int wait=3000;
	/**输出日志流*/
	private PrintWriter out;
	/**连接池*/
	private Vector<ConnectionPool> connections;
	
	public DataSource(){
		init();
		initConnections();
	}
	/**
	 * 初始化
	 */
	private void init(){
		Properties prop=new Properties();
		try {
			InputStream input=DataSource.class.getClassLoader().getResourceAsStream("dataSource.properties");
			prop.load(input);
			driver=prop.getProperty("driver");
			Class.forName(driver);//加载驱动
			url=prop.getProperty("url");
			user=prop.getProperty("user");
			password=prop.getProperty("password");
			String itCount=prop.getProperty("initCount");
			initCount=itCount==null?1:Integer.parseInt(itCount);
			String mCount=prop.getProperty("maxCount");
			maxCount=mCount==null?1:Integer.parseInt(mCount);
			connections=new Vector<ConnectionPool>();
			out=new PrintWriter(new File("c:/datasouce.log"),"UTF-8");
		} catch (Exception e) {
			e.printStackTrace();
			writerLog(e.getMessage());
			throw new RuntimeException("装载配置文件错误");
		}
	}
	/**
	 * 初始化连接池中数据库连接个数
	 *
	 */
	private void initConnections(){
		for(int i=0;i<initCount;i++){
			try {
				Connection conn=createConnection();
				if(i==0){
					DatabaseMetaData metaData=conn.getMetaData();
					int dataCount=metaData.getMaxConnections();
					writerLog("数据库最大连接数为:"+dataCount);
					if(dataCount>0&&maxCount>dataCount){
						maxCount=dataCount;
					}
				}
				ConnectionPool pool=new ConnectionPool(conn);
				connections.addElement(pool);
			} catch (SQLException e) {
				e.printStackTrace();
				writerLog(e.getMessage());
				throw new RuntimeException("初始化连接池错误");
			}
		}
	}
	/**
	 * 创建连接对象
	 * @return 创建好的连接对象
	 * @throws SQLException
	 */
	private Connection createConnection() throws SQLException{
		 currentCount++;
		 writerLog("当前正在使用连接数:"+currentCount);
		return DriverManager.getConnection(url,user,password);
	}
	/**
	 * 当数据源中原有连接已用完时,就创建一个新的数据库连接对象到连接池中
	 * 且这个连接需要时才被创建,一旦创建就被使用
	 * @return
	 * @throws SQLException
	 */
	private ConnectionPool createConnPool() throws SQLException{
		Connection conn=createConnection();
		ConnectionPool pool=new ConnectionPool(conn);
		pool.setBusy(true);
		writerLog("添加一个新的数据库连接对象到连接池中");
		return pool;
	}
	/**
	 * 从连接池中得到连接对象
	 */
	public synchronized Connection getConnection() throws SQLException {
		if(connections==null){
			writerLog("连接池已不存在");
			return null;
		}
		Connection conn=findFreeConnection();
		if(conn==null){
		  if(currentCount<=maxCount){
			  ConnectionPool conn1=createConnPool();
			  return conn1.getConn();
			}else{
				try {
					writerLog("正在等待数据库连接 ....");
					Thread.sleep(wait);
					return findFreeConnection();
				} catch (InterruptedException e) {
					writerLog(e.getMessage());
					e.printStackTrace();
				}
			}
		}
		return conn;
	}
	/**
	 * 查找当前连接池中还有没有空闲连接
	 * @return Connection
	 */
	private Connection findFreeConnection(){
		Connection conn=null;
		if(connections.size()>0){
			Enumeration enu=connections.elements();
			while(enu.hasMoreElements()){
				ConnectionPool pool=(ConnectionPool)enu.nextElement();
				if(!(pool.isBusy())){
					conn=pool.getConn();
					pool.setBusy(true);
					writerLog("找到一个空闲连接");
					return conn;
				}
				
			}
		}
		return conn;
	}
	/**
	 * 关闭连接对象(实际上并不是真正的关闭,而是将其状态置为空闲)
	 * @param conn 要关闭连接对象
	 */
	public synchronized void closeConnection(Connection conn){
		currentCount--;
		if(connections.size()==0||connections==null){
			writerLog("连接池已不存在");
			return;
		}
		Enumeration enu=connections.elements();
		while(enu.hasMoreElements()){
			ConnectionPool pool=(ConnectionPool)enu.nextElement();
			if(pool.getConn()==conn){
				pool.setBusy(false);
				writerLog("关闭了当前连接");
				break;
			}
		}
		out.close();
	}
	/**
	 * 单独创建一个连接,不从连接池中去取
	 */
	public synchronized Connection getConnection(String username, String password)throws SQLException {
		writerLog("创建一个独立于连接池的连接对象");
		return DriverManager.getConnection(url,username,password);
	}
	/**
	 * 获得日志输出流
	 */
	public PrintWriter getLogWriter() throws SQLException {
		return out;
	}
	/**
	 * 设置日志输出流
	 */
	public void setLogWriter(PrintWriter out) throws SQLException {
		this.out=out;
	}
	/**
	 * 如果当前没有可用连接,设置等待时间 毫秒数
	 */
	public void setLoginTimeout(int seconds) throws SQLException {
		this.wait=seconds;
	}
	/**
	 * 或得系统等待连接时间
	 */
	public int getLoginTimeout() throws SQLException {
		return wait;
	}
	
	private void writerLog(String errMessage){
		out.append("#=========================================#\n");
		out.append(errMessage+"\n");
		out.append("#=========================================#\n");
	}
	
	/**
	 * 包装到连接池的连接对象
	 * @author newapps
	 */
	class ConnectionPool{
		/**当前数据库创建连接*/
		Connection conn;
		/**当前连接是否处于工作状态*/
		boolean busy=false;
		/**构造函数*/
		ConnectionPool(Connection conn){
			this.conn=conn;
		}
		void setBusy(boolean busy){
			this.busy=busy;
		}
		boolean isBusy(){
			return busy;
		}
		void setConn(Connection conn){
			this.conn=conn;
		}
		Connection getConn(){
			return conn;
		}
	}
}

 

配置文件(dateSource.properties)

#===================================================================================
#各种常用数据库驱动名称
#============mysql Driver====================
#com.mysql.jdbc.Driver
#============oracle Driver===================
#oracle.jdbc.driver.OracleDriver
#============pointbase Driver================
#com.pointbase.jdbc.jdbcUniversalDriver
#============SQL Server Driver===============
#com.microsoft.jdbc.sqlserver.SQLServerDriver
#============DB2 Driver======================
#com.ibm.db2.jdbc.app.DB2Driver
#===================================================================================
#数据库连接url格式为:"jdbc:子协议:子协议名称//主机名:端口号/数据库名?属性名=属性值&属性名=属性值"
#dbUser和dbPassword也可以通过:属性名=属性值方式传入。
#设置数据库的编码格式:useUnicode=true&characterEncoding=GBK
#============mysql url==============================================================
#jdbc:mysql://<machine_name><:port>/dbname
#端口号:默认是 3306
#============oracle url=============================================================
#jdbc:oracle:thin:@<machine_name><:port>:dbname
#端口号:默认是 1521
#============pointbase url==========================================================
#jdbc:pointbase:server://<machine_name><:port>/dbname
#端口号:默认是 9092
#============SQL Server url=========================================================
#jdbc:microsoft:sqlserver://<machine_name><:port>;DatabaseName=<dbname>
#端口号:默认是 1433
#============DB2 url================================================================
#jdbc:db2://<machine_name><:port>/dbname
#端口号:默认是 5000
#===================================================================================
#数据库驱动
driver=com.mysql.jdbc.Driver
#数据库URL
url=jdbc:mysql://127.0.0.1:3306/ajax
#连接数据库用户
user=root
#连接数据库密码
password=123
#初始化连接数
initCount=1
#连接池中最大连接数
maxCount=50

 

分享到:
评论

相关推荐

    Weblogic JDBC 数据源配置和详细参数说明

    Weblogic JDBC 数据源配置和详细参数说明 一、JDBC 概述 JDBC(Java Database Connectivity)是 Java 语言中的一种标准数据库连接技术,几乎所有需要访问数据库的 J2EE 应用程序都直接或间接地使用了它。JDBC 提供...

    JDBC数据源连接池的配置和使用示例

    **JDBC数据源连接池配置与使用详解** 在Java Web应用中,数据库连接的管理是至关重要的。为了提高性能和资源利用率,开发人员通常会使用数据源连接池。本篇文章将详细讲解JDBC数据源连接池的配置和使用,以帮助你更...

    Java Web JDBC数据源.docx

    Java Web JDBC 数据源配置 Java Web JDBC 数据源是指在 Java Web 应用程序中使用 JDBC(Java Database Connectivity)技术来连接数据库的方式。在这个配置文件中,我们可以看到的是在 Tomcat 中的 conf 文件下,...

    sap JDBC数据源配置

    ### SAP JDBC 数据源配置 #### 引言与目的 本文档旨在提供详细的步骤指南,用于在SAP NetWeaver 7.0 和 SAP Composite Environment (CE) 7.1 上配置 JDBC 数据源和系统。通过这些步骤,用户可以创建一个独立的数据...

    weblogic控制台创建jdbc数据源

    在WebLogic控制台上创建JDBC数据源是连接数据库的关键步骤,这使得应用能够透明地访问数据库资源。下面我们将详细探讨这个过程。 1. **JDBC数据源的概念** JDBC数据源是WebLogic服务器中的一个对象,它封装了...

    WebSphere建立jdbc数据源

    本文将详细讲解如何在WebSphere中创建JDBC数据源以及相关的项目部署步骤。 首先,理解JDBC(Java Database Connectivity)数据源是关键。JDBC数据源是一个在应用程序服务器中预先配置的数据库连接池,它允许应用...

    tomcat-jdbc数据源所需jar包tomcat-jdbc.jar+tomcat-juli.jar

    在处理数据库连接方面,Tomcat提供了一种高效且可管理的数据源实现,名为“tomcat-jdbc数据源”。这个数据源是Tomcat内建的一种连接池,它在性能和内存管理上比标准的Java JDBC连接池更优秀,尤其适用于高并发的Web...

    配置JDBC数据源收集.pdf

    配置JDBC数据源是连接Java应用程序到特定数据库的关键步骤。以下将详细阐述配置JDBC数据源的过程,以及涉及的相关知识点。 首先,我们要了解JDBC的作用。JDBC为Java开发者提供了一种统一的API,使得开发者可以使用...

    tomcat下配置jdbc数据源

    ### Tomcat下配置JDBC数据源详解 #### 一、引言 在Java Web开发中,JDBC(Java Database Connectivity)是一种用于执行SQL语句的标准Java API,它为数据库开发提供了一种统一的方式。而在实际应用中,为了提高程序...

    关于WebSphere建立jdbc数据源

    【关于WebSphere建立jdbc数据源】 在WebSphere应用服务器中,建立JDBC数据源是连接到数据库的关键步骤,它允许应用程序通过Java Database Connectivity (JDBC) API与数据库进行交互。以下是一个详细的步骤指南: 1...

    配置JDBC数据源归纳.pdf

    配置JDBC数据源是Java应用程序连接到特定数据库的关键步骤,下面将详细介绍如何配置JDBC数据源,以连接到MS SQL Server数据库为例。 1. **打开控制面板**: 在Windows操作系统中,配置JDBC数据源通常通过控制面板...

    Websphere Application Server 6.1配置JDBC数据源.doc

    在IBM WebSphere Application Server 6.1中配置JDBC数据源是将应用程序连接到数据库的关键步骤。这个过程涉及创建和配置JDBC提供程序、数据源以及相关的认证别名,以确保应用程序能够顺利地访问和操作数据库。以下是...

    Java Web 网络留言板2 JDBC数据源 (连接池技术).docx

    ### Java Web 网络留言板2 JDBC数据源与连接池技术 #### 一、概述 在Java Web开发中,留言板是一种常见的应用场景,用于收集用户的反馈信息。本文档介绍了一个具体的项目——“Java Web网络留言板2”,它利用了...

    JDBC数据源连接池配置及应用

    本文将详细讲解JDBC数据源连接池的配置和应用。 首先,让我们了解JDBC建立数据库连接的两种基本方式: 1. **使用DriverManager获得数据库连接**: 这是最基础的方法,程序员在代码中显式地加载驱动、创建连接。...

    CD销售管理系统JSP+SQL(源代码+论文+英文文献) 采用jdbc数据源连接方式,数据库用户名:sa 密码:123

    采用jdbc数据源连接方式,数据库用户名:sa 密码:123 将"运行文件"文件夹下的目录放在tomcat下的webapps文件夹下 启动数据库,启动tomcat服务器 在IE中输入:http://localhost:8080/CDxx/ 即可打开首页 ...

    SpringBoot整合JDBC&Druid;数据源示例

    在本文中,我们将深入探讨如何在SpringBoot项目中整合JDBC和Druid数据源,并创建一个具有监控功能的示例。SpringBoot以其简洁的配置和快速的开发能力,深受Java开发者喜爱。而Druid作为一款优秀的数据库连接池,提供...

    SpringBoot整合Sharding-JDBC,实现从数据库加载sharding-jdbc数据源,实现多种数据库数据源切换,数据库方言动态切换

    本篇将详细介绍如何在SpringBoot项目中整合Sharding-JDBC,实现在运行时动态地从数据库加载数据源,以及实现数据库方言的动态切换。 首先,Sharding-JDBC提供了两种使用模式:标准版和代理版。在标准版中,Sharding...

Global site tag (gtag.js) - Google Analytics