因为每次数据库连接的创建和销毁都比较耗时耗力。因此基本策略时候使用JDBC连接池来管理所有的连接。
一般connection pool 只是一个 LinkedList 即可。
比如我们自己写一个javax.sql.DataSource的实现类,类中有一个private变量: LinkedList<Connection> pool = new LinkedList<Connection>();
可以写一个静态代码快来初始化pool变量: 如新建10个Conncetion。
- private static LinkedList<Connection> pool = new LinkedList<Connection>();
- static{
- //初始化DriverManager
- //......
- for(int i=0; i<10; i++){
- Connection conn = DriverManager.getConnection(url, username,password);
- pool.add(conn);
- }
- }
当客户端调用dataSource.getConnection() 时并不新建Connection, 而是从pool中取出一个Connection实例传给客户端。
但是,当客户端调用connection.close(); 函数时, 我们应实现将次connection还回pool中,而不是真的关闭connection。但是connection.close() 函数本是被Driver实现的(mysql 的话是mysql的driver, oracle的话是oracle的driver。我们是无法改变driver内部的实现的。解决方案只能是外部对close() 方法的重写或扩展。
解决方案:
(一). 装饰模式
被改写类: com.mysql.jdbc.Connection
编写一个类CustomedConnection 实现与com.mysql.jdbc.Connection 相同的接口(java.sql.Conneciton)
- public class CustomedConnection implements java.sql.Connection{
- private Connection sqlConnection ;
- private LinkedList<Connection> pool;
- public CustomedConnection(Connection sqlConnection, LinkedList<Connection> pool){
- this.sqlConnection = sqlConnection;
- this.pool = pool;
- }
- public void close(){
- this.pool.add(sqlConnection);
- }
- // ......
- //java.sql.Connection 的其他方法的实现都直接调用sqlConnection的实现即可。除了close() 方法。
- // ......
- }
DataSource 的实现中:
- public synchronized Connection getConnection() throws SQLException{
- if(pool.size()>0){
- Connection conn = pool.remove();//从池中拿出一个connection
- CustomedConnection customedConnection = new CustomedConnection(conn, pool);
- return customedConnection;
- }
- else{
- throw new RuntimeException(“sorry, server busy”);
- }
- }
(二). 适配器模式
- public class ConnectionAdaptor implements Connection{
- private Connection conn;
- public ConnectionAdaptor(Connection conn){
- this.conn=conn;
- }
- //重写所有Connection的方法:都直接调用conn的响应方法即可。
- //......
- }
- //接下来写一个CustomedConnection 继承此适配器:
- public class CustomedConnection extends ConnectionAdaptor {
- private LinkedList<Connection> pool ;
- public CustomedConnection(Connection conn, LinkedList<Connection> pool){
- super(conn);
- this.pool = pool;
- }
- //重写close() 方法即可
- //......
- }
(三).动态代理
在实现DataSource的getConnection()方法里,拦截Connection的所有方法,如果方法名为close, 则改变其原本逻辑:
- public synchronized Connection getConnection(){
- if(pool.size()>0){
- final Connection conn = pool.remove();
- return Proxy.newProxyInstance(conn.getClass().getClassLoader(), conn.getClass().getInterfaces(), new InvocationHandler(){
- @Override
- public Object invoke(Object proxy, Method method, Object[] args){
- if("close".equals(methode))
- return pool.add(conn);
- else
- return method.invoke(proxy, args);
- }
- }
- );
- }
- }
相关推荐
Tongweb5是一款基于Java的Web应用服务器,它支持配置JDBC连接池来管理数据库连接。本文将详细介绍如何在Tongweb5中配置JDBC连接池,以及Web应用如何通过JNDI(Java Naming and Directory Interface)查找并使用这些...
在IT行业中,数据库连接管理是应用系统性能优化的关键环节之一,而JDBC连接池就是解决这一问题的有效工具。本文将详细讲解JDBC连接池的工作原理、配置方法以及如何通过优化来提升连接速度。 JDBC(Java Database ...
在Java开发中,数据库操作是不可或缺的一部分,而JDBC连接池是提高数据库访问效率、优化系统资源使用的重要技术。本文将深入探讨JDBC连接池的概念、工作原理,并以"通用basedao"模板为例,讲解如何在实际项目中应用...
本实例提供了完美的Java JDBC连接池配置,适用于Oracle、MySQL和SQL Server等主流数据库,允许开发者轻松地在不同数据库之间切换方言。 首先,让我们了解什么是JDBC连接池。JDBC(Java Database Connectivity)是...
JDBC(Java Database Connectivity)是Java平台中用于与数据库交互的一组接口和类,而JDBC连接池就是在这个基础上实现的一种优化策略。本文将详细介绍JDBC连接池驱动的相关知识,主要涉及`mysql-connector-java-...
本示例中的"简单的jdbc连接池类"实现了一个基本的数据库连接池功能,非常适合初学者理解和实践。 首先,我们来理解`jdbc`。JDBC(Java Database Connectivity)是Java语言用来与各种数据库进行交互的一种标准接口。...
HikariCP是一款高效、高性能的Java JDBC连接池,它被设计为替代传统连接池如C3P0和DBCP,以提供更快、更稳定的数据访问性能。在HikariCP v3.4.5这个版本中,我们可以深入探讨其在数据库连接管理、性能优化以及配置...
Java JDBC连接池是一种高效管理数据库连接的技术,它允许应用程序重复使用已经建立的数据库连接,从而减少频繁创建和关闭连接带来的开销。在大型系统中,尤其是高并发环境下,使用连接池能够显著提升性能并降低资源...
而JDBC连接池是一种管理资源的技术,它能有效地管理和复用数据库连接,提高系统性能并减少系统资源的消耗。在Java应用中,常见的连接池实现有DBCP、C3P0、HikariCP、Druid等。 标题"完美的java jdbc连接池实例.zip...
**JDBC连接池BoneCP_Demo详解** 在Java开发中,数据库操作是不可或缺的一部分,而JDBC(Java Database Connectivity)是Java与数据库交互的标准接口。然而,直接使用JDBC进行数据库连接管理可能会导致资源浪费,...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点包括: 1. **连接测试**:C3P0提供了多种测试策略,确保获取到的连接是可用的。 2. **连接池初始化和最大...
JDBC连接池是一种资源管理机制,它允许应用程序重复使用已建立的数据库连接,而不是每次需要时都创建新的连接。这显著提高了性能,减少了系统资源的消耗,并有助于避免由于过多的数据库连接导致的问题。在Tomcat早期...
**JDBC连接池DBCP详解** Java数据库连接池(JDBC Connection Pool)是Java应用程序管理数据库连接的一种机制,它能够有效地提高数据库访问效率并优化资源使用。DBCP(Jakarta DBCP,又称为Apache Commons DBCP)是...
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。C3P0的主要特点包括: 1. **自动管理数据库连接**:C3P0会自动创建、配置和管理数据库连接,避免了频繁创建和销毁连接...
关于jdbc连接池连接数据库的原理
BeeCP,一个小型JDBC连接池:高性能,轻量级代码和良好的稳定性。支持主要流行的数据库驱动程序。支持 XAConnection/JTA。池功能:CAS、单连接缓存、队列复用、非移动等待自旋、异步加法、安全关闭、Web 监控等。...
这是我写的一个对JDBC连接池的实现,高手见了可不要笑啊!!!! 程序是在linux下用Eclipse下编写的. 用Jude进行建模,数据库使用了mysql. 程序自带了MySql的Connection连接驱动类,你也可以使用别的驱动类和数据库, 在src/...
jdbc连接池代码详解
jdbc连接池属性介绍,