编写连接池需实现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
}
分享到:
相关推荐
总结来说,通过Java的动态代理机制,我们可以创建一个透明的数据库连接代理,接管`Connection.close()`方法,以实现更灵活、低耦合的数据库连接池管理。这种方法不仅简化了用户接口,还增强了系统的可维护性和扩展性...
"Java 实现 DataSource 实例" ...本文介绍了 Java 中的 DataSource 实现,包括了数据源的概念、实现原理、代理模式的应用等内容。通过自定义的数据源类,可以实现对数据库的高效访问和管理,提高系统的性能和可靠性。
在Java中,代理模式主要分为静态代理和动态代理两种。 在本主题“代理模式之静态代理---数据库连接池对象实现原理”中,我们将探讨如何使用静态代理来实现数据库连接池。数据库连接池是现代应用中常用的优化手段,...
以Druid为例,Druid提供了一个名为`com.alibaba.druid.pool.DruidDataSource`的类,它是数据库连接池的实现。这个类通过内部的代理机制,监控并管理每个数据库连接的生命周期。当应用程序通过`DruidDataSource.get...
JDK代理基于接口实现,可以在运行时动态生成代理类;CGLib代理则是通过字节码技术生成目标对象的子类,适用于无接口的情况。 总的来说,Java基础学习涵盖了数据库连接池的使用、加密算法的理解以及代理模式的应用等...
2. **第三方框架集成的连接池**:如Spring框架中的DataSource,它支持多种连接池实现,如HikariCP、Druid、Tomcat JDBC Pool等,这些连接池性能优秀,且与Spring框架高度集成,便于管理和配置。 3. **自定义连接池...
DBCP 是 Apache Commons 项目的一部分,它基于 Jakarta-pool 实现。DBCP 提供了一个基础的数据源类 `BasicDataSource`,负责管理数据库连接。用户可以通过配置参数来设置最大连接数、最小连接数、超时时间等。尽管 ...
5. **CGLIB库(proxool-cglib.jar)**:这是一个代码生成和动态代理库,Proxool使用CGLIB来创建数据库连接的代理类,使得可以在不修改原有代码的情况下,实现对数据库连接的拦截和管理。 6. **Commons Logging库...
在这个配置文件中,`<bean id="dataSource">`定义了一个名为`dataSource`的数据源Bean,该Bean实现了Apache Commons DBCP(Database Connection Pool)的数据源接口。 - **URL**: `jdbc:oracle:thin:@127.0.0.1:...
连接池通常有两种实现方式:一种是通过编程实现自定义连接池,通常使用动态代理技术;另一种是利用现有框架或服务器组件,如DBCP(Database Connection Pool)、C3P0或者Tomcat内置的数据源等。 JDBC(Java ...
在Spring AOP(面向切面编程)中,当目标对象没有实现接口时,Spring会使用CGLIB来创建代理对象,实现方法拦截。同时,Hibernate也可能会用到CGLIB来生成动态代理类,尤其是在使用懒加载策略时。 2. **ASM**:ASM是...
2. **Connection Pool**:实际存储数据库连接的对象,根据Pool Profile的配置动态调整连接数量。 3. **Connection Proxy**:当应用程序请求数据库连接时,Proxool返回的是一个代理连接,这个代理连接在实际操作...
而`proxool-cglib.jar`是代码生成库,主要用于动态代理和增强,Proxool在处理数据库连接时可能需要用到CGLIB进行对象的代理。 **总结** Proxool作为数据库连接池,通过配置参数可以灵活地调整连接池的行为,以满足...
该错误信息是“ERROR com.alibaba.druid.pool.DruidDataSource Line:1243 - discard connection(抛弃连接)”,伴随着“Communications link failure(通信链路故障)”等信息。 一、现象描述 在系统运行过程中,...
Proxool 是 Proxy + Pool 的组合,意味着它通过代理机制管理数据库连接池。它在应用和数据库之间创建了一个中间层,处理连接的创建、分配、回收和监控,从而减少了数据库连接的创建和销毁次数,提高了系统的效率。 ...
例如,使用Apache的DBCP或者C3P0,你可以创建一个代理的数据源实例,然后在需要的时候调用getConnection()方法获取连接。 5. **ProxoolTest示例**: "ProxoolTest"可能是一个包含示例代码的文件,用于演示如何在...
Proxool是一个基于代理的数据库连接池,它通过创建数据库连接的虚拟池来实现连接复用,从而提高系统的运行效率。Proxool的核心思想是将物理数据库连接转换为逻辑连接,这样可以减少创建和关闭物理连接的次数,减轻...
- 过滤器机制:Druid提供了丰富的过滤器,如StatFilter用于统计信息,墙过滤器(WallFilter)用于防止SQL注入等安全问题,ProxyDriver、ProxyConnection等实现了透明代理,方便扩展。 3. **Druid-1.2.8版本特性**...
不过,为了使用Proxool,我们需要将数据源bean替换为Proxool的实现,即`orgproxool.sqltool.PoolManager`。在`beans.xml`中,修改数据源配置如下: ```xml <bean id="dataSource" class="org.springframework.jdbc....
- `DataSourceProxy`:代理数据源,实现了JDBC的DataSource接口,对外提供服务。 - `AbandonedConfig`:废弃连接的配置,处理超时和检测策略。 - `PoolEntry`:每个数据库连接的封装,包含实际的物理连接。 4. *...