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