对JFinal 的db connection的疑问

一千年前的人 发布于 2014/03/31 16:54
阅读 588
收藏 0

Linux基金会免费官方培训及考试申请即将截止,戳这里申请!>>>

读JFinal代码发现里面 对JFinal 的db connection的管理 都是放在 threadLocal 里面的。

1、这是为了解决  嵌套事务  而设计的, 对吗?

2、一个tomcat servlet服务线程和一个db connection绑定。

tomcat servlet 线程 1 绑定 db connection 1
tomcat servlet 线程 2 绑定 db connection 2
tomcat servlet 线程 3 绑定 db connection 3
tomcat servlet 线程 N 绑定 db connection N

如果db的最大连接只有20个。
tomcat servlet 线程数最大是100个,此时是什么情景呢?
谢谢指导 @JFinal

----------------------------- 分割线 --------------------------

顺便推广一下 jfinal 官方网站  http://www.jfinal.com/ 

热心的 OSCer,让我们一起  支持  jfinal的发展吧

加载中
0
JFinal
JFinal

    纯粹是为了辅助实现事务功能的。如果你的程序中没有使用事务,即没有使用 Tx拦截器 或 Db.tx(..)方法,那么 threadlocal 是没有值。

   当连接请求的线程数大于db最大连接数时就会发生等待,如果等待超出配置时间就会超时,可以适当将连接池最大连接数设置得大些

0
菜根乱谭
菜根乱谭

没认真看过这段代码,估摸着是解决并发连接,一个请求给一个数据库连接,避免数据库操作等待,加线程池是起到数据库连接池的作用。

0
一千年前的人
一千年前的人

我自己顶一下!别沉了。

0
一千年前的人
一千年前的人

引用来自“JFinal”的评论


    纯粹是为了辅助实现事务功能的。如果你的程序中没有使用事务,即没有使用 Tx拦截器 或 Db.tx(..)方法,那么 threadlocal 是没有值。

   当连接请求的线程数大于db最大连接数时就会发生等待,如果等待超出配置时间就会超时,可以适当将连接池最大连接数设置得大些



谢谢官方解答。

感觉这个 threadlocal 仅仅是为了支持  “嵌套事务”, 所以我认为,程序里面应该禁止出现嵌套事务的调用, 例如方法update2就是嵌套事务,应避免这样写。

@Before({Transaction.class})
public void update1() {
// update1更新db
}


@Before({Transaction.class})
public void update2() {
    update1()
    // update2更新db
}


JFinal
JFinal
最初是为了支持事务,后来添加嵌套事务支持以后,正好也可以用threadlocal支持了,感谢支持 jfinal 发展 ^_^
0
南湖船老大
南湖船老大

很简单的道理,100个客人来了,不需要100个服务员去招待。也许只要20个。只要服务员的速度够快,就能让100个顾客都满意

0
一千年前的人
一千年前的人

引用来自“南湖船老大”的评论

很简单的道理,100个客人来了,不需要100个服务员去招待。也许只要20个。只要服务员的速度够快,就能让100个顾客都满意

有道理.....  这里在讨论服务员和厨师配比的问题。

JFinal
JFinal
回复 @屁屁果 : JFinal 不限定事务在哪个层 Db.tx(....) 建议在 Model 或 Service 层
光石头
光石头
servlet和connection直接绑定会造成并发问题,spring是使用一个map弱化了绑定关系。jfinal的事务默认在controller层也就不用考虑这个了,结果都等于直接绑定
0
一千年前的人
一千年前的人

回复 @屁屁果 :

所以 最好禁止使用 嵌套事务,然后 解除 servlet和connection直接绑定 。 你觉得怎么样? 或是有其他好办法?

一千年前的人
一千年前的人
回复 @屁屁果 : 谢谢, 豁然开朗!!
光石头
光石头
嵌套事务是最基本的需求,不用禁止,解除绑定参照spring的实现就可以了
返回顶部
顶部