咸鱼日记之Java Web开发

数据库-连接池

2018-08-14  本文已影响0人  冰与河豚鱼

什么是连接池?

本质上是一组java架包,介于java应用程序和jdbc数据库物理连接之间,负责帮助应用程序来管理jdbc连接,通过连接池暴露的接口,业务程序可以获取数据库连接,使用完毕以后,可以将连接归还到连接池,供下一个线程使用。
连接池对jdbc连接实行有效的管理:在连接池中jdbc连接不足时,会自动创建连接;在空闲的连接比较多时,也会自动销毁连接;在由多个线程同时获得数据库连接时,连接池提供排队等待功能,保证应用程序有序的获得连接。

如何使用连接池?(DBCP连接池)

创建连接池对象:

public static void dbpoolInit() {
 ds=new BasicDataSource();
 ds.setUrl();
 ds.setDriverClassName();
 ds.setUserName();
 ds.setPassword();}

获取数据库连接+释放数据库连接:

public static void dbpoolTest() {
 Connection conn=null;
 Statement sta=null;
 ResultSet rs=null;
 try {
     conn=ds.getConnection();
     sta=conn.createStatement();
     rs=sta.executeQuery("select * from user");
 }catch(SQLException e) {
     e.printStackTrace();
 }finally {
     try {
         if(conn!=null) conn.close();
         if(sta!=null) sta.close();
         if(rs!=null) rs.close(); 
     }catch(SQLException e) {
        //ignore 
     }
 } }

高级配置:
BasicDataSource:
-.setInitialSize()
-.setMaxTotal()
-.setMaxWaitMills()
-.setMaxIdle()

DBCP定期检查:
BasicDataSource:
.setTestWhileIdle(True)
.setMinEvictableIdleTimeMills()
.setTimeBetweenEvictionRunsMills()

//获取数据库连接
Conn=DriverManager.getConnection

过程:(建立连接时间的花销大)
MySQL客户端->请求建立连接(tcp)->MySQL服务端->发送随机密码种子->MySQL客户端(利用密码种子和保存的数据库密码按照约定的加密算法得到一个加密密码)->发送加密密码-> MySQL服务端(验证,并确认)->连接建立成功-> MySQL客户端

使用连接池的原因:

连接复用:每个线程在使用连接后,不立即销毁,而是将连接交给下一次访问数据库的线程,多个线程共用后端相同的物理连接,实现连接的复用。以连接池的形式来管理数据库连接,每个需要访问数据库的线程,每次从连接池中租界数据库连接,使用完毕后归还到连接池,可以实现连接的重复使用。(创建连接->租借连接)

最大并发连接数限制:数据库服务器端在处理数据库请求时,会在服务器端分配一定的资源(例如,内存:用来保存数据库查询的结果),在请求结束后,这些资源会被释放。而服务器端的资源有限,不可能无限制的分配,当同时有多个数据库请求访问数据库时,服务器端能够处理的连接数是有限制的,当超过最大可分配的资源时,就会出现服务器当机的故障。为了限制并发访问的连接数,数据库服务器端会设置最大并发连接数,如果超过这个数,则会抛出异常。

限流:不能仅依靠最大并发连接数限制,数据库连接必须有序可控的被线程使用,需要在java的应用程序中实现业务线程排队获取数据库连接,限制同时获得数据库连接的线程数,起到限流对后端数据库保护的机制。同时连接数过多会对后端数据库的性能造成严重影响,因为连接数的增多,数据库会存在更多的锁的冲突与检测,加大数据库服务器端的资源的消耗。

上一篇 下一篇

猜你喜欢

热点阅读