编写连接池需实现java.sql.DataSource接口,
DataSource接口中定义了两个重载的getConnection方法:
Connection getConnection()
Connection getConnection(String username, String password)
没有close或release方法那么怎么 释放到池中呢?
所以通过动态代理实现
代码如下
public class JdbcPool implements DataSource {
private static String driver;
private static String url;
private static String username;
private static String password;
static{
try {
Properties prop = new Properties();
InputStream in = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
prop.load(in);
driver = prop.getProperty("driver");
url = prop.getProperty("url");
username = prop.getProperty("username");
password = prop.getProperty("password");
Class.forName(driver);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
private static LinkedList<Connection> pool = new LinkedList<Connection>();
private static int poolsize = 10;
//问题:每次newJdbcPoll都会建立10个链接,可使用单态设计模式解决此类问题
public JdbcPool(){
for(int i=0;i<poolsize;i++){
try {
Connection conn = DriverManager.getConnection(url,username,password);
pool.add(conn);
System.out.println(conn + "被加到池里面了!!!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* 这里使用动态代理技术返回一个假的Connection,当dao调用假connection的任何方法时,该方法体内会调用InvocationHandler.invoke方法
* 在invoke方法体内,发现dao调用的是close方法,则把链接还到池里,否则,调用真connection的对应方法。
* (non-Javadoc)
* @see javax.sql.DataSource#getConnection()
*/
public Connection getConnection() throws SQLException { //spring aop
if(pool.size()>0){
final Connection conn = pool.removeFirst();
System.out.println(conn + "从池里面取出去了!!!");
return (Connection) Proxy.newProxyInstance(JdbcPool.class.getClassLoader(),conn.getClass().getInterfaces(), new InvocationHandler(){
//proxy为代理对象 method为要调用的方法 args为方法的参数
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName().equals("close")){
pool.addFirst(conn);
System.out.println(conn + "被还到池里面了!!");
return null;
}else{
return method.invoke(conn, args);
}
}
});
}
throw new RuntimeException("对不起,池里没有资源了!!!");
}
public Connection getConnection(String arg0, String arg1)
throws SQLException {
// TODO Auto-generated method stub
return null;
}
public PrintWriter getLogWriter() throws SQLException {
// TODO Auto-generated method stub
return null;
}
public int getLoginTimeout() throws SQLException {
// TODO Auto-generated method stub
return 0;
}
public void setLogWriter(PrintWriter arg0) throws SQLException {
// TODO Auto-generated method stub
}
public void setLoginTimeout(int arg0) throws SQLException {
// TODO Auto-generated method stub
}
//public Jdbcpool
}
分享到:
相关推荐
spring+druid+AtomikosDataSource实现多数据源切换及分布式事务控制
利用aop进行动态的数据源切换
apache出品,用来取代老旧的dbcp
动态切换数据源,与博客http://blog.csdn.net/u013769320/article/details/47376343对应
NULL 博文链接:https://taink.iteye.com/blog/654632
java SpringMVC动态数据源的DataSource工具类,springmvc中配置数据源为工具类中的数据源,多线程使用不同数据源配置
该项目采用标签形式对Datasource进行注入将Datasource组件交给容器进行统一管理
主要介绍了java 自己实现DataSource实现代码的相关资料,需要的朋友可以参考下
赠送jar包:dynamic-datasource-spring-boot-starter-3.4.1.jar; 赠送原API文档:dynamic-datasource-spring-boot-starter-3.4.1-javadoc.jar; 赠送源代码:dynamic-datasource-spring-boot-starter-3.4.1-sources...
dynamic-datasource.zip
建立 BW datasource,使用user exit 增强datasource
将 client-adapter.es7x-1.1.5-jar-with-dependencies.jar 替换plugin下的jar可以解决druid报错问题,注意版本1.1.5,不是这个版本不一定能解决
Struts DataSource 数据源
赠送jar包:dynamic-datasource-spring-boot-starter-3.4.1.jar; 赠送原API文档:dynamic-datasource-spring-boot-starter-3.4.1-javadoc.jar; 赠送源代码:dynamic-datasource-spring-boot-starter-3.4.1-sources...
SpringBoot+dynamic-datasource实现多数据源(msyql、sqlserver)手动切换示例代码 https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/135701561
赠送jar包:sentinel-datasource-extension-1.8.0.jar; 赠送原API文档:sentinel-datasource-extension-1.8.0-javadoc.jar; 赠送源代码:sentinel-datasource-extension-1.8.0-sources.jar; 赠送Maven依赖信息...
赠送jar包:spring-cloud-alibaba-sentinel-datasource-2021.1.jar; 赠送原API文档:spring-cloud-alibaba-sentinel-datasource-2021.1-javadoc.jar; 赠送源代码:spring-cloud-alibaba-sentinel-datasource-2021....
赠送jar包:sentinel-datasource-extension-1.8.0.jar; 赠送原API文档:sentinel-datasource-extension-1.8.0-javadoc.jar; 赠送源代码:sentinel-datasource-extension-1.8.0-sources.jar; 赠送Maven依赖信息...
JDBC1.0是原来是用DriverManager类来产生一个对数据源的连接。JDBC2.0用一种替代的方法,使用DataSource的实现,代码变的更小巧精致,也更容易控制。