数据库连接池
Posted xfdhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库连接池相关的知识,希望对你有一定的参考价值。
连接池简介
1、连接池是创建和管理一个连接的缓冲池的技术,这些连接准备好被任何需要它们的线程使用。
作用:避免频繁地创建与消毁,给服务器减压力。
2、数据库的弊端:
1.当用户群体少服务器可以支撑,如果群体比较大万级别服务器直接死机。数据库默认的并发访问50.
2.每一个用完数据库之后直接关闭,不能重复利用太浪费资源。
3、设计连接池:
1.在池子中创建出多个连接供使用。
2.当用户需要操作数据库时直接从池子中获取连接即可。
3.当用户使用完毕之后把连接归还给连接池,可以达到重复使用。
4.可以设定池子的最大容器。比如50个连接,当第51个人访问的时候,需要等待。
5.其它用户释放资源的时候,可以使用。
4、手动实现连接池
import java.io.IOException; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; public class JDBCTool private static Connection conn; private static String driverName; private static String username; private static String url; private static String password; static InputStream is = JDBCTool.class.getClassLoader().getResourceAsStream("qq.properties"); Properties prop = new Properties(); try prop.load(is); catch (IOException e) e.printStackTrace(); driverName = (String)prop.get("driverClassName"); username = (String)prop.get("username"); url = (String)prop.get("url"); password = (String)prop.get("password"); try Class.forName(driverName); catch (Exception e) e.printStackTrace(); public static Connection getConn() try conn = DriverManager.getConnection(url, username, password); catch (SQLException e) e.printStackTrace(); return conn; public static void close(Connection conn,PreparedStatement ps,ResultSet rs) if(conn!=null) try conn.close(); catch (SQLException e) e.printStackTrace(); if(ps!=null) try ps.close(); catch (SQLException e) e.printStackTrace(); if(rs!=null) try rs.close(); catch (SQLException e) e.printStackTrace();
import java.sql.Connection; import java.util.ArrayList; import java.util.List; public class MyJDBCPool /* 1.定义一个容器 集合 2.初始化连接,并放在池子中。 3.创建一个从容器中获取连接的方法 4.创建一个归还连接的方法。*/ private static List<Connection> pool = new ArrayList<>(); private static int List_size = 3; static for(int i=0;i<List_size;i++) Connection conn=null; conn = JDBCTool.getConn(); pool.add(conn); System.out.println("当前存放连接为:"+conn+",当前池子中剩余连接数为:"+pool.size()); System.out.println("====================="); //取出一个连接 要判断是否为空 public static Connection getConn() throws NullPointerException if(pool.isEmpty()) System.out.println("请等待"); throw new NullPointerException("已经空了,别拿了"); Connection conn = pool.remove(0); System.out.println("当前取出的连接为:"+conn+",当前剩余连接数为:"+pool.size()); return conn; //归还连接 要判断是否为真正的连接 public static void returnConn(Connection conn) if(conn==null) System.out.println("你玩我?"); return; pool.add(conn); System.out.println("当前存入的连接为:"+conn+",当前剩余连接数为:"+pool.size());
import java.sql.Connection; public class Test1 public static void main(String[] args) Connection conn = MyJDBCPool.getConn(); Connection conn1 = MyJDBCPool.getConn(); Connection conn2 = MyJDBCPool.getConn(); MyJDBCPool.returnConn(conn2); MyJDBCPool.returnConn(conn1); MyJDBCPool.returnConn(conn);
注:这里涉及到一个properties文件,文件内容是key =value形式存在的,先使用类加载器(或输入流)将文件加载进来,然后使用properties对象处理文件,使用get()方法获取内容。
常用连接池
1、导入连接池的步骤
导包 buildpath
配置文件 properties
加载文件流,使用properties处理文件
使用连接池的API读取prop对象,创建连接池
getConnection获取连接
返回连接的引用
2、dbcp连接池 开源连接池,效率高,但安全性不强
工具包下载地址:http://commons.apache.org/proper/commons-pool/download_pool.cgi
http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi
导包 commons-dbcp 和commons-pool mysql-connection
配置文件导入*.properties 建议放在src根目录
import java.sql.Connection; import org.apache.commons.dbcp.BasicDataSource; public class Test1 public static void main(String[] args) throws Exception BasicDataSource bds = new BasicDataSource(); // 4个必须设置的属性 bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUrl("jdbc:mysql:///db0619"); bds.setUsername("root"); bds.setPassword("root"); //其他属性,都是可选属性 bds.setInitialSize(100); // 初始创建100个连接 bds.setMaxActive(50); // 最大活动数 bds.setMaxIdle(20); // 最大空闲数 bds.setMinIdle(10); // 最小空闲数 bds.setMaxWait(-1); // 最大等待时间 Connection conn = bds.getConnection(); System.out.println(conn); Connection conn2 = bds.getConnection(); System.out.println(conn2);
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DBCPUtil private static DataSource ds; static try Properties p = new Properties(); InputStream is = new FileInputStream("src/db.properties"); p.load(is); ds = BasicDataSourceFactory.createDataSource(p); catch (Exception e) e.printStackTrace(); public static DataSource getDataSource() return ds; public static Connection getConnection() Connection conn = null; try conn = ds.getConnection(); catch (SQLException e) e.printStackTrace(); return conn;
3、c3p0连接池
工具包:https://sourceforge.net/projects/c3p0/
导包 c3p0-0.9.5.2.jar mchange-commons-java... mysql-connection...
配置文件名称:c3p0-config.xml c3p0.properties
import java.sql.Connection; import com.mchange.v2.c3p0.ComboPooledDataSource; public class Test1 public static void main(String[] args) throws Exception ComboPooledDataSource cds = new ComboPooledDataSource(); //4 个基本设置 cds.setDriverClass("com.mysql.jdbc.Driver"); cds.setJdbcUrl("jdbc:mysql:///db0619"); cds.setUser("root"); cds.setPassword("root"); Connection conn = cds.getConnection(); System.out.println(conn);
import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class C3P0Util private static DataSource ds; static //ds = new ComboPooledDataSource();//加载src/c3p0-config.xml,并使用配置文件中默认的配置配置<default-config> ds = new ComboPooledDataSource("offcn"); //加载src/c3p0-config.xml,并使用名字为offcn的配置配置 public static DataSource getDataSource() return ds; public static Connection getConnection() Connection conn = null; try conn= ds.getConnection(); catch (SQLException e) // TODO Auto-generated catch block e.printStackTrace(); return conn;
4、druid连接池
工具包:
导包:druid-1....jar mysql-connection...
配置文件名称 druid.properties
import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import com.alibaba.druid.pool.DruidDataSourceFactory; public class DruidUtils private static DataSource ds; private static Connection conn; static try InputStream is = MyJDBC.class.getClassLoader().getResourceAsStream("druid.properties"); Properties prop = new Properties(); prop.load(is); ds = DruidDataSourceFactory.createDataSource(prop); catch (Exception e) e.printStackTrace(); public static Connection getConnection() try conn = ds.getConnection(); catch (SQLException e) // TODO Auto-generated catch block e.printStackTrace(); return conn; public static DataSource getDataSource() return ds;
DBUTils工具类
以上是关于数据库连接池的主要内容,如果未能解决你的问题,请参考以下文章