`

数据库连接池实现原理

    博客分类:
  • DB
阅读更多

数据库连接池实现原理

 实现原理是用动态代理技术

 

编写连接池需实现java.sql.DataSource接口,
 DataSource接口中定义了两个重载的getConnection方法:
 Connection getConnection()
 Connection getConnection(String username, String password)

 

public class JdbcPool implements DataSource {

	private static String driver;
	private static String url;
	private static  String username;
	private static String password;

	static{
		try {
			
			Properties prop = new Properties();
			InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
			prop.load(in);
			driver = prop.getProperty("driver");
			url = prop.getProperty("url");
			username = prop.getProperty("username");
			password = prop.getProperty("password");
			Class.forName(driver);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	
	private static LinkedList<Connection> pool = new LinkedList<Connection>();
	private static int poolsize = 10;
	//问题:每次newJdbcPoll都会建立10个链接,可使用单态设计模式解决此类问题
	public JdbcPool(){
	
		for(int i=0;i<poolsize;i++){
			try {
				Connection conn = DriverManager.getConnection(url,username,password);
				pool.add(conn);
				System.out.println(conn + "被加到池里面了!!!");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
	/*
	 * 这里使用动态代理技术返回一个假的Connection,当dao调用假connection的任何方法时,该方法体内会调用InvocationHandler.invoke方法
	 * 在invoke方法体内,发现dao调用的是close方法,则把链接还到池里,否则,调用真connection的对应方法。
	 * (non-Javadoc)
	 * @see javax.sql.DataSource#getConnection()
	 */
	public Connection getConnection() throws SQLException { //spring aop
		if(pool.size()>0){
			final Connection conn = pool.removeFirst();
			System.out.println(conn + "从池里面取出去了!!!");
			return (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),conn.getClass().getInterfaces(), new InvocationHandler(){
					//proxy为代理对象 method为要调用的方法 args为方法的参数
				public Object invoke(Object proxy, Method method, Object[] args)
						throws Throwable {
					if(method.getName().equals("close")){
						pool.addFirst(conn);
						System.out.println(conn + "被还到池里面了!!");
						return null;
					}else{
						return method.invoke(conn, args);
					}
				}
			});
			
		}
		throw new RuntimeException("对不起,池里没有资源了!!!");
	}

	public Connection getConnection(String arg0, String arg1)
			throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}

	public PrintWriter getLogWriter() throws SQLException {
		// TODO Auto-generated method stub
		return null;
	}

	public int getLoginTimeout() throws SQLException {
		// TODO Auto-generated method stub
		return 0;
	}

	public void setLogWriter(PrintWriter arg0) throws SQLException {
		// TODO Auto-generated method stub
		
	}

	public void setLoginTimeout(int arg0) throws SQLException {
		// TODO Auto-generated method stub
		
	}

	//public Jdbcpool
	
}

 
 
  一般实现第一个就可了,数据库的信息都 是通过配置文件来实现的,
  通过加载配置文件就可以,取得与数据库的连接

 

实现DataSource接口,并实现连接池功能的步骤
 1.在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中
  因为LinkedList 是用链表实现的,对于增删实现起来比较容易
  因为每从池中取出一个连接,都要将这个对象从池不删除,当返回时就要添加回去
  
 2.实现getConnection方法,让getConnection方法每次调用时,
  从LinkedList中取一个Connection返回给用户(即要从池中删除一个对象)
  
 3.当用户使用完Connection,调用Connection.close()方法时,
  Collection对象应保证将自己返回到LinkedList中
  (用户一般都会调用Connection的close方法来关闭连接,从而不能将这个连接返回给池,
  所以这里采用了动态代理技术:赤获取用户关闭连接的操作,当获取到时而不是将其给关闭,
  而是将这个连接(对象)添加到池中)

 

注:

 

** 这里使用动态代理技术返回一个假的Connection,
 当dao调用假connection的任何方法时,该方法体内会调用InvocationHandler.invoke方法
** 在invoke方法体内,发现dao调用的是close方法,则把链接还到池里,
 否则,调用真connection的对应方法。

 

开源的数据库连接池(数据源)

 都提供DataSoruce的实现,即连接池的实现

 DBCP 数据库连接池     C3P0 数据库连接池 
 
 DBCP 是 Apache 软件基金组织下的开源连接池实现,使用DBCP数据源
Commons-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖库
它用到了一个配置文件dbcpconfig.properties(放在类路径下)

用BaseDataSourceFactory 对象 装载这个配置文件

private static DataSource dataSource;
	static {
		try {
			InputStream in = JdbcUtil.class.getClassLoader()
					.getResourceAsStream("dbcpconfig.properties");
			Properties prop = new Properties();
			prop.load(in);
			BasicDataSourceFactory factory = new BasicDataSourceFactory();
			dataSource = factory.createDataSource(prop);
		} catch (Exception e) {
			throw new ExceptionInInitializerError(e);
		}
	}
	
	public static Connection getConnection() throws SQLException {
		return dataSource.getConnection();
	}

  

 

在Tomcat 下实现数据库连接池

1.要在META-INF目录下建一个context.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<Context>
  <Resource name="jdbc/dataSource" auth="Container"
            type="javax.sql.DataSource" username="root" password="root"
            driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://localhost:3306/jdbc"
            maxActive="8" maxIdle="4"/>
</Context>

 
(这是将数据库连接对象绑定到一个名字中去,要用到时就通过这个名字来找这个对象)JNDI
  2.还要将数据库驱动的JAR复制到Tomcat的LIB目录下,因为Tomcat起动时就会去初始化连接池
   所以就会去找相应的JAR文件,其实这个配置是可以配在Tomcat conf目录下server.xml文件中的
   , 为了不改变它原来的配置,所以配置有那也是一样有效的

  3.取得连接,通过命名空间
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
dataSource = (DataSource)envCtx.lookup("jdbc/dataSource");

 

分享到:
评论

相关推荐

    JDBC数据库连接池实现原理

    1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...

    Java数据库连接池的原理与应用.pdf

    在使用数据库连接池时,常见的连接池实现有DBCP、C3p0、TomcatJdbcPool、BoneCP和Druid等。以DBCP为例,使用它需要导入commons-dbcp.jar和commons-pool.jar包。在Maven项目中,需要在pom.xml配置文件中添加相应的...

    C#高效数据库连接池源码

    `ConnectionPool`可能是项目或类库的命名空间或类,包含实际的数据库连接池实现;`Demo`可能是一个示例应用程序,展示如何使用自定义的数据库连接池。 5. **连接池实现细节**: - **初始化**:在应用程序启动时,...

    JAVA 完整的数据库连接池实现

    在 Java 中,有多种流行的数据库连接池实现,如 Apache Commons DBCP、C3P0、HikariCP 和 Druid 等。这里我们将以 HikariCP 为例,讲解如何配置和使用数据库连接池。 1. **HikariCP 简介** HikariCP 是一个高性能...

    数据库连接池的图解原理

    常见的数据库连接池实现有Apache的DBCP、C3P0,以及HikariCP等。其中,HikariCP以其优秀的性能和稳定性受到许多开发者的青睐,它通过零拷贝、最小化锁竞争等手段优化了连接管理,降低了系统开销。 数据库连接池除了...

    C# 数据库连接池 C# 数据库连接池

    ### C#中的数据库连接池实现 在C#中,主要使用ADO.NET框架来实现数据库连接池。以下是一些关键类和方法: 1. **System.Data.SqlClient.SqlConnection**:这是SQL Server数据库的连接类,支持连接池。在创建`...

    探析Java数据库连接池运行原理.pdf

    本文探讨了Java数据库连接池的运行原理,探究了连接池的工作原理、程序实现和优点。连接池是一种技术,用于解决数据库连接的频繁分配和释放问题,提高系统性能。 数据库连接池的原理 数据库连接池的原理是建立一个...

    代理模式之静态代理---数据库连接池对象实现原理

    在本主题“代理模式之静态代理---数据库连接池对象实现原理”中,我们将探讨如何使用静态代理来实现数据库连接池。数据库连接池是现代应用中常用的优化手段,它可以高效地管理数据库连接,避免频繁地创建和关闭连接...

    数据库连接池的原理机制学习

    ### 数据库连接池的原理机制深入解析 #### 一、基本概念及原理 数据库连接池是一种用于管理和重用数据库连接的技术。它通过预创建并维护一定数量的数据库连接,使得应用程序能够快速获取并释放这些连接,从而提高...

    Java jdbc数据库连接池总结

    数据库连接池(connection pool)的工作原理是为了解决资源的频繁分配、释放所造成的问题。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时...

    数据库连接池原理

    ### 数据库连接池原理 #### 一、背景与价值 ##### 1.1 背景 在现代软件开发中,应用程序与数据库之间的交互是非常常见的。为了提高这种交互的效率和减少资源消耗,通常会使用数据库连接池技术。连接池位于应用...

    java数据库连接池.pdf

    4. 数据库连接池实现原理:数据库连接池(Database Connection Pool)是一种管理数据库连接的机制,它通过维护一个数据库连接的池,按需分配和回收这些连接,从而提高数据库操作的效率和系统资源利用率。当应用程序...

    数据库的连接池原理,基本概念及原理,服务器自带的连接池

    1. 连接池的基本概念及原理:数据库连接池的基本思想是为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。...

    数据库连接池java代码实现

    本文将深入探讨如何使用Java代码来实现一个简单的数据库连接池,并解释其核心概念和工作原理。 连接池的基本思想是维护一组预初始化的数据库连接,当应用程序需要时,可以从池中获取一个连接,使用完毕后,再归还回...

    数据库连接池的实现(很完整(支持多种数据库

    综上所述,这个压缩包提供了一个全面的数据库连接池实现,适用于多种数据库,包括源码和测试,对于学习和开发数据库相关的应用程序具有很高的价值。通过研究和使用这个实现,开发者可以更好地理解和优化自己项目的...

    数据库连接池的工作原理

    4. **常见的数据库连接池实现** - **C3P0**:开源的JDBC连接池,提供异常检测、连接测试等功能。 - **HikariCP**:高性能的连接池,设计目标是提供最低的延迟和最佳的性能。 - **DBCP**:Apache提供的基础连接池...

    数据库连接池的三种实现方法

    在Java开发中,有三种常见的数据库连接池实现:DBCP(BasicDataSource)、C3P0以及阿里开源的Druid。下面将详细介绍这三种数据库连接池的实现原理和特性。 1. **DBCP (BasicDataSource)** DBCP 是 Apache Commons ...

    Java中数据库连接池原理机制的详细讲解

    ### Java中数据库连接池原理机制的详细讲解 #### 一、引言 在现代软件开发中,特别是基于Java的企业级应用开发中,数据库连接管理是一个关键环节。由于数据库连接是昂贵的资源,频繁地创建与关闭连接将严重影响系统...

Global site tag (gtag.js) - Google Analytics