hibernate 配置连接池详解
- 格式:doc
- 大小:76.00 KB
- 文档页数:15
hibernate的基本用法Hibernate是一个开源的Java框架,用于简化数据库操作。
它为开发人员提供了一个更加简单、直观的方式来管理数据库,同时也提高了应用程序的性能和可维护性。
本文将逐步介绍Hibernate的基本用法,包括配置、实体映射、数据操作等。
一、配置Hibernate1. 下载和安装Hibernate:首先,我们需要下载Hibernate的压缩包并解压。
然后将解压后的文件夹添加到Java项目的构建路径中。
2. 创建Hibernate配置文件:在解压后的文件夹中,可以找到一个名为"hibernate.cfg.xml"的文件。
这是Hibernate的主要配置文件,我们需要在其中指定数据库连接信息和其他相关配置。
3. 配置数据库连接:在"hibernate.cfg.xml"文件中,我们可以添加一个名为"hibernate.connection.url"的属性,用于指定数据库的连接URL。
除此之外,还需要指定数据库的用户名和密码等信息。
4. 配置实体映射:Hibernate使用对象关系映射(ORM)来将Java类映射到数据库表。
我们需要在配置文件中使用"mapping"元素来指定实体类的映射文件。
这个映射文件描述了实体类与数据库表之间的对应关系。
二、实体映射1. 创建实体类:我们需要创建一个Java类,用于表示数据库中的一行数据。
这个类的字段通常与数据库表的列对应。
同时,我们可以使用Hibernate提供的注解或XML文件来配置实体的映射关系。
2. 创建映射文件:可以根据个人喜好选择使用注解还是XML文件来配置实体类的映射关系。
如果使用XML文件,需要创建一个与实体类同名的XML文件,并在其中定义实体类与数据库表之间的映射关系。
3. 配置实体映射:在配置文件中,我们需要使用"mapping"元素来指定实体类的映射文件。
spring4.x + hibernate4.x 配置详解关于spring和hibernate的使用以及特征等等,在此不再啰嗦,相信大家也都知道,或者去搜索一下即可。
本篇博文的内容主要是我最近整理的关于spring4.x 和hibernate 4.x 相关配置和使用方式,当然spring3.x以及hibernate4.x也可以借鉴。
首先是配置文件web.xml 增加以下代码即可<!-- 加载spring相关的配置文件--><context-param><param-name>contextConfigLocation</param-name><param-value>classpath*:/applicationContext.xml</param-value> </context-param><!-- 启用spring监听--><listener><listener-class>org.springframework.web.context.ContextLoaderListener</l istener-class></listener>然后建立 applicationContext.xml 文件,src下。
文件内容如下,注释我尽量写的很详细<beans xmlns:xsi="/2001/XMLSchema-instance"xmlns="/schema/beans"xmlns:aop="http://ww /schema/aop"xmlns:context="/schema/context"xmlns:tx="ht tp:///schema/tx"xmlns:cache="/schema/cache"xmlns:p="http:// /schema/p"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-4.0.xsd/schema/aop/schema/aop/spring-aop-4.0.xsd/schema/context/schema/context/spring-context-4.0.xsd/schema/tx/schema/tx/spring-tx-4.0.xsd/schema/cache http://www.springframewor /schema/cache/spring-cache-4.0.xsd"><!-- 引入properties文件--><context:property-placeholder location="classpath*:/appConfig.properties"/> <!-- 定义数据库连接池数据源bean destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用--> <bean id="dataSource"class="boPooledDataSourc e"destroy-method="close"><!-- 设置JDBC驱动名称--><property name="driverClass"value="${jdbc.driver}"/><!-- 设置JDBC连接URL --><property name="jdbcUrl"value="${jdbc.url}"/><!-- 设置数据库用户名--><property name="user"value="${ername}"/><!-- 设置数据库密码--><property name="password"value="${jdbc.password}"/><!-- 设置连接池初始值--><property name="initialPoolSize"value="5"/></bean><!-- 配置sessionFactory --><bean id="sessionFactory"class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"><!-- 数据源--><property name="dataSource"ref="dataSource"/><!-- hibernate的相关属性配置--><property name="hibernateProperties"><value><!-- 设置数据库方言-->hibernate.dialect=org.hibernate.dialect.MySQLDialect<!-- 设置自动创建|更新|验证数据库表结构-->hibernate.hbm2ddl.auto=update<!-- 是否在控制台显示sql -->hibernate.show_sql=true<!-- 是否格式化sql,优化显示-->hibernate.format_sql=true<!-- 是否开启二级缓存-->e_second_level_cache=false<!-- 是否开启查询缓存-->e_query_cache=false<!-- 数据库批量查询最大数-->hibernate.jdbc.fetch_size=50<!-- 数据库批量更新、添加、删除操作最大数-->hibernate.jdbc.batch_size=50<!-- 是否自动提交事务-->hibernate.connection.autocommit=true<!-- 指定hibernate在何时释放JDBC连接-->hibernate.connection.release_mode=auto<!-- 创建session方式hibernate4.x 的方式-->hibernate.current_session_context_class=org.springframework.or m.hibernate4.SpringSessionContext<!-- javax.persistence.validation.mode默认情况下是auto的,就是说如果不设置的话它是会自动去你的classpath下面找一个bean-validation**包所以把它设置为none即可-->javax.persistence.validation.mode=none</value></property><!-- 自动扫描实体对象tdxy.bean的包结构中存放实体类--><property name="packagesToScan"value="tdxy.bean"/> </bean><!-- 定义事务管理--><bean id="transactionManager"class="org.springframework.orm.hibernate4.HibernateTransactionManager "><property name="sessionFactory"ref="sessionFactory"/> </bean><!-- 定义Autowired 自动注入bean --><bean class="org.springframework.beans.factory.annotation.AutowiredAnnotati onBeanPostProcessor"/><!-- 扫描有注解的文件base-package 包路径--><context:component-scan base-package="tdxy"/><tx:advice id="txAdvice"transaction-manager="transactionManager"> <tx:attributes><!-- 事务执行方式REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。
Java Hibernate 之连接池详解Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。
在配置连接池时需要注意的有三点:一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。
如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。
二、默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。
但这个连接池性能不佳,且存在诸多BUG(笔者就曾在Mysql环境下被八小时连接悬空问题困扰过),因此官方也只是建议仅在开发环境下使用。
三、Hibernate2和Hibernate3的命名空间有所变化。
例如,配置C3P0时的provider_class有Hibernate2 环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection.C3P0ConnectionProvider。
下面是Hibernate环境下几种常见的连接池配置:1.Hibernate默认连接池<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd "><hibernate-configuration><session-factory ><!—JDBC驱动程序--><propertyname="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 连接数据库的URL--><property name="connection.url">jdbc:mysql://localhost:3306/schoolproject</property><property name="eUnicode">true</property><property name="connection.characterEncoding">UTF-8</property> <!--连接的登录名--><property name="ername">root</property><!—登录密码--><property name="connection.password"></property><!--是否将运行期生成的SQL输出到日志以供调试--><property name="show_sql">true</property><!--指定连接的语言--><propertyname="dialect">org.hibernate.dialect.MySQLDialect</property><!--映射Student这个资源--><mapping resource="com/wqbi/model/pojo/student.hbm.xml" /></session-factory></hibernate-configuration>2.C3P0连接配置<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd "><hibernate-configuration><session-factory ><!—JDBC驱动程序--><propertyname="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- 连接数据库的URL--><property name="connection.url">jdbc:mysql://localhost:3306/schoolproject</property><property name="eUnicode">true</property><property name="connection.characterEncoding">UTF-8</property> <!--连接的登录名--><property name="ername">root</property><!--登录密码--><property name="connection.password"></property><!-- C3P0连接池设定--><p<propertyname="hibernate.connection.provider_class">org.hibernate.connecti on.C3P0ConnectionProvider</property><property name="hibernate.c3p0.max_size">20</property><property name="hibernate.c3p0.min_size">5</property><property name="hibernate.c3p0.timeout">120</property><property name="hibernate.c3p0.max_statements">100</property><property name="hibernate.c3p0.idle_test_period">120</property><property name="hibernate.c3p0.acquire_increment">2</property><!--是否将运行期生成的SQL输出到日志以供调试--><property name="show_sql">true</property><!--指定连接的语言--><propertyname="dialect">org.hibernate.dialect.MySQLDialect</property><!--映射Student这个资源--><mapping resource="com/wqbi/model/pojo/student.hbm.xml" /></session-factory></hibernate-configuration>3.proxool连接池(1) 先写proxool的配置文件,文件名:proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject<?xml version="1.0" encoding="UTF-8"?><!-- the proxool configuration can be embedded within your own application's.Anything outside the "proxool" tag is ignored. --><something-else-entirely><proxool><!--连接池的别名--><alias>DBPool</alias><!--proxool只能管理由自己产生的连接--><driver-url>jdbc:mysql://localhost:3306/schoolproject?useUnicode=true&cha racterEncoding=UTF8</driver-url><!—JDBC驱动程序--><driver-class>com.mysql.jdbc.Driver</driver-class><driver-properties><property name="user" value="root"/><property name="password" value=""/></driver-properties><!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--><house-keeping-sleep-time>90000</house-keeping-sleep-time><!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--><maximum-new-connections>20</maximum-new-connections><!-- 最少保持的空闲连接数--><prototype-count>5</prototype-count><!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定--><maximum-connection-count>100</maximum-connection-count><!-- 最小连接数--><minimum-connection-count>10</minimum-connection-count></proxool></something-else-entirely>(2)配置hibernate.cfg.xml文件<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd "><hibernate-configuration><session-factory ><property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property><property name="hibernate.proxool.pool_alias">DBPool</property><property name="hibernate.proxool.xml">proxoolconf.xml</property> <!--是否将运行期生成的SQL输出到日志以供调试--><property name="show_sql">true</property><!--指定连接的语言--><propertyname="dialect">org.hibernate.dialect.MySQLDialect</property><!--映射Student这个资源--><mapping resource="com/wqbi/model/pojo/student.hbm.xml" /></session-factory></hibernate-configuration>hibernate.connection.provider_class定义Hibernate的连接加载类,这里Proxool连接池是用这个,不同的连接池有不同的加载类,可以查阅Hibernate文档获取相关信息hibernate.proxool.pool_alias这里就是用我们上面提到的连接池的别名hibernate.proxool.xml是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。
数据库连接池的参数设置在进行数据库操作时,为了提高效率和性能,往往会使用数据库连接池。
数据库连接池是一种管理数据库连接的技术,它可以在应用程序启动时创建一定数量的数据库连接,并将这些连接保存在一个池中,供应用程序使用。
对于频繁进行数据库操作的应用程序来说,使用数据库连接池可以减少连接的创建和关闭的开销,提高数据库操作的效率。
数据库连接池的参数设置非常重要,不同的参数设置会对数据库连接池的性能和效果产生直接影响。
下面我将介绍一些常见的数据库连接池参数设置。
1. 初始连接数(InitialSize):指定连接池中初始化的连接数。
在应用程序启动时,连接池会创建这些连接并放入池中。
初始连接数的设置应根据应用程序的并发量和数据库的负载情况来确定,一般来说,初始连接数应该足够满足应用程序的并发需求,但也不能设置得过多,以免占用过多的系统资源。
2. 最小空闲连接数(MinIdle):指定连接池中保持的最小空闲连接数。
当应用程序不再使用连接时,连接池会将一部分连接保留在池中,以便下次使用。
最小空闲连接数的设置应根据应用程序的并发量和数据库的负载情况来确定。
如果设置得过小,可能导致连接池无法满足应用程序的并发需求;如果设置得过大,可能会浪费系统资源。
3. 最大空闲连接数(MaxIdle):指定连接池中保持的最大空闲连接数。
当连接池中的连接数量超过最大空闲连接数时,多余的连接会被关闭并从池中移除。
最大空闲连接数的设置应根据应用程序的并发量和数据库的负载情况来确定。
如果设置得过小,可能导致连接池无法满足应用程序的并发需求;如果设置得过大,可能会浪费系统资源。
4. 最大活动连接数(MaxActive):指定连接池中允许的最大活动连接数。
当连接池中的连接数量达到最大活动连接数时,新的连接请求会被阻塞,直到有连接被释放。
最大活动连接数的设置应根据应用程序的并发量和数据库的负载情况来确定。
如果设置得过小,可能导致连接池无法满足应用程序的并发需求;如果设置得过大,可能会导致数据库负载过高。
MySQL+Hibernate下连接空闲8小时自动断开问题解决方案前段时间刚完成一个家教网项目,数据库为MySQL5.0,持久层使用Hibernate 3.1,没有使用额外的连接池,那么Hibernate会默认使用它自带的一个默认连接池,也就是DriverManagerConnectionProvider。
先在本机上调试都毫无问题,于是部署到服务器上,也都没什么问题。
由于这是新网站,根本还没正式对外发布和宣传,所以头两天根本没人访问。
等到第二天,我再次访问网站时,问题就出现了,错误信息如下:javax.servlet.ServletException: org.hibernate.exception.JDBCConnectionException: could not execute queryorg.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:535)org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:433) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)javax.servlet.http.HttpServlet.service(HttpServlet.java:690)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)org.apache.jsp.index_jsp._jspService(index_jsp.java:57)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)b1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)org.hibernate.exception.JDBCConnectionException: could not execute queryorg.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74)org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)org.hibernate.loader.Loader.doList(Loader.java:2148)org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)org.hibernate.loader.Loader.list(Loader.java:2024)org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)b1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)b1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)javax.servlet.http.HttpServlet.service(HttpServlet.java:690)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)org.apache.jsp.index_jsp._jspService(index_jsp.java:57)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)b1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30)com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error:** BEGIN NESTED EXCEPTION **municationsExceptionMESSAGE: Communications link failure due to underlying exception:** BEGIN NESTED EXCEPTION **java.io.EOFExceptionSTACKTRACE:java.io.EOFExceptionat com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)at org.hibernate.loader.Loader.doQuery(Loader.java:662)at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)at org.hibernate.loader.Loader.doList(Loader.java:2145)at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)at org.hibernate.loader.Loader.list(Loader.java:2024)at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)at b1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)at b1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)atorg.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at b1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30) atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperV alve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)at mon.HandlerRequest.invoke(HandlerRequest.java:283)at mon.ChannelSocket.invoke(ChannelSocket.java:767)at mon.ChannelSocket.processConnection(ChannelSocket.java:697)at mon.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)at ng.Thread.run(Unknown Source)** END NESTED EXCEPTION **Last packet sent to the server was 15 ms ago.STACKTRACE:municationsException: Communications link failure due to underlying exception:** BEGIN NESTED EXCEPTION **java.io.EOFExceptionSTACKTRACE:java.io.EOFExceptionat com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1963)at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2375)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)at org.hibernate.loader.Loader.doQuery(Loader.java:662)at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)at org.hibernate.loader.Loader.doList(Loader.java:2145)at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)at org.hibernate.loader.Loader.list(Loader.java:2024)at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)at b1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)at b1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)atorg.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at b1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30) atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperV alve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)at mon.HandlerRequest.invoke(HandlerRequest.java:283)at mon.ChannelSocket.invoke(ChannelSocket.java:767)at mon.ChannelSocket.processConnection(ChannelSocket.java:697)at mon.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)at ng.Thread.run(Unknown Source)** END NESTED EXCEPTION **Last packet sent to the server was 15 ms ago.at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2586)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2874)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1623)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1715)at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:139)at org.hibernate.loader.Loader.getResultSet(Loader.java:1669)at org.hibernate.loader.Loader.doQuery(Loader.java:662)at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)at org.hibernate.loader.Loader.doList(Loader.java:2145)at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)at org.hibernate.loader.Loader.list(Loader.java:2024)at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)at org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)at b1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)at b1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)atorg.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)at org.apache.jsp.index_jsp._jspService(index_jsp.java:57)at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at b1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30) atorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)at org.apache.catalina.core.StandardWrapperV alve.invoke(StandardWrapperValve.java:233)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)at mon.HandlerRequest.invoke(HandlerRequest.java:283)at mon.ChannelSocket.invoke(ChannelSocket.java:767)at mon.ChannelSocket.processConnection(ChannelSocket.java:697)at mon.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:889)at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)at ng.Thread.run(Unknown Source)** END NESTED EXCEPTION **com.mysql.jdbc.SQLError.createSQLException(SQLError.java:888)com.mysql.jdbc.Connection.checkClosed(Connection.java:1931)com.mysql.jdbc.Connection.prepareStatement(Connection.java:4705)com.mysql.jdbc.Connection.prepareStatement(Connection.java:4671)org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:442)org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:368)org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:105)org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1561)org.hibernate.loader.Loader.doQuery(Loader.java:661)org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)org.hibernate.loader.Loader.doList(Loader.java:2145)org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)org.hibernate.loader.Loader.list(Loader.java:2024)org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:94)org.hibernate.impl.SessionImpl.list(SessionImpl.java:1533)org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)b1000.jcom.dao.ArticleDAO.getArticlesUnder(ArticleDAO.java:163)b1000.jcom.struts.action.HomeAction.execute(HomeAction.java:40)org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431) org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)javax.servlet.http.HttpServlet.service(HttpServlet.java:690)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)org.apache.jsp.index_jsp._jspService(index_jsp.java:57)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:337)org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)javax.servlet.http.HttpServlet.service(HttpServlet.java:803)b1000.jcom.system.filter.RequestEncodingFilter.doFilter(RequestEncodingFilter.java:30) 当时也搞不清楚为什么,但重启Tomcat后就一切回复正常了,但是又过了一天,问题再次出现。
连接池原理解析与配置优化数据库连接池是在应用程序与数据库之间建立连接的中间层,主要用于管理和复用数据库连接,从而提高应用程序的性能和并发处理能力。
本文将详细解析连接池的原理,并提供一些配置优化的建议。
一、连接池的原理解析在传统的数据库连接方式中,每次应用程序需要进行数据库操作时,都需要建立一个新的数据库连接,在操作结束后再关闭该连接。
这样做的问题在于,频繁地建立和关闭连接会消耗大量的资源,降低了性能,并且在高并发的情况下容易导致连接耗尽。
连接池通过预先创建一定数量的数据库连接,并将其保存在连接池中。
当应用程序需要进行数据库操作时,直接从连接池中获取一个可用的连接,而不是每次都重新创建。
当操作完成后,将连接释放回连接池供其他应用程序使用。
连接池的原理可以简单概括为以下几个步骤:1. 初始化连接池,创建一定数量的数据库连接,并将其放入连接池中。
2. 应用程序从连接池中获取一个可用的连接。
3. 应用程序使用连接进行数据库操作。
4. 操作完成后,将连接释放回连接池。
通过连接池的管理,应用程序可以复用连接,提高了数据库操作的效率和并发处理能力。
二、连接池的配置优化对于连接池的配置,不同的应用程序会有不同的需求和优化目标。
下面是一些常见的连接池配置优化建议:1. 连接池大小的设置:连接池的大小决定了连接的数量,需要根据应用程序的并发处理需求进行调整。
过小的连接池可能导致连接不足,影响系统性能;过大的连接池则会占用过多的资源,造成资源浪费。
可以通过观察应用程序在高峰期的连接使用情况,来确定适合的连接池大小。
2. 连接的最大空闲时间:连接在连接池中的最大空闲时间需要设置一个适当的值。
如果连接超过最大空闲时间没有被使用,连接池会自动将其关闭以释放资源。
过小的最大空闲时间会导致频繁地创建连接,影响性能;过大的最大空闲时间则会占用过多的资源。
可以根据应用程序的特点和连接的平均使用时长来确定最大空闲时间。
3. 连接的最大生存时间:连接在连接池中的最大生存时间需要设置一个适当的值。
Hibernate 中配置C3P0连接池Hibernate自带的连接池算法相当不成熟。
它只是为了让你快些上手,并不适合用于产品系统或性能测试中。
出于最佳性能和稳定性考虑你应该使用第三方的连接池。
只需要用特定连接池的设置替换hibernate.connection.pool_size即可。
这将关闭Hibernate自带的连接池。
例如,你可能会想用C3P0.C3P0是一个随Hibernate一同分发的开源的JDBC连接池,它位于lib目录下。
如果你设置了hibernate.c3p0.*相关的属性,Hibernate将使用C3P0ConnectionProvider来缓存JDBC连接。
如果你更原意使用Proxool,请参考发行包中的hibernate.properties并到Hibernate网站获取更多的信息。
这是一个使用C3P0的hibernate.properties样例文件(来自Hibernate包中etc目录下):############################## C3P0 Connection Pool###############################hibernate.c3p0.max_size 2#hibernate.c3p0.min_size 2#hibernate.c3p0.timeout 5000#hibernate.c3p0.max_statem ents 100#hibernate.c3p0.idle_test_period 3000#hibernate.c3p0.acquire_increment 2#hibernate.c3p0.validate false在hibernate.cfg.xml文件里面加入如下的配置:<!-- 最大连接数--><property name="hibernate.c3p0.max_size">20</property><!-- 最小连接数--><property name="hibernate.c3p0.min_size">5</property><!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒--><property name="hibernate.c3p0.timeout">120</property><!-- 最大的PreparedStatement的数量--><property name="hibernate.c3p0.max_statements">100</property><!-- 每隔120秒检查连接池里的空闲连接,单位是秒--><property name="hibernate.c3p0.idle_test_period">120</property><!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数--><property name="hibernate.c3p0.acquire_increment">2</property><!-- 每次都验证连接是否可用--><property name="hibernate.c3p0.validate">true</property>完整示例如下(hibernate.properties):hibernate.connection.driver_class =org.postgresql.Driverhibernate.connection.url= jdbc:postgresql://localhost/mydatabaseername = myuserhibernate.connection.password = secrethibernate.c3p0.min_size=5hibernate.c3p0.max_size=20hibernate.c3p0.timeout=1800hibernate.c3p0.max_statements=50hibernate.dialect =org.hibernate.dialect.PostgreSQLDialect。
Hibernate如何连接池配置Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。
在配置连接池时需要注意的有三点:一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。
如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。
二、默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。
但这个连接池性能不佳,且存在诸多BUG(笔者就曾在Mysql环境下被八小时连接悬空问题困扰过),因此官方也只是建议仅在开发环境下使用。
三、Hibernate2和Hibernate3的命名空间有所变化。
例如,配置C3P0时的provider_class有Hibernate2环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection.C3P0ConnectionProvider。
下面是Hibernate环境下几种常见的连接池配置:1.Hibernate默认连接池<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory ><!—JDBC驱动程序--><propertyname="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 连接数据库的URL--><property name="connection.url">jdbc:mysql://localhost:3306/schoolproject</property><property name="eUnicode">true</property><property name="connection.characterEncoding">UTF-8</property><!--连接的登录名--><property name="ername">root</property><!—登录密码--><property name="connection.password"></property><!--是否将运行期生成的SQL输出到日志以供调试--><property name="show_sql">true</property><!--指定连接的语言--><property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!--映射Student这个资源--><mapping resource="com/wqbi/model/pojo/student.hbm.xml" /></session-factory></hibernate-configuration>2.C3P0连接配置<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory ><!—JDBC驱动程序--><propertyname="connection.driver_class">com.mysql.jdbc.Driver</property><!-- 连接数据库的URL--><property name="connection.url">jdbc:mysql://localhost:3306/schoolproject</property><property name="eUnicode">true</property><property name="connection.characterEncoding">UTF-8</property><!--连接的登录名--><property name="ername">root</property><!--登录密码--><property name="connection.password"></property><!-- C3P0连接池设定--><p<propertyname="hibernate.connection.provider_class">org.hibernate.connection.C3 P0ConnectionProvider</property><property name="hibernate.c3p0.max_size">20</property><property name="hibernate.c3p0.min_size">5</property><property name="hibernate.c3p0.timeout">120</property><property name="hibernate.c3p0.max_statements">100</property><property name="hibernate.c3p0.idle_test_period">120</property><property name="hibernate.c3p0.acquire_increment">2</property><!--是否将运行期生成的SQL输出到日志以供调试--><property name="show_sql">true</property><!--指定连接的语言--><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!--映射Student这个资源--><mapping resource="com/wqbi/model/pojo/student.hbm.xml" /></session-factory></hibernate-configuration>3.proxool连接池(1) 先写proxool的配置文件,文件名:proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject<?xml version="1.0" encoding="UTF-8"?><!-- the proxool configuration can be embedded within your ownapplication's.Anything outside the "proxool" tag is ignored. --><something-else-entirely><proxool><!--连接池的别名--><alias>DBPool</alias><!--proxool只能管理由自己产生的连接--><driver-url>jdbc:mysql://localhost:3306/schoolproject?useUnicode=true&characte rEncoding=UTF8</driver-url><!—JDBC驱动程序--><driver-class>com.mysql.jdbc.Driver</driver-class><driver-properties><property name="user" value="root"/><property name="password" value=""/></driver-properties><!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁--><house-keeping-sleep-time>90000</house-keeping-sleep-time><!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受--><maximum-new-connections>20</maximum-new-connections><!-- 最少保持的空闲连接数--><prototype-count>5</prototype-count><!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定--><maximum-connection-count>100</maximum-connection-count><!-- 最小连接数--><minimum-connection-count>10</minimum-connection-count></proxool></something-else-entirely>(2)配置hibernate.cfg.xml文件<?xml version='1.0' encoding='UTF-8'?><!DOCTYPE hibernate-configurationPUBLIC "-//Hibernate/Hibernate Configuration DTD//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory ><property name="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property><property name="hibernate.proxool.pool_alias">DBPool</property><property name="hibernate.proxool.xml">proxoolconf.xml</property><!--是否将运行期生成的SQL输出到日志以供调试--><property name="show_sql">true</property><!--指定连接的语言--><property name="dialect">org.hibernate.dialect.MySQLDialect</property><!--映射Student这个资源--><mapping resource="com/wqbi/model/pojo/student.hbm.xml" /></session-factory></hibernate-configuration>(1) hibernate.connection.provider_class定义Hibernate的连接加载类,这里Proxool连接池是用这个,不同的连接池有不同的加载类,可以查阅Hibernate 文档获取相关信息(2) hibernate.proxool.pool_alias这里就是用我们上面提到的连接池的别名(3) hibernate.proxool.xml是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。