DataSource 接口 简单池实现
2014-05-08 15:17
309 查看
Sun定义提供 connection工厂接口
实现方式
1.不加强Connection的close方法, 每次getConnection都新建一个连接
2.连接池方式实现
3.支持分布式事务, 多数据库联合封装
1方式比较基础 2方式只学了这个, 3方式现在还没接触
加强close用到了动态代理, 包装代码比较多,没写
实现方式
1.不加强Connection的close方法, 每次getConnection都新建一个连接
2.连接池方式实现
3.支持分布式事务, 多数据库联合封装
1方式比较基础 2方式只学了这个, 3方式现在还没接触
加强close用到了动态代理, 包装代码比较多,没写
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.ArrayList; import java.util.List; import java.util.logging.Logger; import javax.sql.DataSource; import org.junit.Test; public class MyDataSource implements DataSource { private List<Connection> pool = new ArrayList<Connection>(); public MyDataSource() { try { Class.forName("com.mysql.jdbc.Driver"); int i = 0; String url = "jdbc:mysql://127.0.0.1:3306/mydb"; String user = "root"; String password = "root"; for (i = 0; i < 3; i++) { final Connection connection = DriverManager.getConnection(url, user, password); Object connectionProxyObject = Proxy.newProxyInstance( MyDataSource.class.getClassLoader(), new Class[] { Connection.class }, new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { Object resultObject = null; if (method.getName().equals("close")) { synchronized (pool) { pool.add((Connection) proxy); } resultObject = null; } else { resultObject = method.invoke(connection, args); } return resultObject; } } ); pool.add((Connection)connectionProxyObject); } } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public PrintWriter getLogWriter() throws SQLException { // TODO Auto-generated method stub return null; } @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 void setLogWriter(PrintWriter arg0) throws SQLException { // TODO Auto-generated method stub } @Override public void setLoginTimeout(int arg0) throws SQLException { // TODO Auto-generated method stub } @Override public boolean isWrapperFor(Class<?> arg0) throws SQLException { // TODO Auto-generated method stub return false; } @Override public <T> T unwrap(Class<T> arg0) throws SQLException { // TODO Auto-generated method stub return null; } @Override public Connection getConnection() throws SQLException { synchronized (pool) { while (true) { if (pool.size() == 0) { try { pool.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { return pool.remove(0); } } } } @Override public Connection getConnection(String username, String password) throws SQLException { // TODO Auto-generated method stub return null; } @Test public void test(){ DataSource dataSource = new MyDataSource(); try { Connection connection1 = dataSource.getConnection(); Connection connection2 = dataSource.getConnection(); Connection connection3 = dataSource.getConnection(); connection3.close(); System.out.println(connection1); System.out.println(connection2); System.out.println(connection3); Connection connection4 = dataSource.getConnection(); System.out.println(connection4); //输出同3 } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
相关文章推荐
- NPOI 2.0 读取、编辑、保存Excel文件
- java数据类型
- Log4j的用法详解
- 调试常用的方法
- jQuery中ajax的使用和缓存问题解决 $getjson 与$get都会被IE缓存
- C#发送邮件代码
- 学习资源链接
- IOS 调试技巧
- 手机腾讯网js增量更新设计和实现
- ACM 大数加法
- 隔离二级内网用户访问一级内网资源不影响上网
- html 和 innerHTML区别
- google-breakpad在 C++11下编译错误 ISO C++ forbids declaration of ‘typeof’ with no type
- 黑马程序员--设计模式之代理模式 02
- 获取窗口句柄函数集合
- 操作手势的实现
- (转)win7+iis7.5+asp.net下 CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files 解决方案
- centos下node.js的安装
- 【原创】Ubuntu下vim配置
- Js得到radiobuttonlist选中值,设置默认值