3

前例として、私はオンライン チュートリアルを通じて Java を学習したので、私の質問にあまり厳しくしないでください。

簡単な Web サービスを作成する必要があるため、調査を開始し、Jersey ライブラリを見つけて、しばらくの間、問題を解決してくれました。主な問題は、データベースにアクセスするたびに接続を開く必要があったため、接続プーリングについて調べました。

@Path ("login")
@Singleton
public class LoginWS{

private DataSource dataSource;
private Connection connection;
private Statement statement;

public LoginWS (){
    try {
        Context initContext  = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        dataSource = (DataSource)envContext.lookup("jdbc/testdb");
    } catch (NamingException e) {
        e.printStackTrace();
    }       
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public String authUser(@HeaderParam(value = "data") String data) {
    Gson parser = new Gson();
    LoginInput user = parser.fromJson(data, LoginInput.class);
    LoginOutput response = new LoginOutput();

    try {
        connection = dataSource.getConnection();
        statement = connection.createStatement();

        // Here I do the DB queries, and logic

    } catch (SQLException e) {
        e.printStackTrace();
    }finally {
        try { if(null!=resultSet)resultSet.close();} catch (SQLException e) 
        {e.printStackTrace();}
        try { if(null!=statement)statement.close();} catch (SQLException e) 
        {e.printStackTrace();}
        try { if(null!=connection)connection.close();} catch (SQLException e) 
        {e.printStackTrace();}
    }
    return parser.toJson(response);
}
}

ご覧のとおり、作成する必要がある他のすべてのクラスで新しい接続プールを使用する必要がありますが、これが良い方法かどうかはわかりません。だから私は次のようなものを構築したい:

public Connection getDBConnection() {
    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
}

したがって、接続プーリングへの接続を要求するため、すべての Web サービスが同じプーリングを使用します。JSONオブジェクトで接続を返す別のWebサービスを試しましたが、このWSがどこにあるかを知っている人なら誰でも私のDBにアクセスできると思います...控えめに言っても望ましくありません。

次に、HttpServlet というオブジェクトについて読み、次のようなものを作成しました。

public class TestServlet extends HttpServlet {

private static final long serialVersionUID = 1L; // No idea about this. Eclipse's suggestion
private DataSource dataSource;

public void init() throws ServletException {
    try {
        Context initContext  = new InitialContext();
        Context envContext  = (Context)initContext.lookup("java:/comp/env");
        dataSource = (DataSource)envContext.lookup("jdbc/testdb"); 
        System.out.println("Connection Pool: set");                 
    } catch (NamingException e) {
        e.printStackTrace();
    }
}

public Connection getDBConnection() {
    try {
        return dataSource.getConnection();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return null;
    }
}

Web サービス内からこのインスタンスを呼び出す方法がわかりません。

正直なところ、何を探すべきかについてのアイデアがなくなりました。

これを読んでくれてありがとう。

4

1 に答える 1

1

現在 Tomcat を使用している場合は、開発を Glassfish または別の Java Enterprise Edition Server に移行することをお勧めします。Tomcat はサーブレット/JSP エンジンにすぎませんが、Glassfish は完全な Java EE スイートであり、サーブレット/JSP と Jersey だけでなく、探している接続プーリングも含まれています。

Glassfish で接続プールを設定するのがいかに簡単かを示す多くのチュートリアルの 1 つを次に示します。

http://netbeans.dzone.com/connection-pooling-glassfish-nb

于 2013-05-13T14:23:01.013 に答える