`
zh_harry
  • 浏览: 103189 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
877aca81-daac-33c8-8bf9-3a886cebc6c3
自己动手写java 框架
浏览量:28722
社区版块
存档分类
最新评论

动态代理实现dataSource ConnectionPool

    博客分类:
  • JAVA
阅读更多
编写连接池需实现java.sql.DataSource接口,
DataSource接口中定义了两个重载的getConnection方法:
Connection getConnection()
Connection getConnection(String username, String password)


没有close或release方法那么怎么 释放到池中呢?
所以通过动态代理实现
代码如下


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
	
}
分享到:
评论
2 楼 zh_harry 2013-08-06  
dongmingbin 写道
此线程池未考虑线程安全吧

这篇文章是转的,主要想搞明白一个问题,即connection体时释放回连接池问题
因为datasource没有提供release或close方法
线程安全问题可以自己实现
1 楼 dongmingbin 2013-08-06  
此线程池未考虑线程安全吧

相关推荐

    使用JAVA中的动态代理实现数据库连接池

    总结来说,通过Java的动态代理机制,我们可以创建一个透明的数据库连接代理,接管`Connection.close()`方法,以实现更灵活、低耦合的数据库连接池管理。这种方法不仅简化了用户接口,还增强了系统的可维护性和扩展性...

    java 自己实现DataSource实现实例

    "Java 实现 DataSource 实例" ...本文介绍了 Java 中的 DataSource 实现,包括了数据源的概念、实现原理、代理模式的应用等内容。通过自定义的数据源类,可以实现对数据库的高效访问和管理,提高系统的性能和可靠性。

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

    在Java中,代理模式主要分为静态代理和动态代理两种。 在本主题“代理模式之静态代理---数据库连接池对象实现原理”中,我们将探讨如何使用静态代理来实现数据库连接池。数据库连接池是现代应用中常用的优化手段,...

    数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯

    以Druid为例,Druid提供了一个名为`com.alibaba.druid.pool.DruidDataSource`的类,它是数据库连接池的实现。这个类通过内部的代理机制,监控并管理每个数据库连接的生命周期。当应用程序通过`DruidDataSource.get...

    Java基础学习42.pdf

    JDK代理基于接口实现,可以在运行时动态生成代理类;CGLib代理则是通过字节码技术生成目标对象的子类,适用于无接口的情况。 总的来说,Java基础学习涵盖了数据库连接池的使用、加密算法的理解以及代理模式的应用等...

    连接池总结

    2. **第三方框架集成的连接池**:如Spring框架中的DataSource,它支持多种连接池实现,如HikariCP、Druid、Tomcat JDBC Pool等,这些连接池性能优秀,且与Spring框架高度集成,便于管理和配置。 3. **自定义连接池...

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

    DBCP 是 Apache Commons 项目的一部分,它基于 Jakarta-pool 实现。DBCP 提供了一个基础的数据源类 `BasicDataSource`,负责管理数据库连接。用户可以通过配置参数来设置最大连接数、最小连接数、超时时间等。尽管 ...

    Proxool连接池jar包

    5. **CGLIB库(proxool-cglib.jar)**:这是一个代码生成和动态代理库,Proxool使用CGLIB来创建数据库连接的代理类,使得可以在不修改原有代码的情况下,实现对数据库连接的拦截和管理。 6. **Commons Logging库...

    dorado7链接数据库文件

    在这个配置文件中,`&lt;bean id="dataSource"&gt;`定义了一个名为`dataSource`的数据源Bean,该Bean实现了Apache Commons DBCP(Database Connection Pool)的数据源接口。 - **URL**: `jdbc:oracle:thin:@127.0.0.1:...

    dbutils的使用_事务处理_多表操作_oracle大数据处理

    连接池通常有两种实现方式:一种是通过编程实现自定义连接池,通常使用动态代理技术;另一种是利用现有框架或服务器组件,如DBCP(Database Connection Pool)、C3P0或者Tomcat内置的数据源等。 JDBC(Java ...

    spring+hibernate整合需要的一些包

    在Spring AOP(面向切面编程)中,当目标对象没有实现接口时,Spring会使用CGLIB来创建代理对象,实现方法拦截。同时,Hibernate也可能会用到CGLIB来生成动态代理类,尤其是在使用懒加载策略时。 2. **ASM**:ASM是...

    ssh数据库连接池proxool

    2. **Connection Pool**:实际存储数据库连接的对象,根据Pool Profile的配置动态调整连接数量。 3. **Connection Proxy**:当应用程序请求数据库连接时,Proxool返回的是一个代理连接,这个代理连接在实际操作...

    proxool配置参数说明及proxool-0.9.1相关jar包及spring配置方法

    而`proxool-cglib.jar`是代码生成库,主要用于动态代理和增强,Proxool在处理数据库连接时可能需要用到CGLIB进行对象的代理。 **总结** Proxool作为数据库连接池,通过配置参数可以灵活地调整连接池的行为,以满足...

    Durid连接Mycat+MySQL过程中报1243错误的解决办法

    该错误信息是“ERROR com.alibaba.druid.pool.DruidDataSource Line:1243 - discard connection(抛弃连接)”,伴随着“Communications link failure(通信链路故障)”等信息。 一、现象描述 在系统运行过程中,...

    java使用proxool连接mysql数据库

    Proxool 是 Proxy + Pool 的组合,意味着它通过代理机制管理数据库连接池。它在应用和数据库之间创建了一个中间层,处理连接的创建、分配、回收和监控,从而减少了数据库连接的创建和销毁次数,提高了系统的效率。 ...

    mysqlproxool连接池

    例如,使用Apache的DBCP或者C3P0,你可以创建一个代理的数据源实例,然后在需要的时候调用getConnection()方法获取连接。 5. **ProxoolTest示例**: "ProxoolTest"可能是一个包含示例代码的文件,用于演示如何在...

    proxool连接池

    Proxool是一个基于代理的数据库连接池,它通过创建数据库连接的虚拟池来实现连接复用,从而提高系统的运行效率。Proxool的核心思想是将物理数据库连接转换为逻辑连接,这样可以减少创建和关闭物理连接的次数,减轻...

    druid1.2.8 下载 数据库连接池

    - 过滤器机制:Druid提供了丰富的过滤器,如StatFilter用于统计信息,墙过滤器(WallFilter)用于防止SQL注入等安全问题,ProxyDriver、ProxyConnection等实现了透明代理,方便扩展。 3. **Druid-1.2.8版本特性**...

    spring+proxool配置spring+proxool配置

    不过,为了使用Proxool,我们需要将数据源bean替换为Proxool的实现,即`orgproxool.sqltool.PoolManager`。在`beans.xml`中,修改数据源配置如下: ```xml &lt;bean id="dataSource" class="org.springframework.jdbc....

    tomcat-jdbc-notes:Tomcat自带数据库连接池源码阅读

    - `DataSourceProxy`:代理数据源,实现了JDBC的DataSource接口,对外提供服务。 - `AbandonedConfig`:废弃连接的配置,处理超时和检测策略。 - `PoolEntry`:每个数据库连接的封装,包含实际的物理连接。 4. *...

Global site tag (gtag.js) - Google Analytics