2016-09-08 5 views
0

Javaでモジュール化したプロジェクトを5層構築します。
1番目の層 - ビーン(クラス)
2番目の層 - DaoDB(クラス)
3-RD層 - ダオ(インターフェイス) - それは(ファサードからDaoDBに)明るいだ
4層目 - ファサード(クラス) - ビジネスロジック と
5番目の層 - JAX-RSおよびJSON

と動的Webプロジェクト私は5番目の層の私のログイン方法に問題があります。Java EE/RESTful - JAX-RSとJSONがClass.forName(... ClientDriver)のSQLExceptionをスローする

@Path("/web-project") 
@Consumes(MediaType.APPLICATION_JSON) 
@Produces(MediaType.APPLICATION_JSON) 
public class AdminService{ 

private Company companyBean; 

private AdminFacade getAdminFacade(HttpServletRequest req) { 
    AdminFacade facade = ((AdminFacade) req.getSession().getAttribute("adminFacade")); 
    return facade; 
} 

@Path("/login") 
@POST 
public Message adminLogin(LogInBean lgb, @Context HttpServletRequest req) throws UserSystemException, ClassNotFoundException { 

    // Class.forName("org.apache.derby.jdbc.ClientDriver"); 

    CouponClientFacade facade=CouponSystem.getInstance().login(lgb.getLogin(), lgb.getPassword(), "Admin"); 

    HttpSession session = req.getSession(true); 
    session.setAttribute("adminFacade", facade); 
    return new Message("logged in successfully as admin"); 
} 
..... 
..... 

データベースの問題 - ClientDriver。新しい会社を追加しようとするとSQLExceptionが発生します。私はClass.forName("org.apache.derby.jdbc.ClientDriver");を使用していない場合は、私は他の人(CRUD)メソッドを実行しようとすると - 例えば

@Path("/createnewcompany") 
@POST 
public Message addCompany(Company cb, @Context HttpServletRequest req) throws UserSystemException { 
    getAdminFacade(req).createCompany(cb); 
    return new Message("created a new company: " + cb.getCompName()); 
} 

私はファサード層に移動し、すべてのCRUDを実行しようとした場合、私は、例外を取得けど方法彼らはうまく動作します。

JAX-RSが最初の層で書かれたクライアントドライバで動作しないのはなぜですか?

JAX-RSとJSONは、クライアントログインメソッドでドライバの実装を明示的に記述すると問題なく動作します。Class.forName("org.apache.derby.jdbc.ClientDriver");のみです。

ありがとうございました。

答えて

0

あなたのファサードはシングルトンでステートフルなので、Web層はステートレスでリクエストスコープです。

すべてのリクエスト内で、それは新しいスレッドであり、ドライバがスレッドにバインドされている可能性があります。

、スレッドと接続を関連付けるtrueにスレッド属性でアソシエイトを設定するスレッド

との接続の関連付け: これは、Oracleの場合です。デフォルトはfalseです。真の設定では、呼び出しをスレッドのスレッドにThreadLocalとして保存することができます。接続は、呼び出し元のスレッドが終了したとき、または呼び出し元のスレッドが使用されておらず、プールの接続が不足しているときにのみ再利用されます。設定がfalseの場合、スレッドは接続が必要なたびにプールから接続を取得する必要があります。

階層構造のアーキテクチャでは、WebTierはデータベースとは何もしないでください。 (実際のビジネスロジックは、データベース操作を行うためにデータベースレイヤーを呼び出す必要があります)

+0

はい、それは事実です。 – morris

+0

私は// Class.forName( "org.apache.derby.jdbc.ClientDriver")からコメントを削除します。 システムはうまく動作します。私は良い方法は私のWebモジュールでClientDriverと一緒に使ってはいけないと思います。私がコメントしたら、例外があります。 – morris

関連する問題