JDBC6 - 连接池

2017-04-21  本文已影响51人  老茂在北京

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

自定义连接池

开源数据库连接池

DBCP
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连接
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>
question2: context.xml 放在哪?

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

question3: 如何获取内置连接池

在Servlet中获取连接池对象

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

上一篇 下一篇

猜你喜欢

热点阅读