2011-11-03 2 views
1

그래서 자바로 서버 애플리케이션을 만들고 있는데, 데이터베이스 요청이 이벤트 구동되도록 비 블로킹 (non-blocking)으로하고 싶습니다.Java로 비 블로킹 다중 쓰레드 MySQL

지금까지 나는이있어 나는이 다른 스레드에서 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

액티비티를 이끌어내는 "비즈니스/애플리케이션 로직"이어야한다는 점을 고려하면 정답입니다. 이것이 애플리케이션 디자인의 스레딩 및 주요 초점이되어야하는 곳이며, DB 연결은 대부분 수동적이고 종속적이어야하며 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

틀린 디자인! 요청 프로세서/실제 작업을 멀티 스레드하는 것이 더 좋습니다. 이렇게하면 대부분 수동 연결 풀을 가져 와서 연결을 반환 할 수 있습니다. 커넥션 풀은 표준적인 것으로, 직접 작성하지 않아도됩니다. –