使用Java非阻塞多线程MySQL

时间:2011-11-03 16:19:13

标签: java mysql multithreading 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 + "&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连接?

2 个答案:

答案 0 :(得分:2)

您想使用connection pooling

在这方面“关闭”连接意味着“将连接返回池以供重用”。

答案 1 :(得分:0)

你需要等到其他线程通过通知它才能唤醒它。 阅读有关并发性的教程:http://download.oracle.com/javase/tutorial/essential/concurrency/

您可能应该使用更高级别的抽象,例如ExecutorService