`
gwj41
  • 浏览: 99484 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

关于数据库连接池

阅读更多
连接池一般比直接连接更有优越性因为它提高了性能的同时还保存了宝贵的资源。打开数据库连接时CPU和网络的重要任务因此,在整个应用程序的使用过程当中重复的打开直接连接将导致性能的下降。而池连接只在服务器启动时打开一次,从而消除了这种性能问题。
另外,因为连接只用于很短的时间,
所以,连接可以被有效共享,
而且有关连接参数的特有信息,
只对池驱动程序有效,
如数据库用户名称和密码,
从而增强了系统的安全性和可管理性。

最大维持连接数:没有任何请求时在连接池中可以存在的连接数
最大连接数:连接池中最多可以存在的连接个数。
最大等待时间:当断开连接时,超过最大维持连接数的连接不会马上销毁,最大等待时间过后它才会销毁。
连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。
现在假设:最大维持连接数是10,最大连接数是20,最大等待时间是10000(毫秒)
其过程:最开始在连接池中有10个连接(最大连接数),当有用户申请连接时,其将一个连接分配用户,直到连接池中的10个连接全都分配出去,当第11个用户申请连接时,它将创建第11个连接并分配给该用户,直到把第20个连接(最大连接数)分配给第20个用户,当第21个用户申请连接时,它需要等待,直到前面的20个用户中某一个断开了连接,才会把那个连接分配给第21个用户,当用户断开连接时(第11至20个连接),该连接不会立刻被释放而是需要等待10000毫秒(最大等待时间),才被释放,当没有用户连接时,连接池内还保持10个连接。
在开发中,使用连接池时若没有关闭连接(调用连接的close方法)会出现“连接池疲劳的错误”。
连接池的作用是自己维护数据库连接,数据库连接池的主要操作如下:
  (1)建立数据库连接池对象(服务器启动)。
  (2)按照事先指定的参数创建初始数量的数据库连接(即:空闲连接数)。
  (3)对于一个数据库访问请求,直接从连接池中得到一个连接。如果数据库连接池对象中没有空闲的连接,且连接数没有达到最大(即:最大活跃连接数),创建一个新的数据库连接。
  (4)存取数据库。
  (5)关闭数据库,释放所有数据库连接(此时的关闭数据库连接,并非真正关闭,而是将其放入空闲队列中。如实际空闲连接数大于初始空闲连接数则释放连接)。
  (6)释放数据库连接池对象(服务器停止、维护期间,释放数据库连接池对象,并释放所有连接)。
从连接池获取的连接connection跟JDK中的connection有点不同,前者的close方法并没有关闭与数据库的连接,而是将连接返回到池中,这样就可以复用了。如果不调用close方法的话拿就失去了使用连接池的意义了。

利用c3p0配置数据库连接:
http://www.mchange.com/projects/c3p0/
hibernate下配置MySQL的连接

<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" abstract="false" singleton="true"
lazy-init="default" autowire="default" dependency-check="default">
<property name="driverClass">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:mysql://192.168.0.1/databasename?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true</value>
</property>
<property name="user">
<value>username</value>
</property>
<property name="password">
<value>password</value>
</property>
<property name="minPoolSize">
<value>10</value>
</property>
<property name="maxPoolSize">
<value>20</value>
</property>
<property name="initialPoolSize">
<value>10</value>
</property>
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"></ref>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">
false
</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.use_query_cache">
true
</prop>
<prop key="hibernate.cache.use_second_level_cache">
true
</prop>
<prop key="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider
</prop>
<prop key="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</prop>
<prop key="hibernate.query.substitutions">
true 1, false 0, yes 'Y', no 'N'
</prop>
<prop
key="hibernate.bytecode.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.use_outer_join">true</prop>
<prop key="hibernate.prepare_sql">true</prop>
<prop key="hibernate.query.factory_class">
org.hibernate.hql.ast.ASTQueryTranslatorFactory
</prop>
</props>
</property>

<property name="mappingResources">
<list>
<value>xxx/xx/xx.hbm.xml</value>
<value>xxx/xx/xx.hbm.xml</value>
</list>
</property>
</bean>

Oracle的连接
<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" abstract="false" singleton="true"
lazy-init="default" autowire="default" dependency-check="default">
<property name="driverClass">
<value>oracle.jdbc.driver.OracleDriver</value>
</property>
<property name="jdbcUrl">
<value>jdbc:oracle:thin:@192.168.0.1:1521:orcl</value>
</property>
<property name="user">
<value>username</value>
</property>
<property name="password">
<value>password</value>
</property>
<property name="minPoolSize">
<value>10</value>
</property>
<property name="maxPoolSize">
<value>20</value>
</property>
<property name="initialPoolSize">
<value>10</value>
</property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource"></ref>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.OracleDialect
</prop>
<prop key="hibernate.show_sql">
false
</prop>
<prop key="hibernate.generate_statistics">true</prop>
<prop key="hibernate.cache.use_query_cache">
true
</prop>
<prop key="hibernate.cache.use_second_level_cache">
true
</prop>
<prop key="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider
</prop>
<prop key="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</prop>
<prop key="hibernate.query.substitutions">
true 1, false 0, yes 'Y', no 'N'
</prop>
<prop
key="hibernate.bytecode.use_reflection_optimizer">
true
</prop>
<prop key="hibernate.use_outer_join">true</prop>
<prop key="hibernate.prepare_sql">true</prop>
<prop key="hibernate.query.factory_class">
org.hibernate.hql.ast.ASTQueryTranslatorFactory
</prop>
</props>
</property>

<property name="mappingResources">
<list>
<value>xxx/xx/xx.hbm.xml</value>
<value>xxx/xx/xx.hbm.xml</value>
</list>
</property>
</bean>
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics