• 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();

  • 相关阅读:
    maven超级pom内容
    elasticsearch日志删除命令
    maven 设置跳过测试
    centos7.4 开启ftp服务
    部分Linux时区改为东八区的方法
    docker overlay存储驱动介绍(传送门)
    HotSpot学习(一)——如何下载openjdk源码
    nginx 代理静态资源报 403
    【转载】C#通过遍历DataTable的列获取所有列名
    【转载】C#通过Remove方法移除DataTable中的某一列数据
  • 原文地址:https://www.cnblogs.com/wuziyue/p/4846628.html
Copyright © 2020-2023  润新知