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();//回到连接池
    }
    
}
<?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对象

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 本文包括传统JDBC的缺点连接池原理自定义连接池开源数据库连接池DBCP连接池C3P0连接池Tomcat内置连接池...
    廖少少阅读 16,847评论 0 37
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 47,126评论 6 342
  • 一、事务 事务就是一个事情,组成这个事情可能有多个单元,要求这些单元,要么全都成功,要么全都不成功。在开发中,有事...
    野狗子嗷嗷嗷阅读 7,732评论 0 6
  • 1.连接池思想 为什么必须使用数据库连接池: 普通的JDBC数据库连接(Connectiond对象)使用 Driv...
    贾里阅读 4,336评论 0 0
  • 轮胎安全是重中之重 大家都知道热胀冷缩的原理,因此很多人在不同的季节去更改轮胎的胎压。其实没那么麻烦,只要按照...
    聊车咖阅读 1,801评论 0 2

友情链接更多精彩内容