EmployeeDAOImpl.java と DepartmentDAOImpl.java があります。今、私はデータ サービス層からこの 2 つを呼び出しています。EmployeeDAO と DepartmentDAO はインターフェイスであり、abtract CRUD メソッドしかありません。サービスレイヤーには、メソッド内に createEmployee(Employee employee) と createDepartment(Department department) という 2 つのメソッド呼び出しがあります。これらの 2 つの呼び出しは同じトランザクション内にある必要があります。つまり、2 つの呼び出しが成功した後にのみ接続を閉じることはできません。さて、あなたは接続を提供する方法を知っていますか。DepartmentDAOImpl と EmployeeDAOImpl のコンストラクターで接続を提供したくありません。また、Spring AOP や ThreadLocale を使用したくありません。それを行うための解決策はありますか?
3 に答える
DAOコンストラクターへの接続を提供したくない、またはSpring AOPまたはThreadLocaleを使用したくない理由を説明していません。
接続の取得は、サービス層の責任であるトランザクション管理の一部であると言えます。データベースに接続するために必要なものをDAOに提供する必要があります。
あなたはそれをしないと言いましたが、どのようにするかについてのアイデアは提供しませんでした.
サービスはプールから接続を取得し、それを DAO に渡し、トランザクションを管理し、ユース ケースが完了したら接続をプールに返す必要があると思います。
あなたはSpringを使いたくないので、実装の詳細はあなたに任せます。ストレート JDBC を使用してそれを行うことは可能です。あなたはそれをするためにもっと一生懸命働かなければならないでしょう。
Spring または AOP を使用しないと主張する場合、サービス コードは次のようになります。
package service;
public class FooServiceImpl implements FooService {
public void saveFoo(Foo f) {
Connection connection = null;
Statement st = null;
try {
connection = ConnectionPool.checkout();
connection.setAutoCommit(false);
// do something here
connection.commit();
} catch (Exception e) {
rollback(connection);
e.printStackTrace();
} finally {
close(st);
close(connection);
}
}
}
ここでは、Spring と AOP が役立ちます。定型コードを削除します。それはあなたの選択です。
Spring AOP や ThreadLocale を使いたくない
残念ながら (?) これが、Spring がトランザクションと接続を処理する方法です。(要するに)@Transactional
非トランザクション コンテキストからメソッドに入ると、そのトランザクションを担当するデータベース接続が .xml に配置されThreadLocal
ます。このようにして、そのトランザクション内のすべてのメソッドが同じ接続を使用するため、同じトランザクションになります。これは完全に透過的です。DataSource
抽象化またはJdbcTemplate
(この複雑さをエレガントに隠します) を使用するだけです。
マルチスレッド環境では、接続をコンストラクターのパラメーターとして渡すことは完全に壊れていることに注意してください。DataSource
代わりにパスする必要があります。Spring (または EJB) は、低レベルのものを処理します。
少し良いConnection
方法は、すべての DAO のすべてのメソッドに渡すことです。しかし、これはすごーく 1990 年代の話です... Spring のアプローチで気に入らない点を詳しく説明していただけますか?