gre*_*alu 5 java connection performance jdbc
我仍在处理此处提到的相同问题。似乎工作正常,尤其是在创建如下所示的AbstractModel类之后:
public abstract class AbstractModel {
protected static Connection myConnection = SingletonConnection.instance().establishConnection();
protected static Statement stmt;
protected static ResultSet rs;
protected boolean loginCheck; // if userId and userLoginHistoryId are valid - true, else false
protected boolean userLoggedIn; // if user is already logged in - true, else false
public AbstractModel (int userId, Long userLoginHistoryId){
createConnection(); // establish connection
loginCheck = false;
userLoggedIn = false;
if (userId == 0 && userLoginHistoryId == 0){ // special case for login
loginCheck = true; // 0, 0, false, false
userLoggedIn = false; // set loginCheck to true, userLogged in to false
} else {
userLoggedIn = true;
try{
String query = "select \"user_login_session_check\"(" + userId + ", " + userLoginHistoryId + ");";
System.out.println("query: " + query);
stmt = myConnection.createStatement();
rs = stmt.executeQuery(query);
while (rs.next()){
loginCheck = rs.getBoolean(1);
}
} catch (SQLException e){
System.out.println("SQL Exception: ");
e.printStackTrace();
}
}
}
// close connection
public void closeConnection(){
try{
myConnection.close();
} catch (SQLException e){
System.out.println("SQL Exception: ");
e.printStackTrace();
}
}
// establish connection
public void createConnection(){
myConnection = SingletonConnection.instance().establishConnection();
}
// login session check
public boolean expiredLoginCheck (){
if (loginCheck == false && userLoggedIn == true){
closeConnection();
return false;
} else {
return true;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我已经在上面前面的问题的链接中发布了存储过程和Singleton Pattern实现。
我的印象是,在每次数据事务之后,我都不需要关闭与数据库的连接,因为这只会降低应用程序的速度。我正在为这个系统构建大约30个用户,因此性能和可用性很重要。
延长至少3-4个数据事务的连接是否正确?例如。对用户输入进行某种形式的验证检查,或类似于google的自动建议...这些都是基于用户输入的独立存储函数调用。我可以使用一个连接实例,而不是在每次数据事务之后都进行连接和断开连接吗?哪个更有效?
如果我的假设是正确的(使用一个连接实例更有效),则应在控制器中处理打开和关闭连接的过程,这就是为什么我创建了createConnection()和closeConnection()方法的原因。
谢谢。
您的代码永远不应依赖于以下事实:您的应用程序当前是数据库的唯一客户端,或者您只有30个用户。因此,您应该处理数据库连接,例如文件,套接字以及可能会运行的所有其他稀有资源。
因此,您应该始终自己清理一下。无论你做什么。打开连接,执行您的任务(一个或SQL语句)并关闭连接。总是!
在您的代码中,创建连接并将其保存到静态变量中-该连接将一直持续到AbstractModel类存在(可能永远存在),这很糟糕。与所有类似的情况一样,将代码放在try / finally中以确保连接始终关闭。
由于Web应用程序未关闭连接,我已经看到应用程序服务器正在运行连接。或者因为他们在注销时关闭,并且有人说“我们永远不会拥有那么多的用户”,但是它只是稍微扩大了一点。
现在,当您运行代码并正确关闭连接时,就像zaske所说的那样,添加连接池。这将解决打开/关闭数据库连接的性能问题,这确实是昂贵的。在您不希望知道何时打开/关闭物理连接的逻辑层(您的应用程序)上,数据库层(数据库池)将为您处理它。
然后,您甚至可以为整个会话模型建立一个连接,DBCP也支持该连接-这是没有危险的,因为如果需要,您可以在以后重新配置池,而无需修改客户端代码。
你是对的,你不需要在每次调用后关闭连接。
请记住,现代数据库实现了内部连接池,但您的应用程序仍然需要连接和检索连接对象,这就是它现在所做的。
您应该考虑使用数据库连接池 - 有各种 Java 框架可以为您提供这样的解决方案,并且它们将定义(当然您可以配置)数据库连接池何时关闭。
一般来说 - 您应该问自己您的数据库是否只为您的应用程序提供服务,还是也为其他应用程序提供服务 - 如果它不为其他应用程序提供服务,您可能可以更加“贪婪”并保持连接打开更长的时间。
我还建议您的应用程序在启动时创建固定数量的连接(在您的配置中将其定义为“最小连接数”),并且如果需要,您可以让它增长到最大连接数。
正如我之前提到的 - 这些想法已经被各种框架实现,例如 - Apache 的DBCP项目。