Hibernate事务开启后,数据库连接一直打开么?

Hibernate事务开启后,数据库连接一直打开么?
我试验好像没开连接,但是书上说数据库连接一直打开!!

[quote]session只有在提交SQL时,才占用连接吧. [/quote]
也不是,session其实你就可以看作是jdbc的connection。
其实不用太纠结这个方面的,你用多了自然就知道了,你可以用session对象有哪些方法,可以得到哪些对象,就明白了这个过程。

不是一直打开,是因为数据库连接(session)被hibernate或者spring管理着,假如不用的连接是回收到连接池里面去了,没有直接关闭,以便于下次连接要用的时候直接去连接池去取连接(没有关闭的连接可以取来直接用)

[quote]这个时候,会新打开2个链接么? [/quote]
嗯,连接池有个最大限度和连接不够的处理方案,假如连接不够了,会重新新建一个连接,放入池中让你用。

[quote]可是这个时候,我并没有使用连接啊,只是开启数据库事务而已,它就又开了两个连接,感觉不是很合适。如果n个客户端都同时开启了Hibernate事务,但是并没有进行持久化相关的操作。那就开启100个连接,感觉不太好。 [/quote]
1,数据库事务必然是建立在数据连接上的,所以肯定需要连接。
2,不一定会重新开两个连接,因为你这个操作的时候,另外的地方已经操作完毕,连接估计已经放入池子中了,那么仍然用连接池的。

数据库连接池的功能就是为了避免你的N次操作会去发出N个数据库连接,为了节省资源和时间,所以会放多个数据库连接在连接池中,而连接池中又对放置其中的数据库连接定义了多个属性,比如连接池中数据库连接的最大个数,每个连接的存活时间等。如果执行一次操作时,会从连接池中取出一个当前存活并且空闲的连接给你使用,操作完成会将连接再次设置为空闲状态,以便下次使用,这时放回的连接不会断开,而当超过最大存活时间时,就会将连接关闭。

一般来说,你进行某个操作的时候,你前面几个操作都已经不需要这个连接(已经回收到连接池了)了,那么就继续在连接池里面取,假如按你说的并发数量太大,已经于都没来得及回收,现在连接池会生成更多的连接数量(《=最大限制m),假如这个m不能满足你需要,你就调大点。这也是为什么数据库操作的时候配置好合适的连接池是必须的。

[quote]是不是说,我开启了Hibernate事务,只要没有进行持久化操作,他就不占用连接,只有进行Commit的时候,他才从连接池中取得一个连接,Commit结束后,连接重新被放入连接池中! [/quote]
在你的情况中不是,事务是必须建立在连接基础上的。数据库连接才能产生事务。

[quote]是不是说,我开启了Hibernate事务,只要没有进行持久化操作,他就不占用连接,只有进行Commit的时候,他才从连接池中取得一个连接,Commit结束后,连接重新被放入连接池中![/quote]

是的,只要当进行连接时就会从连接池中取数据库连接。

只是说这个连接可能还是池子中的 不是重新生成的而已。 :wink:
应该明白了吧。

[quote]那就是说我开启了100个hibernate事务,连接池中的数据库连接肯定>=100,
但是这些连接在没有持久化操作的时候,可以随时被其他人使用,是这样么? [/quote]
不是,你只有用完了 不要这个连接(放入池中) 才会被其他使用。

[quote]我以前认为每个http请求一个session,也可以每个http请求一个Hibernate,其实这样严重限制了数据库的并发性能 [/quote]
现在一般ssh项目,在每个action请求,会开启一个session,并且绑定到当前线程变量threadLocal里面去,然后所做的事务会和这个session是一致的。
但是现在说的是同数据源事务的,跨数据源事务的那是另外一回事儿了,讨论起来可以写本书了哈哈。

你使用的是自定义事务?

纯粹的读操作是没有必要加事务的,如果你使用自定义事务那有可能处处都得写,不是很好。

理论上是这样,但是你这个action对应的是一个session(connection) ,一般来说只有请求结束后session(connection)才被释放。

而且session里面不是持有connection吗,那么你仍然可以得到这个connnection后,直接操作它,管理它的创建跟关闭。

收获不少!谢谢