2011-07-02 124 views
1

在JDBC中,我们可以说,只要我们获得连接,交易就会开始,并在关闭连接时完成 。这是正确的吗?如果可以,我们可以说在不同的请求共享 相同的连接,即使所有未提交的交易将全部可见 所有请求?JDBC事务开始

回答

2

@BalusC - 这是不正确的。默认情况下,autocommit设置为true,这意味着事务在任何JDBC操作之前开始,并在该单一操作后结束RIGHT,而不是在连接关闭时结束。

但你说得对,共享连接确实不好,如果你想多线程你的数据库,最好是以你有线程池的方式处理它(在java.util.concurrent中查找ThreadPoolExecutor)和对于每个线程,您都会获得单独的连接。 ConnectionPool也是一个不错的选择,但我宁愿通过ThreadPool来限制它 - 这种方式永远不会有一个线程等待来自池的连接。

1

没错。这是默认行为。在完成所有查询后,检索连接并提交connection.commit()后,您可以通过将自动提交设置为falseconnection.setAutoCommit(false)来接管此控件。

但是,在不同的请求(线程)之间共享连接本身就是一个糟糕的设计。你的应用程序是这种方式不是线程安全的。您不想在不同线程之间共享相同的连接。如果你只想要消除连接数据库的成本,那么你应该考虑使用连接池。

0

访问数据库时的第一条规则。 每一个非事务性操作中应:

1.open连接,如果有连接池,然后从池中获取 2.连接创建执行语句 3.如果在读取查询然后映射结果集。 4.关闭结果集。 5.关闭声明。 6.关闭连接。

,如果你想你的操作是在交易,那么你应该考虑这种方法:

操作1:1。 getSharedConnection 2.创建/执行语句 3.如果在读取查询然后映射结果集。 4.关闭ResultSet 5. close语句

操作2: 同操作1.

和该事务:

公共无效updateInTransaction(){ 连接康恩= pool.getConnection() ; //或者你可以创建一个新的连接 conn.setAutocommit(false); operation1(conn); operation2(conn); conn.close; }

这只是小应用程序的基础知识。 如果你正在开发更大的应用程序,你应该使用来自Springsoruce的相同框架,如JDBCTemplates。