美文网首页
JDBC6 - 连接池

JDBC6 - 连接池

作者: 老茂在北京 | 来源:发表于2017-04-21 21:55 被阅读51次

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

自定义连接池

  • 编写连接池需实现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();//回到连接池
    }
    
}
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql:///day17</property>
        <property name="user">root</property>
        <property name="password">123</property>
    </default-config>
</c3p0-config>
//获得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 配置文件,在配置文件中配置相关信息。

<Context>
  <!-- name为连接池名,可以随便改 -->
  <Resource name="jdbc/EmployeeDB" auth="Container"
            type="javax.sql.DataSource" username="root" password="abc"
            driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql:///day14"
            maxActive="8" maxIdle="4"/>
</Context>
  • 必须先将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 - 连接池

    一次性创建多个连接,将多个连接缓存在内存中 ,形成数据库连接池(内存数据库连接集合),如果应用程序需要操作数据库,...

  • 撩课-JavaWeb之什么是连接池与连接池使用

    什么是连接池 没有连接池的情况 数据库连接池 池 连接池 作用 数据库连接池 示意图 连接池中的属性 连接池使用 ...

  • 代码分析

    interface 相关配置 默认子连接池 定义全局连接池 注册连接池 默认子连接池 连接

  • JDBC 进阶——连接池

    本文包括传统JDBC的缺点连接池原理自定义连接池开源数据库连接池DBCP连接池C3P0连接池Tomcat内置连接池...

  • SSM框架mybatis深入了解(二)

    一、mybatis中的连接池及事务控制 1.mybatis中的连接池使用及分析 1.1 连接池简介连接池是创建和...

  • JDBC进阶学习笔记

    JDBC进阶 JDBC连接池 1. 常见的JDBC连接池 c3p0 开源连接池 druid 阿里的开源数据库连接池...

  • Druid连接池

    第一章 连接池 一.1. 遇到的问题-引出连接池 | | 一.2. 连接池思想 | | 一.3. 连接池的概述 一...

  • JAEE学习笔记(19)事物与连接池

    目录 1.事务2.连接池 1.连接池概念 2.自定义连接池 3.开源连接池(c3p0) 复习: =========...

  • Redis连接池的使用

    1 . 安装 2 . 注册 redis 连接池 使用连接池

  • DBUtiles的使用

    自定义连接池: 学会用resourcebundle来加载properties文件 运用连接池的技术 连接池技术原理...

网友评论

      本文标题:JDBC6 - 连接池

      本文链接:https://www.haomeiwen.com/subject/krddzttx.html