`
knight_black_bob
  • 浏览: 858765 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

手写 基础 数据库连接池

    博客分类:
  • java
阅读更多

手写数据库连接池 基础

 

 

package com.curiousby.baoyou.cn.showandshare.customised.dbpool.mysql;

import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Iterator;
import java.util.Vector;



public class MyCustomisedPool { 
	
	/**
	 * <pre>
	 * jdbcDriver = "com.mysql.jdbc.Driver"; // 数据库驱动
	 * dbUrl = "jdbc:mysql://localhost:3306/database"; // 数据 URL
	 * dbUsername = "root"; // 数据库用户名
	 * dbPassword = "root"; // 数据库用户密码
	 *  testSql = "select count(*) from t_user"; // 测试连接是否可用的测试表名,默认没有测试表
	 *  initialConnections = 10; // 连接池的初始大小
	 *  incrementalConnections = 5;// 连接池自动增加的大小
	 *  maxConnections = 50; // 连接池最大的大小
	 *  </pre>
	 * @author baoy
	 */
	private DBConfig conf;
	private Vector<CustomisedConnection> connections;
	
	public static class CustomisedConnection{
		
		private  boolean busy = false;
		private Connection Connection = null;
		 
		public CustomisedConnection(Connection connection) {
			Connection = connection;
		}
		
		public boolean isBusy() {
			return busy;
		}
		public void setBusy(boolean busy) {
			this.busy = busy;
		}
		public Connection getConnection() {
			return Connection;
		}
		public void setConnection(Connection connection) {
			Connection = connection;
		} 
	}
	
	/**
	 * <pre>
	 * jdbcDriver = "com.mysql.jdbc.Driver"; // 数据库驱动
	 * dbUrl = "jdbc:mysql://localhost:3306/database"; // 数据 URL
	 * dbUsername = "root"; // 数据库用户名
	 * dbPassword = "root"; // 数据库用户密码
	 *  testSql = "select count(*) from t_user"; // 测试连接是否可用的测试表名,默认没有测试表
	 *  initialConnections = 10; // 连接池的初始大小
	 *  incrementalConnections = 5;// 连接池自动增加的大小
	 *  maxConnections = 50; // 连接池最大的大小
	 *  </pre>
	 * @author baoy
	 */
	public static class DBConfig{
		private String jdbcDriver = "com.mysql.jdbc.Driver"; // 数据库驱动
		private String dbUrl = "jdbc:mysql://localhost:3306/database"; // 数据 URL
		private String dbUsername = "root"; // 数据库用户名
		private String dbPassword = "root"; // 数据库用户密码
		private String testSql = "select count(*) from t_user"; // 测试连接是否可用的测试表名,默认没有测试表
		private int initialConnections = 10; // 连接池的初始大小
		private int incrementalConnections = 5;// 连接池自动增加的大小
		private int maxConnections = 50; // 连接池最大的大小
		
		public String getJdbcDriver() {
			return jdbcDriver;
		}
		public void setJdbcDriver(String jdbcDriver) {
			this.jdbcDriver = jdbcDriver;
		}
		public String getDbUrl() {
			return dbUrl;
		}
		public void setDbUrl(String dbUrl) {
			this.dbUrl = dbUrl;
		}
		public String getDbUsername() {
			return dbUsername;
		}
		public void setDbUsername(String dbUsername) {
			this.dbUsername = dbUsername;
		}
		public String getDbPassword() {
			return dbPassword;
		}
		public void setDbPassword(String dbPassword) {
			this.dbPassword = dbPassword;
		}
		public String getTestSql() {
			return testSql;
		}
		public void setTestSql(String testSql) {
			this.testSql = testSql;
		}
		public int getInitialConnections() {
			return initialConnections;
		}
		public void setInitialConnections(int initialConnections) {
			this.initialConnections = initialConnections;
		}
		public int getIncrementalConnections() {
			return incrementalConnections;
		}
		public void setIncrementalConnections(int incrementalConnections) {
			this.incrementalConnections = incrementalConnections;
		}
		public int getMaxConnections() {
			return maxConnections;
		}
		public void setMaxConnections(int maxConnections) {
			this.maxConnections = maxConnections;
		}
	}
	
	
	
	
	
	
	
	
	
	




	private Connection newConnection() throws SQLException{
		Connection conn = DriverManager.getConnection(conf.dbUrl, conf.dbUsername, conf.dbPassword);
		if (this.connections == null || this.connections.size() == 0) {
			int driverMaxConnections = conn.getMetaData().getMaxConnections();
			if (conf.maxConnections > 0 && driverMaxConnections <  conf.maxConnections ) {
				conf.maxConnections  = driverMaxConnections;
			}
		}
		return  conn;
	}
	
	private void createConnection(int nums) throws SQLException{
		for (int i = 0; i < nums; i++) {
			// 1如果 最大连接数大于0  
			// 1.1 并且 当前连接数小于最大连接数 ,可以
			// 1.2   当前连接数大于最大连接数,跳出(或者抛出异常,超出最大连接数)
			// 2 如果 最大连接数小于0,无最大连接数限制 
			if (conf.maxConnections > 0 && this.connections.size()>= conf.maxConnections ) {
				break;
			}
			connections.add( new CustomisedConnection(newConnection()));
		}
	}
	 
	
	public synchronized  void  initConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
		if (connections != null) {
			return;
		}
		Driver driver = (Driver) (Class.forName(conf.jdbcDriver).newInstance());
		DriverManager.registerDriver(driver);
		connections = new Vector<CustomisedConnection>();
		createConnection(conf.initialConnections);
	}
	
	private CustomisedConnection findFreeConnection() throws SQLException {
		Iterator<CustomisedConnection> iterator = connections.iterator();
		while (iterator.hasNext()) { 
			CustomisedConnection customisedConnection = iterator.next();
			if (!customisedConnection.isBusy()) {
				Connection connection = customisedConnection.getConnection();
				if (!testConnection(connection)) {
					connection = newConnection();
					customisedConnection.setConnection(connection);
				}
				customisedConnection.setBusy(true);
				return customisedConnection;
			}
		}
		return null;
	}
	
	private boolean testConnection(Connection connection) throws SQLException {
		if (conf.getTestSql() != null && !"".equals(conf.getTestSql())) {
			try{
			Statement stmt = connection.createStatement();
			stmt.execute(conf.getTestSql());
			}catch(Exception e){
				e.printStackTrace();
				closeConnection(connection); 
				return false;
			}
		}
		return true;
	}

	private  CustomisedConnection getFreeCustomisedConnection() throws SQLException { 
		CustomisedConnection findFreeConnection = findFreeConnection();
		if (findFreeConnection != null) {
			return findFreeConnection;
		}
		if (conf.maxConnections > 0 &&   conf.maxConnections  > connections.size() ) {
			int nums =  conf.maxConnections  > connections.size()+conf.incrementalConnections ? conf.incrementalConnections : conf.maxConnections-  connections.size();
			createConnection(nums);
		}
		return findFreeConnection();
	}

	
	public synchronized CustomisedConnection getConnection() throws SQLException{
		if (connections == null) {
			return null;
		}
		CustomisedConnection conn = getFreeCustomisedConnection();
		while (conn == null) {
			try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
			conn = getFreeCustomisedConnection();
		}
		return conn;
	}
	
	public synchronized void returnConnection(Connection conn){
		Iterator<CustomisedConnection> iterator = connections.iterator();
		while (iterator.hasNext()) { 
			CustomisedConnection customisedConnection = iterator.next();
			if (conn == customisedConnection.getConnection()) { 
				customisedConnection.setBusy(false);
			}
		}
	}
	 
	public synchronized void  closeConnection(Connection conn) {
		Iterator<CustomisedConnection> iterator = connections.iterator();
		while (iterator.hasNext()) { 
			CustomisedConnection customisedConnection = iterator.next();
			if (conn == customisedConnection) {  
				//设置成true 没有线程继续访问它
				customisedConnection.setBusy(true);
				//关闭连接
				Connection connection = customisedConnection.getConnection();
				try { connection.close(); } catch (SQLException e) {  e.printStackTrace(); }
				// 从池中移除
				connections.remove(customisedConnection);
			}
		} 
	}

	public int getPoolSize(){
		if (connections == null) {
			return 0;
		}
		return connections.size();
	} 
	 
	
	public DBConfig getConf() {
		return conf;
	}

	public void setConf(DBConfig conf) {
		this.conf = conf;
	}

	public Vector<CustomisedConnection> getConnections() {
		return connections;
	}

	public void setConnections(Vector<CustomisedConnection> connections) {
		this.connections = connections;
	}
	 
	public MyCustomisedPool(DBConfig conf) {
		this.conf = conf;
	}

	
	
	
	
	
	//test 
	public static void main(String[] args) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException {
		MyCustomisedPool pool = new MyCustomisedPool(new DBConfig() );
		pool.initConnection(); 
		for (int i = 0; i < 1000; i++) {
			CustomisedConnection connection = pool.getConnection();
			System.out.println(pool.getPoolSize());
			try{
				pool.testConnection(connection.getConnection());
			}catch(Exception e){
				e.printStackTrace();
				pool.closeConnection(connection.getConnection());
			}finally{
				pool.returnConnection(connection.getConnection());
			}
		}
	}
	
}

 

 

 

 

 

 

 

 

 

 

 

 

捐助开发者 

在兴趣的驱动下,写一个免费的东西,有欣喜,也还有汗水,希望你喜欢我的作品,同时也能支持一下。 当然,有钱捧个钱场(支持支付宝和微信 以及扣扣群),没钱捧个人场,谢谢各位。

 

个人主页http://knight-black-bob.iteye.com/



 
 
 谢谢您的赞助,我会做的更好!

0
0
分享到:
评论

相关推荐

    java手写数据库连接池

    本文将深入探讨如何使用Java手写数据库连接池,并基于maven进行项目构建。我们将分析四个核心类的功能,以及如何通过多线程进行数据库操作的测试。 首先,数据库连接池的基本原理是维护一定数量的数据库连接,当...

    手写数据库连接池(java)连sqlserver

    发现csdn上的连接池都是配设xml的,就手写了一份数据库连接池(java),连接sqlserver,里面一共两个java代码,Conn类包含了Connection和标志位,myconnection包含了数据库连接池的使用:获取连接,增加连接,释放...

    JAVA数据库连接池完整源码(简单易用带详细注释)

    数据库连接池是Java应用程序中非常重要的一个组件,它在处理大量并发访问数据库时能显著提高性能,通过复用已存在的数据库连接,避免了频繁创建和销毁连接带来的开销。本资源提供了一份完整的Java数据库连接池的源...

    数据库连接池案例包括c3p0,druid,和自己手写的连接池

    数据库连接池是现代应用程序开发中的重要组成部分,它在提高数据库操作效率、节省系统资源和管理数据库连接方面扮演着关键角色。本案例将介绍三种常见的数据库连接池实现:C3P0、Druid以及自定义连接池的实现。 ...

    java数据库连接池源码及使用示例

    本资源包含了一个名为`jdbcPool`的手写数据库连接池源码以及一个`jdbcPoolTest`的调用示例,支持Oracle和MySQL数据库。 首先,我们来看`jdbcPool`连接池的实现。在Java中,连接池通常由以下几个核心组件组成: 1. ...

    java数据库连接池

    而这个`jdbcPool.jar`库,作为手写实现,可能没有那么丰富的功能,但它的存在为学习和理解数据库连接池的工作机制提供了很好的实践案例。 在`readme.txt`文件中,通常会包含关于如何使用这个库的详细说明,包括如何...

    C#编写的数据库连接池

    在IT行业中,数据库连接池是优化数据库访问性能和资源管理的重要技术。特别是在使用C#进行数据库操作时,连接池能够显著提升系统效率。本项目标题为“C#编写的数据库连接池”,说明我们将探讨如何利用C#语言实现...

    Java手写数据库连接池.docx

    ### Java手写数据库连接池详解 #### 一、引言 在现代软件开发中,数据库作为数据存储的核心组件,其性能直接影响着整个系统的响应速度。为了提高系统的整体性能,优化数据库连接的管理变得尤为重要。连接池技术...

    一个比较好手写连接池

    在IT行业中,数据库连接池是优化数据库访问性能和资源管理的重要技术。标题提到的“一个比较好手写连接池”指的是一个由个人或团队独立编写的、用于管理数据库连接的类库,它模仿了Tomcat连接池(Apache Commons ...

    java手写连接池

    首先,我们要了解数据库连接池的基本原理。数据库连接池在初始化时会创建一定数量的连接,并将它们保存在池中。当一个应用需要与数据库通信时,它会从池中获取一个已存在的连接,而不是每次都去建立新的连接。使用...

    关于如何手写连接池的资料

    通过以上设计,我们可以构建一个基本的手写连接池实现,提供数据库连接的高效管理和复用。然而,实际应用中,成熟的连接池实现如Apache的DBCP、C3P0或HikariCP等,会包含更多优化,如连接预热、连接超时、公平锁等...

    纯手写简易版的数据库连接池jar包

    纯手写简易版的数据库连接池jar包

    自己写java数据库连接池.docx

    ### Java手写数据库连接池详解 #### 一、引言 在Java开发中,数据库连接池是一项非常重要的技术。它可以显著提升应用程序与数据库交互时的性能,并降低资源消耗。连接池的基本原理是预先创建一定数量的数据库连接...

    数据库连接池

    不依赖第三方包,纯手写数据库连接池,注释更完整

    spring+jax-ws+手写连接池

    在这个项目中,“spring+jax-ws+手写连接池”的组合意味着我们要实现一个基于Spring的系统,其中包含了自定义的JAX-WS服务,并且使用了自行编写的数据库连接池。 首先,让我们详细讨论Spring框架。Spring以其轻量级...

    write-jdbc-deom:纯手写数据库连接池,创建多个线程的替换机制

    【标题】"write-jdbc-deom"项目是一个实践性的示例,它展示了如何从零开始构建一个简单的数据库连接池,特别是在Java环境中。数据库连接池是应用程序管理数据库连接的一种高效方式,它可以减少创建和销毁数据库连接...

    java连接HighGo DB

    综上所述,文档详细介绍了如何使用Java通过JDBC API连接到HighGo数据库的基本步骤,包括了驱动加载、数据库连接建立、异常处理以及代码的版权说明。这些知识点都是Java开发者在进行数据库操作时必须要掌握的基础内容...

    python连接mysql数据库示例代码

    3. 理解数据库连接池的概念及其在提高数据库访问效率中的作用。 4. 处理数据库操作中的常见错误和异常。 阅读建议 此资源以手写代码的方式讲解 Python 连接 MySQL 数据库的基本操作和核心功能,

    java装饰模式及动态代理模式示例源码

    下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。 首先,装饰模式是一种结构型设计模式,它的主要目的是在不改变原有对象接口的情况下,为对象添加新的功能或行为...

    基于Java的MyBatis手写实现.zip

    # 基于Java的MyBatis手写实现 本项目是一个基于Java语言的手写... - 整合手写的数据库连接池,使用JDBC进行数据库的插入、修改、删除和查询操作。 ## 功能实现 1. **原生MyBatis使用**: - 定义Mapper接口,使

Global site tag (gtag.js) - Google Analytics