对于默认情况下多线程的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;
}
}
答案 0 :(得分:4)
如果所有线程之间共享数据库连接,这是否意味着我应该使用连接池到数据库?
是的,绝对是! JDBC连接和单线程而不是线程安全的。只需在两者之间引入连接池,首先获取连接并在同一请求期间尽快关闭它。
答案 1 :(得分:1)
根据您编写Connection的方式,它可以是per-servlet(实例变量)或全局(静态变量 - 假设您不在集群环境中,并且您管理并发,这将是一个严重的瓶颈)
但是,如果你想让你的系统高效,可靠,可扩展,更容易维护,而不必实现更高级的功能,例如在链路出现故障时重新连接(我认为考虑到你的后端是Oracle的情况)你应该研究你的应用服务器连接池机制。