디자인 모드 의 프 록 시 모드 (자신의 데이터베이스 연결 풀 실현)
15310 단어 디자인 모드AOP데이터베이스 연결 풀에이전트 모드
public class SimpleConnectionPool {
private static List<Connection> listConnection = new ArrayList<Connection>();
// 10
static {
for (int i = 0; i < 10; i++) {
Connection e = MyJdbcUtil.getConnection();
listConnection.add(e);
}
}
//
public static synchronized Connection getConnection(){
if(listConnection.size()>0){
Connection con = listConnection.get(0);
listConnection.remove(0);
return con;
}else{
throw new RuntimeException(" ");
}
}
//
public static synchronized void closeConnection(Connection connection){
listConnection.add(connection);
}
public static List<Connection> getListConnection() {
return listConnection;
}
}
테스트:
@Test
public void test() {
System.out.println(SimpleConnectionPool.getListConnection().size());
//10
Connection connection= SimpleConnectionPool.getConnection();//
System.out.println(SimpleConnectionPool.getListConnection().size());//9
SimpleConnectionPool.closeConnection(connection);//
System.out.println(SimpleConnectionPool.getListConnection().size());
//10
}
현재 우 리 는 표준 데이터 원본 을 만 들 었 습 니 다. 1. SUN 회 사 는 표준 을 정 의 했 습 니 다. 자바. sql. dataSource 는 이 인 터 페 이 스 를 실현 하 는 것 이 표준 데이터베이스 연결 풀 입 니 다. 이 DataSource 를 실현 한 후에 연 결 된 getConnection () 만 가 져 오 면 우리 가 보 여 준 반환 연결 이 없습니다. 그래서 우 리 는 connection. close () 만 사용 합 니 다.연결 을 풀 수 있 는 방법 이지 만 기본적으로 연결 을 닫 을 수 밖 에 없습니다.풀 에 돌려 줄 수 없습니다. 여기 서 필요 한 것 이 있 습 니 다. 1. 이미 알 고 있 는 유형의 특정한 방법 이나 특정한 방법 (기 존의 코드 를 수정 할 수 없고 확장 해 야 합 니 다) 을 변경 하 는 몇 가지 해결 방안 이 있 습 니 다. a: 계승: 여 기 는 안 됩 니 다. b: 포장 디자인 모델 (장식 디자인 모델) 또는 어댑터 모델 c: 동적 대 리 를 이용 합 니 다.
우 리 는 먼저 장식 자 모드 를 사용한다.
:
a、 (com.mysql.jdbc.Connection)
b、 ,
c、 ,
d、 ,
e、 ,
코드 예제:
//a、 (com.mysql.jdbc.Connection)
public class MyConnection implements Connection {
// b、 ,
private Connection connection;
private List<Connection> list;
// c、 ,
public MyConnection(Connection connection, List<Connection> list) {
super();
this.connection = connection;
this.list = list;
}
//d、 ,
@Override
public void close() throws SQLException {
list.add(connection);
}
//e、 ,
@Override
public <T> T unwrap(Class<T> iface) throws SQLException {
// TODO Auto-generated method stub
return connection.unwrap(iface);
}
@Override
public boolean isWrapperFor(Class<?> iface) throws SQLException {
// TODO Auto-generated method stub
return connection.isWrapperFor(iface);
}
....
}
지금 우 리 는 우리 의 연결 탱크 를 보 러 왔 다.
public class MyDataSource implements DataSource{
// 10
private static List<Connection> listConnection =Collections.synchronizedList(new ArrayList<Connection>());
static {
for (int i = 0; i < 10; i++) {
Connection e = MyJdbcUtil.getConnection();
listConnection.add(e);
}
}
@Override
public Connection getConnection() throws SQLException {
if(listConnection.size()>0){
Connection con = listConnection.get(0);
listConnection.remove(0);
//
MyConnection myConnection = new MyConnection(con, listConnection);
return myConnection;
}else{
throw new RuntimeException(" ");
}
}
현재 어댑터 모드 를 사용 합 니 다:
1) 먼저 Connection 의 어댑터 를 쓰 십시오. 어댑터 의 구결 은 포장 류 / a 입 니 다. 포장 류 (com. my sql. jdbc. Connection) 와 같은 인터페이스 / / b 를 만 들 고 변 수 를 정의 합 니 다. 포장 류 의 인 스 턴 스 / c, 정의 구조 방법 을 참조 하여 포장 류 인 스 턴 스 의 인용 / d, 모든 방법 을 입력 합 니 다.기 존 대상 의 대응 방법 을 호출 하 다.
//a、 (com.mysql.jdbc.Connection)
public class MyConnectionAdapet implements Connection{
//b、 ,
private Connection connection;
//c、 ,
public MyConnectionAdapet(Connection connection) {
this.connection=connection;
}
//d、 ,
@Override
public void close() throws SQLException {
connection.close();
}
이제 어댑터 를 통 해 close () 방법 구결 을 수정 합 니 다.피 포장 류 의 인 스 턴 스 / c, 정의 구조 방법 을 참조 하여 피 포장 류 인 스 턴 스 의 인용 / d, 변경 할 방법 에 대해 덮어 쓰 면 됩 니 다.
//a、 (com.mysql.jdbc.Connection) ( )
public class MyConnection2 extends MyConnectionAdapet{
//b、 ,
private Connection connection;
private List<Connection> liConnections;
//c、 ,
public MyConnection2(Connection connection, List listConnection) {
// TODO Auto-generated constructor stub
super(connection);
this.connection=connection;
this.liConnections=listConnection;
}
//d、 ,
@Override
public void close() throws SQLException {
// TODO Auto-generated method stub
liConnections.add(connection);
}
}
위 와 같이 데이터 원본 에서 Connection 에서 close 를 바 꾸 는 방법 을 실현 합 니 다.우리 가 사용 하 는 것 은 모두 정적 프 록 시 입 니 다. 현재 우 리 는 동적 프 록 시 를 사용 합 니 다. 인터페이스 기반 동적 프 록 시 라 고도 할 수 있 습 니 다. 인터페이스 가 없 기 때문에 프 록 시 를 실현 할 수 없습니다. 동적 프 록 시 는 표시 되 지 않 는 프 록 시 클래스 입 니 다.
// :
public class MyDataSource implements DataSource {
private static List<Connection> listConnection = Collections.synchronizedList(new ArrayList<Connection>());
// 10
static {
for (int i = 0; i < 10; i++) {
Connection e = MyJdbcUtil.getConnection();
listConnection.add(e);
}
}
@Override
public Connection getConnection() throws SQLException {
if (listConnection.size() > 0) {
final Connection con = listConnection.get(0);
listConnection.remove(0);
// Connection
//Proxy newProxyInstance 。
// :
// 1. , :
// 2. , : ( )
// 3. , , ,
return (Connection) Proxy.newProxyInstance(con.getClass().getClassLoader(), con.getClass().getInterfaces(),
new InvocationHandler() {
//
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//
// ,
// 1.
// 2.
// 3.
if ("close".equals(method.getName())) {
return listConnection.add(con);
}
return method.invoke(con, args);
}
});
} else {
throw new RuntimeException(" ");
}
}
public static List<Connection> getListConnection() {
return listConnection;
}
..
}
위 와 같이 디자인 모델 의 대리 모델 의 응용 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.