3

关于 servlet 默认是多线程的,每个 servlet 是实例化数据库连接还是该 servlet 的所有线程之间共享连接?

我使用 JDBC 作为我的 servlet 和 Oracle 数据库之间的接口。

如果一个数据库连接在所有线程之间共享,这是否意味着我应该对数据库使用连接池?

/** Open the connection here **/
public void init() {
    String url = "server";
    String username = "pwd";
    String password = "usr";
    try {
        Class.forName("oracle.jdbc.OracleDriver");
        conn = DriverManager.getConnection(url, username, password);
    } catch (Exception e) {
        System.err.println("Error making pool: " + e);
        conn = null;
    }
}
4

2 回答 2

4

如果一个数据库连接在所有线程之间共享,这是否意味着我应该对数据库使用连接池?

当然是!JDBC 连接和单线程而不是线程安全的。只需在两者之间引入连接池,首先获取连接并在同一请求期间尽快关闭它。

于 2012-11-05T15:02:43.137 回答
1

根据您编写连接的方式,它可以是每个 servlet(实例变量)或全局(静态变量 - 前提是您不在集群环境中并且您管理并发,这将是一个严重的瓶颈)

但是,如果您想让您的系统高效、可靠、可扩展、更易于维护,并且不必实现更高级的功能,例如在链接失败的情况下重新连接(考虑到您的后端是 Oracle,我认为是这种情况),您应该查看您的应用程序服务器连接池机制。

于 2012-11-05T15:00:46.583 回答