JDBC与Hibernate连接池

Java应用程序访问数据库基本原理:

在Java语言中,JDBC(Java DataBase Connection)是应用程序与数据库沟通的桥梁 .

 一般来说,Java应用程序访问数据库的过程是:

  ①装载数据库驱动程序;

  ②通过JDBC建立数据库连接;   

     ③访问数据库,执行SQL语句;  

   ④断开数据库连接。

JDBC作为一种数据库访问技术,具有简单易用的优点。但使用这种模式进行Web应用程序开发,存在很多问题:首先,每一次Web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的Web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。

 其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

数据库连接池的工作原理

为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。连接池的基本工作原理

连接池关键问题分析 

为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为Java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如: public synchronized Connection getConnection()

 Hibernate中C3P0连接池组件的配置

C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>  
<property name="hibernate.c3p0.max_size">15</property>  
<property name="hibernate.c3p0.min_size">1</property>  
<property name="hibernate.c3p0.timeout">1800</property>  
<property name="hibernate.c3p0.max_statements">1000</property>  
<property name="hibernate.c3p0.idle_test_period">30000</property>  
<property name="hibernate.c3p0.acquire_increment">1</property>  
<property name="hibernate.c3p0.validate">false</property>    

C3p0:
hibernate.c3p0.max_size                        最大连接数
hibernate.c3p0.min_size                         初始连接数
hibernate.c3p0.timeout                           
数据库连接对象最大持有时间(以秒为单位)
hibernate.c3p0.max_statements          
最大可缓存数据库语句对象,设为0则不缓存
hibernate.c3p0.acquire_increment      
当连接池耗尽并接到获得连接的请求,则新增加连接的数量
hibernate.c3p0.idle_test_period       
在连接空闲多少秒后,检查连接
hibernate.c3p0.validate                           
检查连接,推荐使用hibernate.c3p0.idle_test_period_代替,默认值为false

原文地址:https://www.cnblogs.com/tianyuxuepiao/p/2683988.html