- 数据库连接池:存放数据库连接的容器
- 当系统初始化后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完后,连接对象会放回容器
- 用接口datasource(javax.sql包下)
- 获取连接:用其中的getconnection()
- 归还连接:若连接对象时从连接池中获取的,则该连接对象调用close方法时不会关闭连接,而是归还连接
- 数据库连接池实现技术:c3p0(比较老),druid(阿里的,高效)
- 下面是c3p0技术的实现并获取数据库连接对象
package hj.jdbc;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class day6 {
public static void main(String[] args) {
DataSource s=new ComboPooledDataSource();//使用默认配置(即不传参),创建数据库连接池对象
DataSource s1=new ComboPooledDataSource("mysql");//使用指定名称配置(即传参),
// 创建数据库连接池对象(指定名称配置方便连接不同数据库,而且可根据需求配置不同的最大连接数等参数)
try {
for (int i = 0; i < 15; i++) {//在xml文件中设置了最大连接数为10个,即使要获取超过10个连接对象,那也只能获取10个对象
Connection connection = s1.getConnection();//获取数据库连接对象
System.out.println(i+":"+connection);
// if (i==4)
// connection.close();//当第五个连接对象归还给连接池后,可以出现11个连接对象,但是有两个对象时一样的
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
下面是c3p0简单的配置文件c3p0-config.xml
注:c3p0实现技术的配置文件只能叫c3p0-config.xml或者c3p0.properties
该文件中的数据库驱动,用户名,密码,数据库名等应根据自己实际进行重新修改
<c3p0-config>
<default-config>
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/ss?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<property name="initialPoolSize">10</property>
<!--最大存活时间 -->
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">10</property>
<property name="minPoolSize">1</property>
<!--statements缓存大小 -->
<property name="maxStatements">500</property>
</default-config>
<named-config name="mysql">
<property name="driverClass">com.mysql.cj.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/ss?serverTimezone=UTC</property>
<property name="user">root</property>
<property name="password">123456</property>
<!--当池中的连接耗尽的时候,c3p0一次性增加的连接数量,默认为3 -->
<property name="acquireIncrement">5</property>
<property name="initialPoolSize">10</property>
<!--连接池的最小连接数 -->
<property name="minPoolSize">1</property>
<!--连接池的最大连接数 -->
<property name="maxPoolSize">15</property>
</named-config>
</c3p0-config>
下面是简单的druid技术的配置文件druid.properties
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/ss ?serverTimezone=UTC
username=root
password=123456
#初始化连接数
initialSize=5
#最大连接数
maxActive=10
#最大等待时间
maxWait=3000
下面是用druid技术定义的简单的工具类(其中已实现加载druid.properties配置文件)
package hj.jdbc;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class druidutils {
private static DataSource dataSource;
static{
Properties s=new Properties();
InputStream resourceAsStream = day7.class.getClassLoader().getResourceAsStream("druid.properties");
try {
s.load(resourceAsStream);//加载配置文件
} catch (Exception e) {
e.printStackTrace();
}
try {
dataSource = DruidDataSourceFactory.createDataSource(s);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getconnection() throws SQLException {//获取连接对象
return dataSource.getConnection();
}
public static void close(PreparedStatement psmt, Connection con, ResultSet rs){
if (psmt!=null){
try {
psmt.close();
} catch (SQLException e) {
e.printStackTrace();
} if (con!=null){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
} if (rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
public static void close1(PreparedStatement psmt,Connection con) {
// if (psmt != null) {
// try {
// psmt.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// if (con != null) {
// try {
// con.close();
// } catch (SQLException e) {
// e.printStackTrace();
// }
// }
// }
close(psmt,con,null);
}
public static DataSource getDataSource(){//获取连接池方法
return dataSource;
}
}
下面是用druid技术来对数据库进行简单的修改操作
package hj.jdbc;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class druid {
public static void main(String[] args) {
Connection getconnection=null;
PreparedStatement preparedStatement=null;
try {
getconnection = druidutils.getconnection();
String sql="update s set name=? where name=?";
preparedStatement = getconnection.prepareStatement(sql);
preparedStatement.setString(1,"王炸");
preparedStatement.setString(2,"张三");
int i = preparedStatement.executeUpdate();
System.out.println(i);
} catch (SQLException e) {
e.printStackTrace();
}finally {
druidutils.close1(preparedStatement,getconnection);
}
}
}