#java #mysql #multithreading #mysql-connector
#java #mysql #многопоточность #mysql-connector
Вопрос:
Итак, я создаю серверное приложение на Java, и я хочу, чтобы запросы к базе данных управлялись событиями, чтобы они не блокировались.
Способ, которым я это делаю, заключается в создании соединения с MySQL в другом потоке, пока у меня есть это:
package makeza.server.persistence;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.logging.Logger;
import makeza.server.WorldServer;
public final class MySQLNonblock extends Thread {
public Connection connection = null;
private Logger log = WorldServer.log;
private String host, port, user, pass, database;
@Override
public void run(){
init();
}
public MySQLNonblock(String hst, String prt, String usr, String pas, String dbase){
this.setDaemon(true);
this.setName("DatabaseThread");
this.host = hst;
this.port = prt;
this.user = usr;
this.pass = pas;
this.database = dbase;
}
public void init(){
log.info("Connecting to database...");
try {
connection = DriverManager.getConnection("jdbc:mysql://" host ":" port "/"
database "?" "user=" user "amp;password=" pass);
log.info("Connected to database");
} catch (SQLException e) {
log.severe("Couldn't connect to database at " host ":" port);
System.out.println("SQLException: " e.getMessage());
System.out.println("SQLState: " e.getSQLState());
System.out.println("VendorError: " e.getErrorCode());
System.exit(1);
//e.printStackTrace();
}
}
}
Я запускаю поток в другом классе, и он подключается к серверу mysql, а затем поток завершается.
Как мне сделать так, чтобы поток сохранялся после завершения метода запуска, чтобы я мог использовать соединение с mysql?
Комментарии:
1. Вы хотите перекачать сообщение в этот поток?
Ответ №1:
Вы хотите использовать пул соединений.
«Закрытие» соединения в этом отношении означает «возврат соединения в пул для повторного использования».
Комментарии:
1. Это правильный ответ, учитывая, что это должна быть «логика бизнеса / приложения», которая управляет активностью. Вот где должна быть основная направленность разработки приложений, подключение к БД должно быть в значительной степени пассивным и подчиненным и исходить из ConnectionPool.
Ответ №2:
Вам нужно подождать, пока какой-нибудь другой поток не разбудит его, уведомив об этом. Прочитайте учебник о параллелизме: http://download.oracle.com/javase/tutorial/essential/concurrency /
Вам, вероятно, следует использовать более высокоуровневую абстракцию, например ExecutorService
.
Комментарии:
1. Пример кода? Просто короткий?
2. Смотрите download.oracle.com/javase/tutorial/essential/concurrency /… и download.oracle.com/javase/tutorial/essential/concurrency /. … Но если вы серьезно относитесь к многопоточности, вам лучше узнать, как все это работает в деталях, а не просто копировать и вставлять некоторые примеры кода.
3. Неправильный дизайн! Лучше использовать многопоточный процессор запросов / фактическую активность. Затем это может захватывать / и возвращать соединения в пул пассивных соединений. (Пулы соединений — это стандартная вещь, вам не нужно писать ее самостоятельно.)