一次性创建多个连接,将多个连接缓存在内存中 ,形成数据库连接池(内存数据库连接集合),如果应用程序需要操作数据库,只需要从连接池中获取一个连接,使用后,并不需要关闭连接,只需要将连接放回到连接池中。
自定义连接池
-
编写连接池需实现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对象
网友评论