Spring问题汇总

与JBoss集成:

由于历史原因,JBoss和Spring的集成并那么理想, 需要加上其他包,以及配置web.xml
<context-param>  
    <param-name>contextClass</param-name>  
    <param-value>  
        org.jboss.spring.vfs.context.VFSXmlWebApplicationContext  
    </param-value>  
</context-param>

需要下载 jboss-spring-subsystem-as7-nodeps-2.0.1.Final.zip 中的module-deployer\org\jboss\snowdrop\main\snowdrop-vfs.jar
参阅  http://www.jboss.org/snowdrop/downloads keyword: snowdrop


与Hibernate集成:

懒加载

session在service调用完毕之后关闭, 导致在jsp无法获取当前session, 在web.xml里面加入以下配置, 使session在view情况下开起, 以满足lazy的需求
在配置mapping的时候,需要注意filter的顺序, 该filter的优先级可以为最高
	<filter> 
		<filter-name>openSessionInViewFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
	</filter>
	 <filter-mapping>
		<filter-name>openSessionInViewFilter</filter-name> 
		<url-pattern>/*</url-pattern>
	</filter-mapping>

事务处理

Hibernate默认情况下,在select, update, insert, delete之前都会将脏数据flush掉, 在某些情况下,我们并不需要这样的场景,需要将flushmode为manual或者commit
bean.xml  在hibernateTemplate中注入flushMode的值, 是Hibernate的父类HibernateAccessor中的一个属性
	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory" />
		<property name="flushMode" value="3"></property>
	</bean>

web.xml, 在web应用中,OpenSessionInViewFilter中的flushMode参数会将hibernateTemplate中的覆盖掉.
	<filter> 
		<filter-name>openSessionInViewFilter</filter-name>
		<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
		<init-param>
          <param-name>flushMode</param-name>
          <param-value>COMMIT</param-value>
		</init-param>
	</filter>

连接超时

在一段时间不适用应用之后,初次访问应用会遇到以下异常,但是刷新之后异常消失
org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.TransactionException: JDBC begin failed: 
	org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:599)
	org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:374)
	org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:89)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
	$Proxy24.validUser(Unknown Source)
	active.security.servlet.LoginServlet.doPost(Unknown Source)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	active.security.servlet.DelegatingServletProxy.service(Unknown Source)
	org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198)
	org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	active.security.filter.CharsetEncodingFilter.doFilter(Unknown Source)

可能是由于数据源的配置错误导致, 如下配置c3p0:
beans.xml
	<bean id="dataSource" destroy-method="close"
		class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="driverClass" value="${jdbc.driverClassName}" />
		<property name="jdbcUrl" value="${jdbc.url}" />
		<property name="user" value="${jdbc.username}" />
		<property name="password" value="${jdbc.password}" />
		<property name="breakAfterAcquireFailure" value="true" />
	</bean>

参数解释:
<!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间, default:3 -->
<property name="initialPoolSize" value="${c3p0.initialPoolSize}" />

<!--连接池中保留的最小连接数 -->
<property name="minPoolSize" value="${c3p0.minPoolSize}" />

<!--连接池中保留的最大连接数, default:15 -->
<property name="maxPoolSize" value="${c3p0.maxPoolSize}" />

<!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃, default:0 -->
<property name="maxIdleTime" value="${c3p0.maxIdleTime}" />

<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数, default:3 -->
<property name="acquireIncrement" value="${c3p0.acquireIncrement}" />

<!--每n秒检查所有连接池中的空闲连接, default:0 -->
<property name="idleConnectionTestPeriod" value="${c3p0.idleConnectionTestPeriod}" />

<!--定义在从数据库获取新连接失败后重复尝试的次数, default:30 -->
<property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}" />

<!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常.但是数据源仍有效保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭, default:false -->
<property name="breakAfterAcquireFailure" value="${c3p0.breakAfterAcquireFailure}" />

<!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量.但由于预缓存的statements属于单个connection而不是整个连接池,所以设置这个参数需要考虑到多方面的因素.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭, default:0 -->
<property name="maxStatements" value="${c3p0.maxStatements}" />

<!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能, default:false -->
<property name="testConnectionOnCheckout" value="${c3p0.testConnectionOnCheckout}" />



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值