Spring 开发笔记

序:很多都从网络零散摘录,有不妥之处,还忘见谅。

1.DBCP+Spring配置

1.加入jar包

commons-pool.jar
commons-logging.jar
commons-dbcp.jar

2.xml配置页面

<!-- =================================== 配置Spring数据源 ========================================= -->
          <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" 
              destroy-method="close"> 
          <property name="driverClassName" value="org.sqlite.JDBC" /> 
          <property name="url" value="jdbc:sqlite:search.db" />
          <property name="maxIdle" value="10"/>
          <property name="maxActive" value="100"/>
          <property name="maxWait" value="10000"/>
          <property name="validationQuery" value="select 1"/>
          <property name="testOnBorrow" value="false"/>
          <property name="testWhileIdle" value="true"/>
          <property name="timeBetweenEvictionRunsMillis" value="1200000"/>
          <property name="minEvictableIdleTimeMillis" value="1800000"/>
          <property name="numTestsPerEvictionRun" value="5"/>
          <property name="defaultAutoCommit" value="true"/>
      </bean>
      <!-- 
          BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性,
          以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,
           还有一些常用的属性: 
          defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true; 
          defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false; 
          maxActive:最大连接数据库连接数,设置为0时,表示没有限制; 
          maxIdle:最大等待连接中的数量,设置为0时,表示没有限制; 
          maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息; 
          validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据,
                            如你可以简单地设置为:“select count(*) from user”; 
          removeAbandoned:是否自我中断,默认是 false ; 
          removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值; 
          logAbandoned:是否记录中断事件, 默认为 false;
       -->

2.事务+Spring配置

最近碰到这个问题,在使用spring提供的JpaTemplate进行查询时,如果数据量超过100 条,查询效率就会明显降低。由于开始时使用JPA内部的双向关联,造成各实体内部关联过多,从而影响所有的操作,因此怀疑是因为JPA的关联关系所致。但 是去掉关联关系后的效果不显著。 
查找spring的相关配置,发现原来关于“transactionAttributes”有问题。原来的配置如下: 

<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean" 
 lazy-init="true" abstract="true"> 
 <property name="transactionManager"> 
 <ref bean="transactionManager" /> 
 </property> 
 <property name="transactionAttributes"> 
 <props> 
 <prop key="sav*">PROPAGATION_REQUIRED</prop> 
 <prop key="update*">PROPAGATION_REQUIRED</prop> 
 <prop key="delete*">PROPAGATION_REQUIRED</prop> 
 <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop> 
 <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop> 
 </props> 
 </property> 
 </bean> 
使用上述配置,在JPA打出的日志中显示每次查询时都要进行更新操作,查阅相关spring 的资料后发现transactionAttributes的各种属性的意义,现把资料分享如下: 
PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。 
PROPAGATION_SUPPORTS--支持当前事务,如果当前没有事务,就以非事务方式执行。 
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 
PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 
PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 
PROPAGATION_NEVER--以非事务方式执行,如果当前存在事务,则抛出异常。 
PROPAGATION_NESTED--如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。 提高SQL语句查询速度的方法
当前所有的事务都使用“PROPAGATION_REQUIRED”属性值,并且控制事务的操作权限为只读,以保证查询时不会更新数据。根据上述 定义 “PROPAGATION_REQUIRED”属性会造成为所有的操作都创建事务,从而会出现JPA的日志中查询时也会进行更新操作的现象,也就造成了效 率的低下。将所有查询的操作改成事务类型为“PROPAGATION_NEVER”(不使用事务),则查询效率立即提升,但是此时担心一个问题:比如在一 个saveXXX()的方法中,如果方法内部使用更新、查询、再更新的操作流程,会不会造成调用查询时,由于上述配置造成的抛出异常。 
另外,如果出现 
〈prop key="myMethod"〉PROPAGATION_REQUIRED,readOnly,-Exception〈/prop〉 
这样的配置,其中: 
-Exception表示有Exception抛出时,事务回滚. -代表回滚+就代表提交 
readonly 就是read only, 设置操作权限为只读,一般用于查询的方法,优化作用.


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值