Неблокирующий многопоточный MySQL с Java

#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. Неправильный дизайн! Лучше использовать многопоточный процессор запросов / фактическую активность. Затем это может захватывать / и возвращать соединения в пул пассивных соединений. (Пулы соединений — это стандартная вещь, вам не нужно писать ее самостоятельно.)