1、应用程序直接获取数据库链接的缺点mysql
用户每次请求服务器都须要向数据户获取链接,数据库建立链接一般须要消耗较大的资源。若是一个网站的访问量有上万次,无疑须要建立上万个数据库链接,极大地消耗数据库的资源,而且会加大服务器的负担,形成服务器内存溢出等问题。sql
2、使用数据路链接池的方式进行优化数据库
数据库的链接池基本思想是为数据库创建一个“缓冲池”,预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完后再放回去。能够经过设定链接池最大链接数来防止与服务器无尽的链接,数据库链接池负责分配管理和释放数据库链接,容许应用程序重复使用现有的一个数据库链接,而不是新创建一个。apache
数据库链接池在初始化时建立必定数量的链接放到链接池中,这些链接的数量由最小链接数来指定,不管这些数据库是否被使用,链接池中都保证至少存在这么多数量的链接,链接池的最大链接数的设定限制了该链接池可拥有链接的最大数量,当应用程序持续向服务请求链接,而且超过链接池最大链接数时,超过这些请求当被加入到等待队列中。服务器
数据库链接池最小链接数和最大链接数:优化
一、最小链接数是链接池一直保持的数据链接。若是应用程序对数据库链接的使用量不大,将会有大量的数据库链接资源被浪费掉。网站
二、最大链接数是链接池能申请的最大链接数。若是数据链接请求超过此数,后面的数据链接请求将被加入到等待队列中,这会影响以后的数据库操做。ui
三、若是最小链接数与最大链接数相差太大,那么,最早的链接请求将会获利,以后超过最小链接数量的链接请求等价于创建一个新的数据库链接。不过,这些大于最小链接数的数据库链接在使用完不会立刻被释放,它将被放到链接池中等待重复使用或是空闲超时后被释放。对象
3、开源的数据库链接池队列
3.1 DBCP数据库链接池
DBCP 是apache软件基金组织下的开源数据库链接池,须要的两个jar包分别是
原生的写法以下:
BasicDataSource dataSource = null;
//一、建立数据源实例
dataSource = new BasicDataSource();
//二、为数据库实例自定必须的属性
dataSource.setUsername("root");
dataSource.setPassword("123456");
dataSource.setUrl("jdbc:mysql:///test");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//三、指定数据源的一些可选的属性
//1)指定数据库链接池中初始化链接数的个数
dataSource.setInitialSize(5);
// 2)指定最大的链接数:同一时刻能够向数据库申请的链接数
dataSource.setMaxActive(50);
//3)指定最小空闲链接数:在数据库链接池中保存的最少的链接的数量
dataSource.setMinIdle(5);
//等待数据库链接池分配链接的最长时间,单位为毫秒
dataSource.setMaxWait(6*1000);
System.out.println(dataSource.getConnection());
System.out.println(dataSource.getConnection().getClass());
在类路径下加入dpcp的配置文件进行“去耦”操做,配置文件内容以下:
#链接池设置
driver =com.mysql.jdbc.Driver
jdbcUrl=jdbc:mysql://127.0.0.1:3306/test
user=root
password=123456
初始化连接
initialSize=10
最大链接数量
maxActive=50
最大空闲链接
maxIdle =20
最小空闲链接
minIdle=20
maxWait = 60000
------------------------------------------------
加载代码以下
Properties properties = new Properties();
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(inputStream);
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
System.out.println(dataSource);
3.2 C3P0数据库链接池
须要的jar包
原生写法:
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql:///peixun");
cpds.setUser("root");
cpds.setPassword("");
System.out.println(cpds.getConnection())
配置文件写法:
<c3p0-config>
<named-config name="helloc3p0">
<property name="user">root</property>
<property name="password"></property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql:///peixun</property>
<!--若数据库中链接数不足时,一次想数据库服务器申请多少链接-->
<property name="acquireIncrement">50</property>
<!--初始化数据库链接池时链接的数量-->
<property name="initialPoolSize">5</property>
<!--数据库链接池中的最小的数据库链接数-->
<property name="minPoolSize">50</property>
<!--数据库链接池中的最小的数据库链接数-->
<property name="maxPoolSize">1000</property>
<!--c3p0数据库链接池能够维护的Statement的个数-->
<property name="maxStatements">20</property>
<!--每一个链接同时可使用的Statement对象的个数-->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
加载代码以下:
DataSource dataSource = new ComboPooledDataSource("helloc3p0"); System.out.println(dataSource.getConnection()); ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource)dataSource; System.out.println(comboPooledDataSource.getMaxStatements());