数据连接池的使用:
每次连接如果都是新创建出来的,一次连接用完了就释放掉,其实对网络资源比较浪费,因为链接的创建是很占用资源的,如果建立过多的连接会导致内存溢出,此外如果程序异常关闭,从而导致链接不能正常关闭,那么也会有内存泄漏此外,我们希望对已经获取到的链接进行重用,进行用数据库连接池负责分配,管理和释放数据库链接,它允许应用程序重复使用一个现有的数据库连接,而不是每次新建。
※ 自定义链接池
package com.briup.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
//享元模式:获取对象直接给几个对象供给调用
public class JDBCUtils {
private static List<Connection> pool;
static{
Properties pro=new Properties();
try {
pool=new ArrayList<>();
pro.load(
new FileInputStream("src/jdbc.properties"));
Class.forName(pro.getProperty("driver"));
for(int i=0;i<10;i++){
Connection conn=
DriverManager.getConnection(pro.getProperty("url"), pro.getProperty("user"), pro.getProperty("password"));
pool.add(conn);
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static Connection getConn() throws SQLException{
if(pool.size()>0){
Connection conn=pool.get(0);
pool.remove(0);
return conn;
}else{
throw new SQLException("没有连接对象.");
}
}
public static void realseConnection(Connection conn){
pool.add(conn);
}
public static void close(Connection conn,PreparedStatement ps){
try {
if(ps!=null)ps.close();
pool.add(conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Connection conn,PreparedStatement ps,ResultSet rs){
try {
if(rs!=null)rs.close();
if(ps!=null)ps.close();
pool.add(conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Connection conn,Statement ps){
try {
if(ps!=null)ps.close();
pool.add(conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void close(Connection conn,Statement ps,ResultSet rs){
try {
if(rs!=null)rs.close();
if(ps!=null)ps.close();
pool.add(conn);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//文本jdbc.properties
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.43.216:1521:XE
user=jd1812
password=briup
package com.briup.util;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTest {
public static void main(String[] args) {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JDBCUtils.getConn();
String sql="select id,name,age,birth from s_tea";
ps=conn.prepareStatement(sql);
rs=ps.executeQuery();
while(rs.next()){
double id=rs.getDouble(1);
String name = rs.getString(2);
System.out.println(id+"-"+name);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
JDBCUtils.close(conn, ps, rs);
}
}
}
jdbc的数据库连接池使用javax.sql.DataSource来表示
DataSource只是一个接口,该接口通常由服务器提供实现,也有一些开源组织提供实现。
※ 开元链接池
※ A .dbcp数据源
是由apache 提供的数据源实现
步骤:
(1)导入jar包:commons-dbcp、commons-pool、commons-logging
(2)在配置文件中构建配置信息,配置信息如下:
//dbcp.properties
//普通文件没有注释,.properties文件有注释
#连接设置(等号左边的key值不能改)
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.1.102:1521:XE
username=briup
password=briup
#初始化连接数
initialSize=5
#最大连接数
maxActive=5
#最大空闲连接
maxIdle=3
#最小空闲连接
minIdle=2
#超时等待时间 ms
maxWaitMillis=6000
#jdbc 驱动建立连接时除了user和password以外的其他属性
connectionProperties=useUnicode=true;characterEncoding=utf8
#指定由连接池所创建的连接的自动提交状态
defaultAutoCommit=true
#连接创建的连接是只读状态
defaultReadOnly=true
#事务隔离级别
#defaultTransactionIsolation=READ_COMMITED
(3)编写java程序构建Connection
Properties pro = new Properties();
pro.load(new FileInputStream("src/dbcpconfig.properties"));
BasicDataSource bds = BasicDataSourceFactory.createDataSource(pro);
Connection conn = bds.getConnection();
/*
*整个代码
*/
package com.briup.util;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DbcpTest {
public static void main(String[] args) {
try {
Properties pro=new Properties();
pro.load(new FileInputStream("src/dbcp.properties"));
BasicDataSource datasource=
BasicDataSourceFactory.createDataSource(pro);
System.out.println(datasource.getConnection());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//dbcp.properties文件
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.43.216:1521:XE
username=jd1812
password=briup
initialSize=5
maxActive=5
maxIdle=3
minIdle=2
maxWaitMillis=6000
connectionProperties=useUnicode=true;characterEncoding=utf8
defaultAutoCommit=true
package com.briup.util;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class DbcpUtil {
/*
* 为了不用每次都生成不同的Connection
*(Connection对象在客户端允许生成的数量是有限的)
* 静态工厂模式(实体工厂是不用static修饰的)
*
*/
private static BasicDataSource datasource=null;
//懒汉模式:单例(单例有两种模式,饿汉模式直接构建对象
//BasicDataSource datasource=new BasicDataSource();)
//不允许构建对象,只允许调用静态方法(构造器私有)
//
private DbcpUtil(){}
public static Connection getConn() throws Exception{
if(datasource!=null){
synchronized (DbcpUtil.class) {
if(datasource!=null){
Properties pro=new Properties();
pro.load(new FileInputStream("src/dbcp.properties"));
datasource=
BasicDataSourceFactory.createDataSource(pro);
}
}
}
return datasource.getConnection();
}
}
※ B .c3p0数据源
步骤:
(1)导入c3p0的jar包(也在上面链接中)
(1)创建c3p0-config.xml配置文件(必须是c3p0-config.xml文件,名字不能变) 放在类的路径下
(2)配置信息的构建
<c3p0-config>
<named-config name=“oracle”>
<!-- 指定基本属性-->
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@192.168.1.102:1521:XE</property>
<property name="user">briup</property>
<property name="password">briup</property>
<!--连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3-->
<property name="acquireIncrement">5</property>
<!-- 初始化连接数量 ,default : 3-->
<property name="initialPoolSize">5</property>
<!-- 连接池中最小的连接数 ,default : 3-->
<property name="minPoolSize">5</property>
<!-- 连接池中最大的连接数 default : 15-->
<property name="maxPoolSize">5</property>
<!-- 连接池所维护的statement的个数-->
<property name="maxStatements">25</property>
<!-- 每个连接同时可以使用的statement的个数-->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
(3)编写程序获取Connection对象
//参数为配置文件中 某个配置的名字
ComboPooledDataSource ds = new ComboPooledDataSource(“oracle”)
ds.getConnection();
/*
*整个代码
*/
package com.briup.util;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class Conn_c3p0 {
public static void main(String[] args) throws SQLException {
ComboPooledDataSource datasource=
new ComboPooledDataSource("oracle");
System.out.println(datasource.getConnection());
}
}
//输出结果红色字体就是日子文件
package com.briup.util;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
//单列模式中的饿汉模式
public class C3P0Utils {
private static ComboPooledDataSource datasource=
new ComboPooledDataSource("oracle");
private C3P0Utils(){}
public static Connection getConn() throws SQLException{
return datasource.getConnection();
}
}
//c3p0-config.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="oracle">
<!-- 指定基本属性-->
<property name="driverClass">oracle.jdbc.driver.OracleDriver</property>
<property name="jdbcUrl">jdbc:oracle:thin:@192.168.43.216:1521:XE</property>
<property name="user">jd1812</property>
<property name="password">briup</property>
<!--连接池在无空闲连接可用时一次性创建的新数据库连接数,default : 3-->
<property name="acquireIncrement">5</property>
<!-- 初始化连接数量 ,default : 3-->
<property name="initialPoolSize">5</property>
<!-- 连接池中最小的连接数 ,default : 3-->
<property name="minPoolSize">5</property>
<!-- 连接池中最大的连接数 default : 15-->
<property name="maxPoolSize">5</property>
<!-- 连接池所维护的statement的个数-->
<property name="maxStatements">25</property>
<!-- 每个连接同时可以使用的statement的个数-->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>