标签:des http io ar os 使用 sp java for
注解<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> <!-- 读取properties配置文件 --> <bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer"> <property name="locations"> <list> <!-- 配置文件的位置 --> <value>classpath:jdbc.properties</value> </list> </property> </bean> <!-- 配置数据源 --> <bean id="dataSource" destroy-method="close" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" /> <property name="jdbcUrl" value="${jdbcUrl}" /> <property name="user" value="${user}" /> <property name="password" value="${password}" /> <property name="maxPoolSize" value="40" /> <property name="minPoolSize" value="1" /> <property name="initialPoolSize" value="1" /> <!-- 连接的最大空闲时间 --> <property name="maxIdleTime" value="60" /> <!--当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出 SQLException,如设为0则无限期等待。单位毫秒。Default: 0 --> <property name="checkoutTimeout" value="2000" /> </bean> <!-- 配置sessionFactory --> <bean id="sessionFatory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"> </property> <property name="hibernateProperties"> <props> <!-- sessionFactory.getCurrentSession()可以完成一系列的工作,当调用时, hibernate将session绑定到当前线程,事务结束后,hibernate 将session从当前线程中释放,并且关闭session。当再次调用getCurrentSession ()时,将得到一个新的session --> <prop key="current_session_context_class">thread</prop> <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop> <!-- 自动重连 --> <prop key="hibernate.autoReconnect">true</prop> <!-- 显示sql语句 --> <prop key="hibernate.show_sql">true</prop> <!-- 链接编码方式 --> <prop key="hibernate.connection.characterEncoding">utf-8</prop> <!-- 二级缓存 --> <prop key="hibernate.cache.use_second_level_cache">true</prop> <!-- 3 要指定缓存的供应商 --> <!-- <prop key="hibernate.cache.provider_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop> --> <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory </prop> <!-- 验证 --> <prop key="javax.persistence.validation.mode">none</prop> <!-- 自动创建表 --> <!-- <prop key="hibernate.hbm2ddl.auto">update</prop> --> </props> </property> <!-- orm映射文件的位置之三 --> <!-- mappingDirectoryLocations:指定映射的文件路径 --> <property name="mappingDirectoryLocations"> <list> <value>classpath:cn/jbit/bean</value> </list> </property> <![CDATA[ <!-- orm映射文件的位置之一 --> <!-- mappingResources:指定classpath下具体映射文件名 --> <property name="mappingResources"> <list> <value> cn/jbit/bean/Dept.hbm.xml </value> </list> </property> <!-- orm映射文件的位置之二 --> <!-- mappingLocations:可以指定任何文件路径,并且可以指定前缀:classpath、file等 --> <!-- 也可以用通配符指定,'*'指定一个文件(路径)名,'**'指定多个文件(路径)名,例如: --> <property name="mappingLocations"> <list> <value>classpath:cn/jbit/bean/*.hbm.xml</value> </list> </property> <!-- orm映射文件的位置之三 --> <!-- mappingDirectoryLocations:指定映射的文件路径 --> <property name="mappingDirectoryLocations"> <list> <value>classpath:cn/jbit/bean</value> </list> </property> <!-- 注解扫描类 --> <property name="annotatedClasses"> <list> <value></value> </list> </property> <!-- 注解扫描包 --> <property name="annotatedPackages"> <list> <value></value> </list> </property> ]]> </bean> <!-- 声明事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 配置事物管理 --> <![CDATA[ 事务管理是企业级应用程序开发中必不可少的技术, 用来确保数据的完整性和一致性. 事务就是一系列的动作, 它们被当做一个单独的工作单元. 这些动作要么全部完成, 要么全部不起作用 事务的四个关键属性(ACID) 原子性(atomicity): 事务是一个原子操作, 由一系列动作组成. 事务的原子性确保动作要么全部完成要么完全不起作用. 一致性(consistency): 一旦所有事务动作完成, 事务就被提交. 数据和资源就处于一种满足业务规则的一致性状态中. 隔离性(isolation): 可能有许多事务会同时处理相同的数据, 因此每个事物都应该与其他事务隔离开来, 防止数据损坏. 持久性(durability): 一旦事务完成, 无论发生什么系统错误, 它的结果都不应该受到影响. 通常情况下, 事务的结果被写到持久化存储器中. Spring 中的事务管理 作为企业级应用程序框架, Spring 在不同的事务管理 API 之上定义了一个抽象层. 而应用程序开发人员不必了解底层的事务管理 API, 就可以使用 Spring 的事务管理机制. Spring 既支持编程式事务管理, 也支持声明式的事务管理. 编程式事务管理: 将事务管理代码嵌入到业务方法中来控制事务的提交和回滚. 在编程式管理事务时, 必须在每个事务操作中包含额外的事务管理代码. 声明式事务管理: 大多数情况下比编程式事务管理更好用. 它将事务管理代码从业务方法中分离出来, 以声明的方式来实现事务管理. 事务管理作为一种横切关注点, 可以通过 AOP 方法模块化. Spring 通过 Spring AOP 框架支持声明式事务管理. Spring 从不同的事务管理 API 中抽象了一整套的事务机制. 开发人员不必了解底层的事务 API, 就可以利用这些事务机制. 有了这些事务机制, 事务管理代码就能独立于特定的事务技术了. Spring 的核心事务管理抽象是 org.springframework.transaction.PlatformTransactionManager org.springframework.orm.hibernate4.HibernateTransactionManager 用 Hibernate 框架存取数据库事务管理器的一个实现 ]]> <!-- 开启注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> <![CDATA[ Spring 还允许简单地用 @Transactional 注解来标注事务方法. 为了将方法定义为支持事务处理的, 可以为方法添加 @Transactional 注解. 根据 Spring AOP 基于代理机制, 只能标注公有方法. 可以在方法或者类级别上添加 @Transactional 注解. 当把这个注解应用到类上时, 这个类中的所有公共方法都会被定义成支持事务处理的. 在 Bean 配置文件中只需要启用 <tx:annotation-driven> 元素, 并为之指定事务管理器就可以了. 如果事务处理器的名称是 transactionManager, 就可以在<tx:annotation-driven> 元素中省略 transaction-manager 属性. 这个元素会自动检测该名称的事务处理器. 事务传播属性 当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行, 也可能开启一个新事务, 并在自己的事务中运行. REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。 NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。 REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。 MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。 SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。 NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。 NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。 事务的隔离级别 从理论上来说, 事务应该彼此完全隔离, 以避免并发事务所导致的问题. 然而, 那样会对性能产生极大的影响, 因为事务必须按顺序运行. 在实际开发中, 为了提升性能, 事务会以较低的隔离级别运行. 事务的隔离级别可以通过隔离事务属性指定 Spring 支持的事务隔离级别 Default 使用数据库的默认隔离级别,对于大多数数据库来说,默认是隔离级别是READ_COMMITED READ_UNCOMMITED 允许事务读取已经被其他事务提交的变更,脏读,不可重复度和幻读的问题都会出现 READ_COMMITED 只允许事务读取已经被其他事务提交的变更,可以避免脏读,但不可重复读和幻读问题仍然可能出现 REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻读 脏读,不可重复读,幻读 脏读:张三的工资为5000,事务A中把他的工资改为8000,但事务A尚未提交。与此同时,事务B正在读取张三的工资,读取到张三的工资为8000。随后,事务A发生异常,而回滚了事务。张三的工资又回滚为5000。最后,事务B读取到的张三工资为8000的数据即为脏数据,事务B做了一次脏读。 不可重复读:在事务A中,读取到张三的工资为5000,操作没有完成,事务还没提交。 与此同时,事务B把张三的工资改为8000,并提交了事务。随后,在事务A中,再次读取张三的工资,此时工资变为8000。在一个事务中前后两次读取的结果并不致,导致了不可重复读。 幻读:A目前工资为5000的员工有10人,事务A读取所有工资为5000的人数为10人。此时,事务B插入一条工资也为5000的记录。这是,事务A再次读取工资为5000的员工,记录为11人。此时产生了幻读。 设置回滚事务属性 默认情况下只有未检查异常(RuntimeException和Error类型的异常)会导致事务回滚. 而受检查异常不会. 事务的回滚规则可以通过 @Transactional 注解的 rollbackFor 和 noRollbackFor 属性来定义. 这两个属性被声明为 Class[] 类型的, 因此可以为这两个属性指定多个异常类. rollbackFor: 遇到时必须进行回滚 noRollbackFor: 一组异常类,遇到时必须不回滚 超时和只读属性 由于事务可以在行和表上获得锁, 因此长事务会占用资源, 并对整体性能产生影响. 如果一个事物只读取数据但不做修改, 数据库引擎可以对这个事务进行优化. 超时事务属性timeout: 事务在强制回滚之前可以保持多久. 这样可以防止长期运行的事务占用资源. 只读事务属性readonly: 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务. ]]> </beans>
标签:des http io ar os 使用 sp java for
原文地址:http://blog.csdn.net/ya985860612/article/details/41171375