http://commons.apache.org/transaction/
有这么一个东西,其中的file包用来实现文件事务,不过具体实现方式实在不敢恭维。它完全依靠文件系统来保证它的事务,例如,它假设文件的删除、覆盖操作是一个原子操作,这样,当一个事务要修改任何一个文件的时候,它都是给你一个OutputStream,这个流输出到一个临时目录。提交的时候,它把用临时目录中的文件覆盖真正的文件。
也就是说,它不支持随机写
,假如有一个10M的文件(或者100M或者更大),哪怕一个事务中只修改一个字节,也要写10M,性能实在很差。如果仅仅是这样,对于
很多对性能没有要求的应用来说,应该还是不错的。
但它好像还有更多的问题。可以做一个实验,大致如下:
try{
开始事务
删除文件1
删除文件2
提交
}catch(){
回滚
}
我们用点手段锁住文件2,让这个文件删不掉,然后运行这个程序,同时结合源代码进行跟踪,并观察存储目录和临时工作目录的文件情况。结果发现:
1、提交的时候,当删除第一个文件的时候,它并没有把文件1复制到临时工作目录。文件1真的被删除了,这样当删文件2出错的时候,回滚是不可能的。
2、当删除文件2出错,并且代码执行到回滚的时候。真的出现了异常,说是数据库已经处于dirty的状态,不能操作了。这种情况等于是需要手工干预了。这个时候文件1被删除,文件2还在。
3、解除文件2的锁定,下次重启FileResourceManager的时候,会尝试进行恢复,结果是两个文件都被删掉。如果没有解除锁定,重启 FileResourceManager还要出错。
我觉得是非常不应该的,这样就机会没法用了,不知道他们怎么想的,还是我弄错了?
分享到:
相关推荐
commons-transaction 处理多级事务的集合 commons-validator 提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则 commons-vfs 虚拟文件系统 httpcomponents-client 和 http 协议...
commons-transaction 处理多级事务的集合 commons-validator 提供了一个简单的,可扩展的框架来在一个XML文件中定义校验器 (校验方法)和校验规则 commons-vfs 虚拟文件系统 httpcomponents-client 和 http 协议...
commons-collections-3.2.jar Apache Commons包中的一个, 包含了一些Apache开发的集合类,功能比java.util.*强大。必须使用的jar包 javassist-3.12.0.GA.jar 这个包也是必须的 jta.jar 当使用JTA规范时,必须加入,...
Apache commons-io Apache基金会创建并维护的Java函数库 Apache commons-logging 通用的日志接口 dom4j 优秀的JavaXML API 主要用于解析XML文档 poi组件 主要用于读取以及写入Microsoft Office格式档案 JSR 303 为...
3.3.2 Jakarta Commons数据库连接池 49 3.3.3 分布式高速缓存 49 3.4 将iBATIS添加到应用程序中 49 3.4.1 在独立应用程序中使用iBATIS 50 3.4.2 在Web应用程序中使用iBATIS 50 3.5 iBATIS和JDBC 51 3.5.1 释放JDBC...
第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...
13. //如果不用此包,在启动时抛出:nested exception is java.lang.NoClassDefFoundError: org/apache/commons/collections/SequencedHashMap 14. commons-collections-3.1.jar 15. 16. //这个似乎可以不用的 ...
import org.apache.commons.pool.impl.GenericObjectPool.Config; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Transaction; /** * @author Teaey */ ...
class="org.apache.commons.dbcp.BasicDataSource"> value="${database.driver}"> ${database.url}"> ${database.username}"> ${database.password}"> class="org.springframework.orm....
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> ...
9.5.1. 理解Spring的声明式事务管理实现 9.5.2. 第一个例子 9.5.3. 回滚 9.5.4. 为不同的bean配置不同的事务语义 9.5.5. <tx:advice/> 有关的设置 9.5.6. 使用 @Transactional 9.5.6.1. @Transactional 有关的设置 ...
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driverClassName}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- ...
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 连接池启动...
-- <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" lazy-init="false"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> ...
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 连接池启动...
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> ${jdbc.driver}" /> ${jdbc.url}" /> ${jdbc.username}" /> ${jdbc.password}" /> <!-- 连接池启动...
\contentsline {chapter}{Contents}{2}{section*.1} ... {14.6}apache.commons}{211}{section.14.6} {15}sqlite3}{213}{chapter.15} {16}Web基础}{215}{chapter.16} {16.1}HTML}{215}{section.16.1} {...