JDBC6 - 连接池

一次性创建多个连接,将多个连接缓存在内存中 ,形成数据库连接池(内存数据库连接集合),如果应用程序需要操作数据库,只需要从连接池中获取一个连接,使用后,并不需要关闭连接,只需要将连接放回到连接池中。

自定义连接池

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

    • Connection getConnection()
    • Connection getConnection(String username, String password)
  • 实现DataSource接口,并实现连接池功能的步骤:

    • 在DataSource构造函数中批量创建与数据库的连接,并把创建的连接保存到一个集合对象中
    • 实现getConnection方法,让getConnection方法每次调用时,从集合对象中取一个Connection返回给用户。
    • 当用户使用完Connection,调用Connection.close()方法时,Connection对象应保证将自己返回到连接池的集合对象中,而不要把conn还给数据库。

开源数据库连接池

  • DBCP
  • C3P0(必会) 有自动回收功能
DBCP
  • 添加jar包
    • Commons-dbcp.jar 连接池的实现
    • Commons-pool.jar 连接池实现的依赖库
  • 手动配置(手动编码)
  • 自动配置(配置文件)
public class DbcpTest { 
    //手动配置
    @Test
    public void test1() throws Exception{
        BasicDataSource bds = new BasicDataSource();
        //需要设置连接数据库最基本四个条件
        bds.setDriverClassName("com.mysql.jdbc.Driver");
        bds.setUrl("jdbc:mysql:///day18");
        bds.setUsername("root");
        bds.setPassword("abc");
        
        //得到一个Connection
        Connection con = bds.getConnection();
        
        ResultSet rs = con.createStatement().executeQuery(
                "select * from account");       
        while(rs.next()){
            System.out.println(rs.getInt("id"));
        }   
        rs.close();
        con.close();//回到连接池
    }

//自动配置
    @Test
    public void test2() throws Exception{
        Properties props = new Properties();
        
//      props.setProperty("driverClassName","com.mysql.jdbc.Driver" );
//      props.setProperty("url", "jdbc:mysql:///day17");
//      props.setProperty("username", "root");
//      props.setProperty("password", "123");
        FileInputStream fs = new FileInputStream("C:\\Users\\limaoquan\\Desktop\\Java\\JavaWeb\\day18_1\\src\\dbcp.properties");
        props.load(fs);
        DataSource ds = BasicDataSourceFactory.createDataSource(props);
        
        //得到一个Connection
        Connection con = ds.getConnection();
                
        ResultSet rs = con.createStatement().executeQuery(
                        "select * from account");       
        while(rs.next()){
            System.out.println(rs.getInt("id"));
        }   
        rs.close();
        con.close();//回到连接池
    }
}
C3p0连接
  • 添加jar包
    • c3p0-0.9.1.2.jar
  • 手动配置
  • 自动配置
    • properties
    • xml
    • 配置文件如果叫做 c3p0.properties or c3p0-config.xml, 并且放置在classpsth路径(对于web应用就是classes目录)下。那么c3p0会自动查找。也就是说,只需要将文件放置在src下就可以。
public class c3p0Test {
    
    //手动配置
    public void test1() throws PropertyVetoException, SQLException{
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        
        cpds.setDriverClass("com.mysql.jdbc.Driver");
        cpds.setJdbcUrl("jdbc:mysql:///day17");
        cpds.setUser("root");
        cpds.setPassword("123");
        
        //得到一个Connection
        Connection con = cpds.getConnection();
                
        ResultSet rs = con.createStatement().executeQuery(
                        "select * from account");       
        while(rs.next()){
            System.out.println(rs.getInt("id"));
        }   
        rs.close();
        con.close();//回到连接池
    }
    
    //自动配置,使用配置文件,自动读取配置文件
    @Test
    public void test2() throws SQLException{
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        
        //得到一个Connection
        Connection con = cpds.getConnection();
                
        ResultSet rs = con.createStatement().executeQuery(
                        "select * from account");       
        while(rs.next()){
            System.out.println(rs.getInt("id"));
        }   
        rs.close();
        con.close();//回到连接池
    }
    
}


    
        com.mysql.jdbc.Driver
        jdbc:mysql:///day17
        root
        123
    

//获得classes路径
String path = this.getClass().getResource("/").getPath();
System.out.println(path);

tomcat内置连接池管理

tomcat 服务器内置连接池(使用Apache DBCP)

配置tomcat内置连接池,通过JNDI去访问tomcat的内置连接池

JNDI Java命名和目录接口,是javaEE一项技术,允许一个Java对象绑定到一个JNDI容器(tomcat)中,并且为对象指定一个名称。

question1:tomcat 怎么管理连接池?

只需要创建一个 context.xml 配置文件,在配置文件中配置相关信息。


  
  

  • 必须先将mysql驱动jar包 复制tomcat/lib下
  • 在tomcat启动服务器时,创建连接池对象,绑定 jdbc/EmployeeDB 指定名称上
question2: context.xml 放在哪?

context元素有三种常见配置位置

  • tomcat/conf/context.xml 所有虚拟主机,所有工程都可以访问该连接池
  • tomcat/conf/Catalina/localhost/context.xml 当前虚拟主机(localhost)下所有工程都可以使用该连接池
  • 当前工程/META-INF/context.xml 只有当前工程可以访问该连接池
question3: 如何获取内置连接池

在Servlet中获取连接池对象

Context context = new InitialContext();
Context envCtx = (Context)context.lookup("java:comp/env");// 固定路径
DataSource datasource = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //通过绑定名称,查找指定java对象

你可能感兴趣的:(JDBC6 - 连接池)