Неблокируемый многопоточный MySQL с Java - PullRequest
1 голос
/ 03 ноября 2011

Итак, я делаю серверное приложение на 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 + "&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, а затем поток завершается.

Как сделать так, чтобы поток сохранялся один раз, а затем завершить метод run, чтобы я мог использовать соединение mysql?

Ответы [ 2 ]

2 голосов
/ 29 июля 2013

Вы хотите использовать пул соединений .

В этом отношении «закрытие» соединения означает «возвращение соединения в пул для повторного использования».

0 голосов
/ 03 ноября 2011

Вам нужно подождать, пока какой-нибудь другой поток не разбудит его, уведомив об этом.Прочтите руководство по параллелизму: http://download.oracle.com/javase/tutorial/essential/concurrency/

Возможно, вам следует использовать более высокоуровневую абстракцию, например, ExecutorService.

...