小标
2019-01-23
来源 :
阅读 1036
评论 0
摘要:本文主要向大家介绍了【云计算】使用代理对象实现数据库的连接池,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。
本文主要向大家介绍了【云计算】使用代理对象实现数据库的连接池,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。
package datasource;
import java.sql.Connection;
import java.sql.SQLException;
public class TestDataSourceMain {
public static void main(String[] args) throws Exception {
//从连接池中获取链接 使用完后 释放链接
MyDataSourcePool pool = new MyDataSourcePool();
for(int i=0;i<11;i++){
Connection conn = pool.getConnection();//得到的链接是真正的数据库链接
System.out.println("第"+i+"个链接,是"+ conn);
conn.close(); //把数据库的链接还给了数据库,而不是连接池
}
}
}
package datasource;
import java.io.PrintWriter;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.util.LinkedList;
import java.util.logging.Logger;
import javax.sql.DataSource;
public class MyDataSourcePool implements DataSource {
//初始化连接池,放入10个链接
private static String driver = "com.mysql.jdbc.Driver";
private static String url = "jdbc:mysql://192.168.157.111:3306/hive";
private static String user = "hiveowner";
private static String password = "Welcome_1";
//定义一个链表来保存10个链接
private static LinkedList dataSource = new LinkedList<>();
static{
try{
//注册驱动
Class.forName(driver);
for(int i=0;i<10;i++){
dataSource.add(DriverManager.getConnection(url, user, password));
}
}catch(Exception ex){
ex.printStackTrace();
}
}
@Override
public Connection getConnection() throws SQLException {
// // 从连接池中返回一个连接
// if(dataSource.size() > 0){
// //有一个连接,直接返回该链接
// return dataSource.removeFirst();
// }else{
// throw new SQLException("系统忙,请稍后.....");
// }
if(dataSource.size() >0){
//得到一个连接,是真正的对象
Connection conn = dataSource.removeFirst();
//生成代理对象
Connection proxy = (Connection) Proxy.newProxyInstance(MyDataSourcePool.class.getClassLoader(),
conn.getClass().getInterfaces(),
new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 重写close的逻辑
if(method.getName().equals("close")){
//将链接还给连接池
dataSource.add(conn);
System.out.println("链接已经还池.....");
return null;
}else{
return method.invoke(conn, args);
}
}
});
//返回代理对象
return proxy;
}else{
throw new SQLException("系统忙,请稍后.....");
}
}
@Override
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public void setLogWriter(PrintWriter out) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public void setLoginTimeout(int seconds) throws SQLException {
// TODO Auto-generated method stub
}
@Override
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
@Override
public Logger getParentLogger() throws SQLFeatureNotSupportedException {
// TODO Auto-generated method stub
return null;
}
@Override
public T unwrap(Class iface) throws SQLException {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isWrapperFor(Class iface) throws SQLException {
// TODO Auto-generated method stub
return false;
}
@Override
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
return null;
}
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号