`
tansitongba
  • 浏览: 505329 次
文章分类
社区版块
存档分类
最新评论

Spring+Hibernate的连接池配置(c3p0,proxool)

 
阅读更多


1、proxool

首先需要导入jar包proxool-0.9.1.jar和proxool-cglib.jar;

创建proxool.xml,内容如下:

<?xml version="1.0" encoding="utf-8"?>
<something-else-entirely>
<proxool>
<alias>proxoolPool</alias>
<driver-url>jdbc:oracle:thin:@192.168.1.153:1521:ORCL</driver-url>
<driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
<driver-properties>
<property name="user" value="username" />
<property name="password" value="password" />
</driver-properties>
<house-keeping-sleep-time>90000</house-keeping-sleep-time>
<prototype-count>15</prototype-count>
<maximum-connection-count>20</maximum-connection-count>
<minimum-connection-count>5</minimum-connection-count>
<house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
</proxool>
</something-else-entirely>

然后在web.xml中加载该xml文件

......

<servlet>
<servlet-name>proxoolInitialServlet</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.configuration.ServletConfigurator
</servlet-class>
<init-param>
<param-name>xmlFile</param-name>
<param-value>/WEB-INF/classes/proxool.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>proxool</servlet-name>
<servlet-class>
org.logicalcobwebs.proxool.admin.servlet.AdminServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>proxool</servlet-name>
<url-pattern>/Admin/proxool</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml,
classpath:applicationContext-*.xml
</param-value>
</context-param>
<servlet>
<servlet-name>contextConfigLocation</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>

......

接下来在spring中配置

<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName">
<value>org.logicalcobwebs.proxool.ProxoolDriver</value>
</property>
<property name="url">
<value>proxool.proxoolPool</value>
</property>
</bean>

<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="configLocation"
value="classpath:hibernate.cfg.xml">
</property>
</bean>

在hibernate.cfg.xml中就不要配置连接源了,只是写一些mapping就可以了

2、c3p0

首先导入jar包c3p0-0.9.1.2.jar和c3p0-oracle-thin-extras-0.9.1.2.jar;

这个只需要配置spring的配置文件就好,配置内容如下:

<bean id="dataSource"
class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close">
<property name="driverClass" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@192.168.1.153:1521:ORCL"></property>
<property name="user" value="username"></property>
<property name="password" value="password"></property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 1 -->
<property name="acquireIncrement"
value="1">
</property>
<!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize"
value="3">
</property>
<!--最大空闲时间,30秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="30"></property>
<!--连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="15"></property>
<!--连接池中保留的最小连接数。Default: 3 -->
<property name="minPoolSize" value="3"></property>
<!--两次连接中间隔时间,单位毫秒。Default: 1000 -->
<property name="acquireRetryDelay" value="1000"></property>
<!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 -->
<property name="acquireRetryAttempts" value="60"></property>
<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效
保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试
获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->

<property name="breakAfterAcquireFailure" value="false"></property>
</bean>
<!--Hibernate SessionFatory-->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocations">
<list>
<value>classpath:hibernate.cfg.xml</value>
</list>
</property>
<property name="configurationClass"
value="org.hibernate.cfg.AnnotationConfiguration" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.Oracle9Dialect
</prop>
<prop key="hibernate.show_sql">
false
</prop>
<prop key="hibernate.max_fetch_depth">
3

</prop>
<!-- 配置C3P0ConnectionProvider-->
<prop key="hibernate.connection.provider_class">
org.hibernate.connection.C3P0ConnectionProvider
</prop>
</props>
</property>
</bean>

配置结束,完活

3、需要注意的事项:

。如果dao继承HibernateDaoSupport,一定要用getHibernateTemplate(),不要使用getSession(),因为getSession()会得到原始的session,session的关闭以及事务完全不受spring控制了,我想既然是整合还是由spring来控制session会比较好,有些方法getHibernateTemplate()里面没有非要用session怎么办,方法如下:

public int queryByUserCount(final Users user) {
log.debug("finding Users count instance by example");
try {
int result = (Integer) getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
Example example = Example.create(user)
.excludeZeroes().ignoreCase().enableLike(); // use
// like
// for
// string
// comparisons
Criteria crit = arg0.createCriteria(Users.class)
.add(example).addOrder(Order.asc("userid"));
int totalPage = ((Number) crit.setProjection(
Projections.rowCount()).uniqueResult())
.intValue();

return totalPage;
}
});
return result;
} catch (RuntimeException re) {
log.error("find by example failed", re);
throw re;
}
}

。如果在service类或者它的父类中定义了私有ApplicationContext的私有变量,千万不要通过new的形式来获得,否则spring在加载service类的时候会给每个ApplicationContext创建一个连接,也就是连接数和service的个数是一样的,即使在变量前面加上static final,也会在启动tomcat的时候创建一个连接,在启动tomcat的时候,本来在web.xml中已经加载过spring的配置文件,会创建一个连接,这样就会有两个连接,如果你的连接池初始连接数是3,就会创建3*2=6的连接数,如果变量前面没加static final,启动tomcat创建的连接数就是service类的个数*3+1,这样很容易达到数据库允许连接的上限导致无法获得连接,这显然不是我们想要的,解决方法就是一、避免在service中定义ApplicationContext的私有变量,这有点不合人情;二、从web.xml中获取ApplicationContext,方法如下:

首先新建一个类SJBInit.java,内容如下:

public class SJBInit {
/**
* 系统应用spring环境
*/
private static ApplicationContext ctx;

/**
* 单实例对象
*/
private static SJBInit instance = null;

Vector temp = new Vector(50);

/**
* 构造函数
*/
public SJBInit() {
if (instance == null){
instance = this;
}
}

/**
* 获得单实例对象
*
* @return
*/
public static SJBInit getInstance() {
if (instance == null)
new SJBInit();
return instance;
}

/**
* 初始化Spring组件
*/
public void init(Properties props) throws Exception {

loadContextXML(props);

}

/**
* 加载spring对象
*
* @param props
*/
private void loadContextXML(Properties props) throws Exception{
String path ="";
/*LogFactory.getInstance().logRun(RunPriority.INFORMATIONAL,
LogConstants.sysLogConstants.INT_SPRING_START,
null
);*/
try {
ServletContext servletContext = (ServletContext) props
.get("APP_CONTEXT");
if (servletContext != null)
ctx = WebApplicationContextUtils
.getRequiredWebApplicationContext(servletContext);
}

catch (Exception e) {
e.printStackTrace();


}
if ((ctx == null) || (ctx.getBeanDefinitionNames().length == 0)) {

}

}

/**
* 得到spring的所有配置文件
*
* @param path
* @return
*/
private void setConfigFiles(String path) {

File file = new File(path);
if (file.isDirectory()) {
File[] files = file.listFiles();
for (int index = 0; index < files.length; index++) {
String filePath = files[index].getPath();
if (filePath.endsWith(".xml")) {
this.temp.add(filePath);
}
}
}
}

/**
* 得到一个spring的配置对象
*
* @param name
* @return
*/
public Object getBean(String name) {
if (ctx == null)
return null;
else
return ctx.getBean(name);
}


/**
* 获取单个信息
*
* @param key
* @param object
* @param request
* @return
*/
public static String getMessage(String key, Object[] object, Locale locale) {
return ctx.getMessage(key, object, locale);
}

}

然后创建InitServlet.java,内容如下:

public class InitServlet extends HttpServlet{

static final long serialVersionUID = -1111516993124229949L;

/**
* 启动对象实例
*/
private SJBInit sjbinit = SJBInit.getInstance();

/**
* servlet初始化
*/
public void init(ServletConfig config) throws ServletException {

super.init(config);
Properties props = new Properties();
props.put("APP_CONTEXT", config.getServletContext());
// 文件路径
String prefix = getServletContext().getRealPath("/");

// web应用路径
props.put("APP_PATH", prefix);

try {

sjbinit.init(props);

}catch(Exception e){

}
}
}

然后在web.xml中配置

...

<servlet>
<description>System init when start</description>
<display-name>InitServlet</display-name>
<servlet-name>InitServlet</servlet-name>
<servlet-class>com.fone.platform.core.InitServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml,
classpath:applicationContext-*.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

.....

然后再创建类SJBUtil.java,内容如下:

public class SJBUtil {
/**
* sjb管理类实例
*/
private static SJBInit sjb = SJBInit.getInstance();


/**
* 得到一个系统配置 bean
*
* @param name bean的配置名称
* @return 如果系统没有加载返回 null
*/
public static Object getBean(String name) {
return sjb.getBean(name);
}

}

然后在service类中通过SJBUtil.getBean("...");就可以获得spring中的dao类了

public UsersDAO getUsersDAO() {
return (UsersDAO) SJBUtil.getBean(SJBNameConstants.DAO_USERS_BEAN_NAME);
}

这个问题结束。

。如果连接数太过,报出heap内存溢出的异常,可以进行如下配置:

如果启动tomcat的时候出现heap溢出,需要修改tomcat目录下bin目录下的两个文件:
1、catalina.bat:在第一行中添加set JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m
2、catalina.sh:在第一行中添加JAVA_OPTS=-Xms64m -Xmx256m -XX:PermSize=128M -XX:MaxNewSize=256m -XX:MaxPermSize=256m

如果运行tomcat还有heap内存溢出,就在tomcat中配置jdk参数-Xms512m -Xmx512m

tomcat->config->Tomcat 5.x->JDK,添加jdk之后,在下面添加参数-Xms512m -Xmx512m

分享到:
评论

相关推荐

    Hibernate2和Hibernate3连接池配置.doc

    本文将详细讲解Hibernate2和Hibernate3中如何配置连接池,以及官方推荐的C3P0、Proxool和DBCP等连接池的使用。 首先,我们需要了解的是,Hibernate2和Hibernate3对连接池的支持有所不同。在Hibernate2中,Apache的...

    Hibernate 连接池的配置方式.doc

    这篇文档主要讨论了Hibernate连接池的配置方式,特别是C3P0和Proxool的配置。 首先,Hibernate提供了多种连接池选择,包括dbcp、C3P0和Proxool。然而,由于dbcp存在一些问题,如空连接无法释放的BUG,Hibernate从...

    java hibernate中各种连接池比较

    本文将对比分析三个常见的开源数据连接池:C3P0、DBCP 和 Proxool,并深入探讨它们的主要参数和使用场景。 1. C3P0 Hibernate 开发团队推荐使用 C3P0 连接池。C3P0 是一个开源的 JDBC 连接池,它提供了强大的异常...

    Struts2 + Spring 2.5 + Hibernate 3.3 整合(实际使用项目,version1)

    proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿google人名自动补全;头像上传剪切压缩处理。 包含有完整的jar包和源代码,这是专门为我们实验室定制开发的,包含了架构基于s2sh技术...

    Struts2 + Spring3 + Hibernate3.5 整合(实际使用项目,version3).part1

    proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿google人名自动补全;头像上传剪切压缩处理。 包含有完整的jar包和源代码,可以直接下载编译部署和运行,这是专门为我们实验室定制开发...

    Struts2 + Spring3 + Hibernate3.5 整合(集成测试配套jar包更新构建脚本使用说明)

    proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿google人名自动补全;头像上传剪切压缩处理。 包含有完整的jar包和源代码,可以直接下载编译部署和运行,这是专门为我们实验室定制开发...

    hibernate配置连接池

    值得注意的是,尽管Proxool是一个不错的选择,但随着技术的发展,更现代的连接池如HikariCP、C3P0和Druid等已经变得更加流行,它们提供了更好的性能和稳定性。因此,根据项目的具体需求,你可能需要考虑使用这些更...

    Spring各种连接池的比较.doc

    本篇文章将深入探讨Spring支持的几种主要连接池,包括Apache DBCP、C3P0以及Proxool,并分析它们的特性、配置和适用场景。 首先,Apache DBCP(BasicDataSource)是Spring开发团队推荐的数据源,它是Apache Commons...

    Struts2 + Spring3 + Hibernate3.5 整合(实际使用项目,version2)

    proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿google人名自动补全;头像上传剪切压缩处理。 包含有完整的jar包和源代码,可以直接下载编译部署和运行,这是专门为我们实验室定制开发...

    Struts2 + Spring3 + Hibernate3.5 整合(实际使用项目,version3).part3

    proxool(据说是dbcp和c3p0三者中最优秀的)做连接池;使用jquery的ajax实现仿google人名自动补全;头像上传剪切压缩处理。 包含有完整的jar包和源代码,可以直接下载编译部署和运行,这是专门为我们实验室定制开发...

    SSH.rar_hibernate proxool

    SSH.rar_hibernate proxool 这个压缩包文件主要涉及到的是Java Web开发中的一些核心技术整合,尤其是Hibernate、Struts和Spring框架的集成,以及数据库连接池的配置,特别是Proxool和C3P0的使用。这里我们将深入探讨...

    Java Spring常用高性能连接池以及属性

    Java Spring常用高性能连接池以及属性 * C3P0比较耗费资源,效率方面可能要低一点。 * DBCP在实践中存在BUG,在某些种情会产生很多空连接不能释放,Hibernate3.0已经放弃了对其的支持。 * Proxool的负面评价较少,...

    j2ee 开发框架

    一套超简单的J2EE开发框架. 本框架的特点是: ...5、可随意切换多个连接池(C3P0,PROXOOL,自带连接池) 6、可配置到无缝连接Spring和hibernate 7、让使用JSP像使用HTML一样轻松简单,只需了解少许简单表达式即可

    struts2 hibernate3.2 spring2.5集成步骤

    4. **选择数据源**:默认情况下,Hibernate会使用其自带的数据源,但在生产环境中通常建议使用第三方连接池,如C3P0或Proxool等,以提高性能和稳定性。 #### 三、配置Hibernate的数据源 为了更好地管理数据库连接...

    Java的Spring框架的三种连接池的基本用法示例

    本文将详细介绍Spring支持的三种连接池——C3P0、DBCP和Proxool的基本用法。 1. Proxool连接池: Proxool是一种轻量级的数据库连接池,因其较低的资源消耗和良好的监控功能而受到推荐。在Spring中配置Proxool连接池...

    Hibernate jar包通用版

    4. **c3p0-0.9.1.jar**:C3P0是一个开源的JDBC连接池,它提供了数据源管理和连接管理服务,能有效地管理和复用数据库连接,降低数据库的资源消耗。 5. **javassist-3.9.0.GA.jar**:Javaassist是一个字节码处理库,...

Global site tag (gtag.js) - Google Analytics