JFinal ActiveRecordPlugin学习笔记

2017-01-12 09:53:30来源:oschina作者:zhuqianli人点击

配置Oracle数据库


public class DemoConfig extends JFinalConfig {
public void configPlugin(Plugins me) {
C3p0Plugin cp = new C3p0Plugin(……);
//配置Oracle驱动
cp. setDriverClass("oracle.jdbc.driver.OracleDriver");
me.add(cp);
ActiveRecordPlugin arp = new ActiveRecordPlugin(cp);
me.add(arp);
// 配置Oracle方言
arp.setDialect(new OracleDialect());
// 配置属性名(字段名)大小写不敏感容器工厂
arp.setContainerFactory(new CaseInsensitiveContainerFactory());
}
}

这里使用了C3P0插件需要导入jar包,maven依赖:



c3p0
c3p0
0.9.1.2

按照官方文档这样配置,在使用事务的会出现


java.sql.SQLException: 仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级

这是需要设置事务处理级 因为oracle只支持两种事务处理级READ_COMMITTED和SERIALIZABLE


更改配置为


C3p0Plugin cp = new C3p0Plugin("jdbc:oracle:thin:@192.168.8.233:1521:hzsmdb",
"hzsmdb", "hzsm#DB");
cp.setDriverClass("oracle.jdbc.driver.OracleDriver");
me.add(cp);
ActiveRecordPlugin arp = new ActiveRecordPlugin("oracle",cp);
//java.sql.SQLException: 仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级
arp.setTransactionLevel(Connection.TRANSACTION_READ_COMMITTED);
me.add(arp);
//配置方言
arp.setDialect(new OracleDialect());
//配置属性名(字段名)大小写不敏感工厂
arp.setContainerFactory(new CaseInsensitiveContainerFactory());

通过源码得知默认事务处理级是REPEATABLE_READ可重复读


public ActiveRecordPlugin(String configName, IDataSourceProvider dataSourceProvider) {
this(configName, (IDataSourceProvider)dataSourceProvider, 4);
}
为了避免上面出现的几种情况,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。
● 未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
● 授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
● 可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
● 序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,
而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,
在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

配置MySQL数据库


public void configPlugin(Plugins me) {
DruidPlugin dp = new DruidPlugin("jdbc:mysql://localhost/jfinal", "root", "");
ActiveRecordPlugin arp2 = new ActiveRecordPlugin("mysql",dp);
me.add(dp);
me.add(arp2);
}

这里需要Druid数据库连接池的jar包,maven依赖:



com.alibaba
druid
1.0.7

JFinal 可以同时使用多数据源 当使用多数据源时,只需要对每个 ActiveRecordPlugin 指定一个 configName 即可


调用时


// 查询 dsMysql数据源中的 user
List users = Db.use("mysql").find("select * from user");
// 查询 dsOracle数据源中的 blog
List blogs = Db.use("oracle").find("select * from blog");
// 默认使用arp.addMapping(...)时关联起来的数据源
Blog blog = Blog.me.findById(123);
// 只需调用一次use方法即可切换到另一数据源上去
blog.use("mysql").save();

配置了多数据源在使用时,最好都带上user("configname")


boolean success = Db.use("mysql").tx(new IAtom() {
public boolean run() throws SQLException {
int count2 = 0;
int count1 = 0;
try {
count2 = Db.use("mysql").update("update account set cash = cash + ? where id = ?", 700, 2);
count1 = Db.use("mysql").update("update account set cash = cash - ? where id = ?", 700, 1);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return count2==1&&count1==1;
}
});

我就在使用事务的时候没有加上use()导致许多错误


比如说Db.use().tx.... 这里没有使用 会导致里面的代码不具有事务的功能


上面配置的connection可能和你里面使用的不是同一个,上面配置了不自动提交,你里面使用时用到的connection可能就是自动提交的 有能还会报java.sql.SQLException: 仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级,因为tx你使用了oracle的数据源,而且刚好你oracle没有配置处理级别,会让你误以为自己mysql只有这两种事务处理级

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台