Я пишу сервлет, который обрабатывает каждый запрос, обращаясь и изменяя некоторые таблицы (таблицы) в базе данных. Я хочу, чтобы соединения с базой данных были потокобезопасными. Я не хочу использовать уже существующие библиотеки/рамки для этого (весна, спящий режим и т. Д.).Java-соединения, связанные с безопасностью базы данных
Я знаю, что могу использовать ThreadLocal Java для этого следующим образом:
public class DatabaseRegistry { //assume it's a singleton
private Properties prop = new Properties();
public static final ThreadLocal<Connection> threadConnection = new ThreadLocal<Connection>();
private Connection connect() throws SQLException {
try {
// This will load the MySQL driver, each DB has its own driver
Class.forName("com.mysql.jdbc.Driver");
// Setup the connection with the DB
Connection connection = DriverManager
.getConnection("jdbc:mysql://" + prop.getProperty("hostname") + "/" + prop.getProperty("database") + "?"
+ "user=" + prop.getProperty("username") + "&password=" + prop.getProperty("password"));
return connection;
} catch (SQLException e) {
throw e;
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
public Connection getConnection() throws SQLException {
if(threadConnection.get() == null) {
Connection connection = connect();
threadConnection.set(connection);
return threadConnection.get();
} else
return threadConnection.get();
}
private void freeConnection(Connection connection) throws SQLException {
connection.close();
threadConnection.remove();
}
}
Каждый раз, когда вы звоните GetConnection, новое соединение добавляется в ThreadLocal объект, а затем удаляется, когда вы освобождаете соединение() ,
Правильно ли это делается или должен ли DatabaseRegistry распространять класс ThreadLocal? Или есть еще лучший способ сделать это, чтобы все потоки соединений были безопасными?
Благодаря
http://stackoverflow.com/questions/1209693/is-mysql-connector-jdbc-thread-safe –
Я думаю, что это не очень хорошая практика. используйте пул соединений, он будет оставаться основным размером доступных подключений. Если вы используете ThreadLocal, каждый запрос будет собственным одним подключением, если ваш веб-сервер является блоком, соединение не будет запускаться вовремя. –