2011-11-03 110 views
1

所以我在java中制作一个服务器应用程序,并且我希望数据库请求是事件驱动的,因此它是非阻塞的。非阻塞多线程MySQL与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连接?

+0

你想在该线程上的消息泵? – SLaks

回答

2

您想使用connection pooling

“关闭”这方面的连接意味着“给连接回池以供重用”。

+0

这是正确的答案,因为它应该是驱动活动的“业务/应用程序逻辑”。这就是应用程序设计的线程和主要关注点,数据库连接应主要是被动和从属的,并且来自ConnectionPool。 –

0

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

尽管您应该使用更高级别的抽象,如ExecutorService

+0

代码示例?只是一个短的? –

+1

请参阅http://download.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html和http://download.oracle.com/javase/tutorial/essential/concurrency/exinter.html。但是,如果你对多线程认真,你最好学习所有这些工作的细节,而不是简单地复制粘贴一些代码示例。 –

+0

错误的设计!更好地多线程请求处理器/实际活动。然后,它可以抓取/并将连接返回到主动被动连接池。 (连接池是标准的东西,你不需要自己写一个。) –