JDBC连接池

主要内容:

  • 介绍数据库连接池
  • 需要的接口和方法
  • 实现步骤

一.数据库连接池:

1. 预先向数据库申请多个可用的数据库连接,保存到集合对象中,应用程序每次从集合对象中取出可用的数据库连接,执行数据库操作;操作完成后将连接放回集合对象。实现了数据库连接的复用。

2.数据库连接的建立是整个数据库操作中最耗时的操作,我们只做一次数据库操作就开关一次数据库连接,这样是很影响效率的
     3.我们是不是可以这样,每次从某一个缓存的地方获取一个数据库连接,使用完之后再归还到那个缓存的地方,不真正意义上的关闭连接

二.编写连接池需实现java.sql.DataSource接口。DataSource接口中定义了两个重载的getConnection方法:

1.Connection getConnection()

2.Connection getConnection(String username, String password)

三.实现DataSource接口,并实现连接池功能的步骤:

1.在DataSource构造函数中批量创建与数据库的连接,并把创建的连接加入LinkedList对象中。

  1. 实现getConnection方法,让getConnection方法每次调用时,从LinkedList中取一个Connection返回给用户。
  2. 当用户使用完Connection,调用Connection.close()方法时,Collection对象应保证将自己返回到LinkedList中,而不要把conn还给数据库。Collection保证将自己返回到LinkedList中是此处编程的难点。

数据库连接池实例:

 1 public class SimpleDataSource {
 2     private static LinkedList<Connection> connPool=null;
 3
 4     public static void main(String[] args){
 5         new SimpleDataSource();
 6
 7     }
 8
 9    public SimpleDataSource(){
10        try{
11         Class.forName("com.mysql.jdbc.Driver");
12         connPool=new LinkedList<Connection>();
13         for(int i=0;i<10;i++){
14         Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?" ,"h3","111111");
15         connPool.add(conn);
16        System.out.println(conn);
17         }
18        }catch(Exception e){
19            e.printStackTrace();
20     }
21  }
22     public Connection getconn(){//从linkedlist 返回一个connection对象
23         return connPool.removeLast();
24     }
25
26     public void closeConn(Connection conn){//"关闭"数据库连接,不是正真意义上的关闭
27         connPool.add(conn);
28      }
29
30     public void printPoolSize(){
31         System.out.println("连接池size:"+connPool.size());
32     }
33
34     public void releasePool()throws Exception{//关闭每一个链接;关闭数据库连接,真正的关闭
35         Iterator it=connPool.iterator();
36         Connection conn=null;
37         while(it.hasNext()){}
38         conn=(Connection)it.next();
39         conn.close();
40     }
41  }

测试数据库连接池:

 1 public class TestPool {
 2    public static void main(String[] args){
 3       try{
 4        SimpleDataSource sds=new SimpleDataSource();
 5       // sds.releasePool();//关闭数据库连接
 6
 7        Connection conn=sds.getconn();
 8        System.out.println("connection used.........."+conn);
 9        sds.printPoolSize();
10
11        queryEmp(conn);
12        sds.closeConn(conn);
13        sds.printPoolSize();
14        System.out.println("");
15       }catch(Exception e){
16               e.printStackTrace();
17         }
18    }
19
20    public static void queryEmp(Connection conn){
21       try{
22           String sql="select * from employees";
23           Statement stmt=conn.createStatement();
24           ResultSet rs=stmt.executeQuery(sql);
25           while(rs.next()){
26               System.out.print("工号:"+rs.getInt(1));
27               System.out.println("工号:"+rs.getString("last_name"));
28            }
29             rs.close();
30         }catch(Exception e){
31           e.printStackTrace();
32       }
33    }
34 }

DBCP数据库连接池:

BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("org.gjt.mm.mysql.Driver");
bds.setUrl("jdbc:mysql:///test");
bds.setUsername("root");
bds.setPassword("123456");
bds.setInitialSize(1);
bds.setMaxActive(1);
//bds.setMinIdle(1);
Connection con = bds.getConnection();
System.out.println(con);
con.close();
con = bds.getConnection();
System.out.println(con);
con.close();

C3P0数据库连接池:

ComboPooledDataSource cds = new ComboPooledDataSource();
cds.setDataSourceName("org.gjt.mm.mysql.Driver");
cds.setJdbcUrl("jdbc:mysql:///test");
cds.setUser("root");
cds.setPassword("123456");
cds.setInitialPoolSize(10);
cds.setMaxPoolSize(50);
cds.setMinPoolSize(2);
cds.setMaxStatements(200);
Connection con = cds.getConnection();
System.out.println(con);
con.close();

时间: 2024-10-07 00:11:45

JDBC连接池的相关文章

号称性能最好的JDBC连接池:HikariCP

HikariCP号称是现在性能最好的JDBC连接池组件,具体的性能到底如何,我也没有仔细的测试过,不过从它现在的发展来看,其可能确实如它宣传的那样其性能高过目前所有的连接池组件.之前对连接池的记忆一直都是C3P0.DBCP.BoneCP,这三者中BoneCP的性能是最好的,C3P0的性能在现在来说确实是非常差的了,好像C3P0很久都没有更新了,所以我们应该杜绝在项目中使用C3P0,至于是否要使用HikariCP,我觉得可以尝试.HikariCP毕竟是才出来不久,其性能到底如何,也需要实践的检验,

JDBC连接池的简单实现

先说明一下,我本身是做android开发的,java web是我的弱项,只是近来京东云免费,于是去折腾了几下,有了些许经验,特作分享.如果文章中内容有误,还请各高手指正. 我在web端,需要连接数据库进行查询插入等操作,但是每次进行操作都先获取连接用完后就断开的话,未免效率太低.以前知道tomcat中可以配置,但是京东云引擎的tomcat并不能由自己配置.因为我折腾的东西较小,所以也不考虑使用框架,于是就想自己写一个. 我写的连接池很简单,在初始化时创建5个连接,并放在一个列表当中.如果要获取连

使用了Tomcat JDBC连接池不能重连的问题

在项目中用到了tomcat 的jdbc连接池,发现一个问题是,当数据库重启时,服务没有重新的去连接数据库,需要将部署的项目重新启动才能连接到数据库.经过测试对配置做一下修改: 在配置dataSource的地方加入两个配置属性: <property name="testOnBorrow" value="true"/> <!--在连接返回给调用者前用于校验连接是否有效的SQL语句,如果指定了SQL语句,则必须为一个SELECT语句,且至少有一行结果--

JDBC连接池C3P0

连接池 1)传统方式找DriverManager要连接,数目是有限的. 2)传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的桥梁,即无发送到SQL命令到数据库端执行 3)项目中,对于Connection不说,不会直接使用DriverManager取得,而使用连接池方式. 4)DBCP和C3P0,都是Java开源的,都必须直接或间接实现javax.sql.DataSource接口 5)DBCP连接池需要dbcp.properties文件,同时需加入3个对应的j

数据层优化-jdbc连接池简述、druid简介

终于回到既定轨道上了,这一篇讲讲数据库连接池的相关知识,线程池以后有机会再结合项目单独写篇文章(自己给自己挖坑,不知道什么时候能填上),从这一篇文章开始到本阶段结束的文章都会围绕数据库和dao层的优化去写,本篇是一个开始.本文会介绍连接池技术并对比目前比较流行的java连接池技术,之后,会把druid整合到项目中来,将技术方案落地,实际整合到项目中,让技术能为我所用. 使用连接池的原因 jdbc的demo //第一步,注册驱动程序 //com.MySQL.jdbc.Driver Class.fo

JDBC连接池概述

Reference Source:https://www.progress.com/tutorials/jdbc/jdbc-jdbc-connection-pooling 介绍 本文档提供的信息旨在帮助开发人员为必须处理连接池的应用程序提供连接池策略. 首先, 本文档提供 jdbc 3.0 规范指定的 jdbc 连接池概述. 接下来, 它提供了一些示例, 说明如何使用 DataDirect 连接池管理器 (它随 DataDirect Connect?用于jdbc 和 DataDirect Seq

Spring boot (11) tomcat jdbc连接池

默认连接池 tomcat jdbc是从tomcat7开始推出的一个连接池,相比老的dbcp连接池要优秀很多,spring boot将tomcat jdbc作为默认的连接池,只要在pom.xml中引入了spring boot的jdbc组件,就会自动引入tomcat jdbc连接池. 默认参数 以下是org.apache.tomcat.jdbc.pool.PoolProperties源码,这是tomcat jdbc连接池的默认初始参数.这个类实现了一个接口PoolConfiguration,查看这个

JDBC连接池(数据源)

自定义连接池:用装饰设计模式将原连接的close方法改造成将连接还回数据源:装饰设计模式:http://www.cnblogs.com/tongxuping/p/6832518.html: 开源数据库连接池: C3P0连接池: 基本步骤: 1.导入开发包           2.创建数据库连接池         ComboPooledDataSource cpds = new ComboPooledDataSource();           3.配置基本的连接信息              

JDBC 连接池

数据库连接池(connection pool) JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开发,存在的问题: 数据库的连接资源并没有得到很好的重复利用. 对于每一次数据库连接,使用完后都得断开. 这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃. 数据库连接池 数据库连接池的基本思

MySql &amp; JDBC &amp; 连接池 &amp; 总结

连接池:解决资源浪费,提高代码性能. 本小节目标: 使用DBCP,C3P0连接池完成基本数据库的操作. 使用DBUtils完成CRUD的操作. 数据库连接池的解决方案是: 当应用程序启动时,系统主动建立足够的数据库连接,并将这些连接组成一个连接池.每次应用程序请求数据库连接时,无须重新打开连接,而是从连接池中取出已有的连接使用,使用完后不再关闭数据库连接,而是直接将连接归还给连接池.通过使用连接池,将大大提高程序的运行效率. 数据库连接池是Connection 对象的工程.数据库连接池的常用参数