2

次の JDBC/MySQL の Connector/J リファレンスでは、InitialContext と Datasource のインスタンスをキャッシュすることを提案しています。プライベートな静的インスタンスにするだけでキャッシングは解決しますか? スレッドセーフを気にする必要はありませんか (もしあれば)。これを Web アプリ (Restlet + glassfish/Java EE + mysql) にキャッシュするのに最適な「場所」は??

いわば、データ アクセス クラスのルートである GenericDAO クラスがあります。では、静的インスタンスを持つだけで実際に問題が解決するのでしょうか? 一部のメソッドを強制的に静的にする必要がありますが、これは望ましくありません。提案??

ありがとう!

public void doSomething() throws Exception {
/*
* Create a JNDI Initial context to be able to
* lookup the DataSource
**
In production-level code, this should be cached as
* an instance or static variable, as it can
* be quite expensive to create a JNDI context.
**
Note: This code only works when you are using servlets
* or EJBs in a Java EE application server. If you are
* using connection pooling in standalone Java code, you
* will have to create/configure datasources using whatever
* mechanisms your particular connection pooling library
* provides.
*/
InitialContext ctx = new InitialContext();
/*
* Lookup the DataSource, which will be backed by a pool
* that the application server provides. DataSource instances
* are also a good candidate for caching as an instance
* variable, as JNDI lookups can be expensive as well.
*/
DataSource ds =
(DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");

/*
*Remaining code here...
*/
    }
4

2 に答える 2

4

JAX-RS を使用している場合は、@Contextアノテーションを使用できます。

例えば

@Context
private ServletContext context;

@GET
@Path("whatevers")
public List<Whatever> getWhatevers() {
    DataSource dataSource = Config.getInstance(context).getDataSource();
    // ...
}

ただし、@Resource注釈が Restlet 環境でもサポートされている場合は、それをうまく利用できます。

@Resource(mappedName="jdbc/MySQLDB")
private DataSource dataSource

これは技術的には、Web サービスで注入する EJB に配置する方が適切@EJBです。

@Stateless
public class WhateverDAO {

    @Resource(mappedName="jdbc/MySQLDB")
    private DataSource dataSource

    public List<Whatever> list() {
        // ...
    }

}

@EJB
private WhateverDAO whateverDAO;

@GET
@Path("whatevers")
public List<Whatever> getWhatevers() {
    return whateverDAO.list();
}
于 2011-03-31T20:25:15.327 に答える
2

BalusC のリンクをフォローアップすると、Restlet を使用したときに同じことができることが確認できます。ただし、のコードに従って、構成インスタンスを取得し、引数として ServletContext に渡します。Restlet は、サーブレットをアダプターとして使用して構成する「別の」フレームワークのようなものです。そのため、コード内の別の場所から ServletContext を引数として渡すのは難しいでしょう (Restlet は、概念的に ServletContext に似た独自のContextオブジェクトを使用します)。

私の場合、キャッシュされたデータソースを返す静的メソッドは「十分にきれい」に見えますが、他の設計/組織アプローチがある可能性があります。

于 2011-03-31T19:57:28.973 に答える