JDBC事务开始

时间:2011-07-02 06:14:31

标签: java jdbc

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

3 个答案:

答案 0 :(得分:2)

@BalusC--这真的不对。默认情况下,autocommit设置为true,这意味着事务在任何JDBC操作之前开始,并在单个操作之后完成 - 而不是在连接关闭时。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

访问数据库时的第一条规则。 每个非交易操作都应该:

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

如果您希望您的操作处于交易状态,那么您应该考虑这种方法:

操作1: 1. getSharedConnection 2.创建/执行语句 3.如果是读取查询,则映射结果集。 4.结果结果 5.密切陈述

操作2: 与操作1相同。

和交易:

public void updateInTransaction(){ Connection conn = pool.getConnection(); //或者您可以创建新连接 conn.setAutocommit(假); operation1(conn);在 操作2(conn);在 conn.close; }

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