Въпроса ми е следния. Искам да една конекция към базата данни да правя множество операции (няколко SELECT-a например).
Servlet за връзка с базата данни:
Код:
package myClass;
import java.io.*;
import java.util.*;
import java.sql.*;
public class sqlBean {
private static String DBUrl = "jdbc:mysql://localhost:3306/DB?user=root&password=root&characterEncoding=cp1251";
private Connection conn = null;
public Statement connect()
throws SQLException, Exception {
Class.forName("com.mysql.jdbc.Driver").newInstance();
conn = DriverManager.getConnection(DBUrl);
Statement stmt = conn.createStatement();
return stmt;
}
public void disconnect(Statement stmt) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException sqlEx) {
// ignore
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException sqlEx) {
// ignore
}
conn = null;
}
}
}
Servlet за операции с базата:
Код:
package myClass;
import java.io.*;
import java.sql.*;
import java.util.*;
public class usersBean {
private sqlBean mydb = new sqlBean();
public String getUserNameFromId(String nameId) {
String tmp = "$";
try {
Statement stmt = mydb.connect();
ResultSet rs = stmt.executeQuery("select USERREALNAME from users where ID='"+nameId+"'");
rs.next();
tmp = rs.getString("USERREALNAME");
rs.close();
mydb.disconnect(stmt);
} catch (Exception ex) {
// error
}
return tmp;
}
public boolean getNivoForModule(String accessModul, int accessNivo) {
boolean tmp = false;
try {
Statement stmt = mydb.connect();
ResultSet rs = stmt.executeQuery("select "+accessModul+" from accesslevel where NIVO='"+accessNivo+"'");
rs.next();
if ((rs.getInt(accessModul))==1) {
tmp = true;
}
rs.close();
mydb.disconnect(stmt);
} catch (Exception ex) {
// error
}
return tmp;
}
}
Както се вижда от втория сорс код, всеки пък когато правя заявка към базата данни викам connect от първия сорс т.е. наново се прави конекцията към базата. Ако извикам обеката getUserNameFromId и обекта getNivoForModule от една уеб страница и те ми върнат резултат, ще имам 2 конекции към базата, т.е. 2 заети сокета на сървъра. А ако ги извикам 200 пъти ще имам 200 заети сокета. Така в един момент при много наторено приложение заявките към MySQL-a връщат exception по простата причина че съм заел всички сокети на операционната система.
Та въпроса ми във втория сорс, как мога да направя така че да отварям базата данни в началото на файла и да я затваря в края? Т.е. ако имам заявки и към 2-та обекта, да ми се води че имам една конекция към базата с данни.
Това е много малка част от приложението. За момента съм закрепил положението като увеличих горната граница на ephemeral ports и socket connection timeout съм го смъкнал от 240 секунди на 30. Но този начин не е за препочитане защото консумира прекалено много системна памет.