- 浏览: 249669 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
pshaoyi:
连接创建没问题,在执行的时候就报错了。Caused by: c ...
jdbc连接池简单封装 -
imbangbang:
中文乱码,没有解决掉
Java实现Zip压缩与解压(解决中文乱码问题) -
chjy1983:
麻烦也发份给我,chl_82@126.com,谢谢!
Java实现Zip压缩与解压(解决中文乱码问题) -
jidacwj:
楼主写的这个有问题呀首先,多线程分割文件第45行,我尝试打印每 ...
Java 大文件读取排序 -
www6wzk:
非常好的学习例子,十分感谢!
Jbpm工作流实例—报销申请
主要实现方法是:
使用一个容器(LinkedList),初始化的时候设定好连接数,生成Connection对象放在容器中
以后每次获取连接的时候都从容器中获取,但是这样有一个问题,当我们关闭连接的时候调用
Connection的close()方法的时候会直接将Connection关闭而不是重新放到容器中……
在这里使用的是代理,真正使用的是通过代理生成的一个存放在内存中的类,在这个类拦截了close()方法,在close()方法中将连接重新放回容器中......
数据库连接池类
代理类
上述代码只是简单进行封装,主要是让大家了解一下数据库连接池的实现方式以及了解一下代理的实现,对以后学习Hibernate以及Spring的AOP有较大帮助
使用一个容器(LinkedList),初始化的时候设定好连接数,生成Connection对象放在容器中
以后每次获取连接的时候都从容器中获取,但是这样有一个问题,当我们关闭连接的时候调用
Connection的close()方法的时候会直接将Connection关闭而不是重新放到容器中……
在这里使用的是代理,真正使用的是通过代理生成的一个存放在内存中的类,在这个类拦截了close()方法,在close()方法中将连接重新放回容器中......
数据库连接池类
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.util.LinkedList; public class MyDataSource{ private static String url = "jdbc:mysql://localhost:3306/jdbc"; private static String user = "root"; private static String password = ""; //初始化连接个数 private static int initCount = 1; //最大连接个数 private static int maxCount = 1; //当前连接个数 int currentCount = 0; /** * 使用linkedList是由于频繁的对容器进行增加和删除操作,相比ArrayList快 */ LinkedList<Connection> connectionsPool = new LinkedList<Connection>(); /** * 初始化数据连接池中的连接个数 * @throws ClassNotFoundException */ public MyDataSource() throws ClassNotFoundException { Class.forName("com.mysql.jdbc.Driver"); try { for (int i = 0; i < initCount; i++) { this.connectionsPool.addLast(this.createConnection()); this.currentCount++; } } catch (SQLException e) { throw new ExceptionInInitializerError(e); } } /** * 从数据连接池中获取连接 * @return * @throws SQLException */ public Connection getConnection() throws SQLException { synchronized (connectionsPool) { if (this.connectionsPool.size() > 0) return this.connectionsPool.removeFirst(); if (this.currentCount < maxCount) { this.currentCount++; return this.createConnection(); } throw new SQLException("��û��t��"); } } /** * 连接关闭后返回连接池中 * @param conn */ public void free(Connection conn) { this.connectionsPool.addLast(conn); } /** * 创建连接,使用代理模式 * 实际上生成的不是java.sql.Connection * proxy.bind(realConn);返回的是经过封装后的Connection * 在其调用close()方法的时候拦截然后在close()方法中将连接放回连接池而不是直接关闭 * @return * @throws SQLException */ private Connection createConnection() throws SQLException { Connection realConn = DriverManager.getConnection(url, user, password); MyConnectionHandler proxy = new MyConnectionHandler(this); return proxy.bind(realConn); } public static void main(String[] args) throws Exception { MyDataSource mds = new MyDataSource(); for(int i=0; i<10; i++) { Connection conn = mds.getConnection(); System.out.println(conn); conn.close(); } } }
代理类
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; class MyConnectionHandler implements InvocationHandler { //普通的jdbc Connection private Connection realConnection; //通过代理在内存中生成的类 private Connection warpedConnection; private MyDataSource dataSource; //每个连接最多使用次数 private int maxUseCount = 5; //连接当前使用次数 private int currentUserCount = 0; MyConnectionHandler(MyDataSource dataSource) { this.dataSource = dataSource; } /** * 使用Proxy代理生成一个类 * 注意,生成的类不是我们以文本格式存在 * 而是存在内存中的 * @param realConn * @return */ Connection bind(Connection realConn) { this.realConnection = realConn; /** * Proxy.newProxyInstance(loader, interfaces, h) * 其中loader是类加载器 * interfaces是要实现的接口,这里使用的是java.sql.Connection * h是InvocationHandler,调用方法后交给哪个对象处理 */ this.warpedConnection = (Connection) Proxy.newProxyInstance(this .getClass().getClassLoader(), new Class[] { Connection.class }, this); return warpedConnection; } /** * 每个代码实例都具有一个关联的调用处理程序。 * 对代理实例调用方法时, * 将对方法调用进行编码并将其指派到它的调用处理程序的 invoke 方法。 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //拦截close()方法,重写里面的方法 if ("close".equals(method.getName())) { this.currentUserCount++; if (this.currentUserCount < this.maxUseCount) this.dataSource.connectionsPool.addLast(this.warpedConnection); else { this.realConnection.close(); this.dataSource.currentCount--; } } //其他方法调用普通的jdbc Connection处理 return method.invoke(this.realConnection, args); } }
上述代码只是简单进行封装,主要是让大家了解一下数据库连接池的实现方式以及了解一下代理的实现,对以后学习Hibernate以及Spring的AOP有较大帮助
评论
3 楼
pshaoyi
2015-03-18
连接创建没问题,在执行的时候就报错了。
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1115)
at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:3001)
at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:2996)
... 58 more
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:406)
at com.mysql.jdbc.Util.getInstance(Util.java:381)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:984)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:1115)
at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:3001)
at com.mysql.jdbc.ConnectionImpl.getMetaData(ConnectionImpl.java:2996)
... 58 more
2 楼
alask2011
2012-02-24
而且proxy.bind(realConn);好像返回的也不是代理对象,因为代理对象打印出来的时候都是 以 $ 开头的,这个还是普通的对象
1 楼
alask2011
2012-02-24
封装的还是有问题,真正的连接超出使用次数的时候根本关不掉啊,
就是那个普通的jdbc连接关不掉,我close()之后还是可以打印的
this.realConnection.close();这一句
就是那个普通的jdbc连接关不掉,我close()之后还是可以打印的
this.realConnection.close();这一句
发表评论
-
Mybatis3
2012-01-08 15:07 923看了一下Mybatis3,很简洁,不错,符合一贯的原则。 -
断网情况下主机系统与VMWare虚拟系统建立网络连接
2011-03-07 13:52 1626电脑不插网线设置主机系统与VMWare中linux系统 ... -
Oracle 9i10g编程艺术
2010-12-08 23:41 1019Oracle 9i10g编程艺术 -
SWT And JFace
2010-12-01 21:29 828The_Definitive_Guide_to_SWT_and ... -
SWT 定时器 update UI
2010-11-30 17:00 1810SWT如果涉及到线程中的数据互访,在一个线程中的触发事性中再去 ... -
Log4j XML 配置方式
2010-11-14 13:00 1499Log4j xml 配置文件log4j.xml[默认读取的文件 ... -
ThreadPool 线程池的使用
2010-10-20 21:41 7444import java.util.concurrent.B ... -
Java 大文件读取排序
2010-09-30 00:34 8223需求: csv文件中存在千万级数据,需要按照某一列进行排序 比 ... -
Oracle
2010-05-29 22:26 2453最近很有兴趣研究Oracle,今天把Oracle10g ... -
JArgp Command Line Argument Processor
2010-05-12 21:02 857http://sourceforge.net/projects ... -
Java 反射与内省
2009-09-27 22:52 3391一、java反射机制 JAVA反 ... -
分页工具类Page
2009-09-26 16:10 5787public class Page { public ... -
dom4j
2009-07-22 11:52 1074DOM4J是dom4j.org出品的一个开源XML解析 ... -
Javamail 详解
2009-07-21 22:17 2743最近研究JBPM的mail node节点,使用时老是发不出邮件 ... -
proxool数据连接池总结
2009-07-10 21:41 14641数据库连接池总结----Proxool 1、所需jar包: ... -
通过url下载文件HttpURLConnection
2009-07-08 15:48 17214import java.io.*; import jav ... -
web.xml配置五个有用的过滤器
2009-07-01 14:34 2950一、使浏览器不缓存页面的过滤器 Java代码 im ... -
Tomcat 配置JNDI数据源总结
2009-04-24 09:41 2001JNDI是J2EE中一个很重要的标准,通常我们是在J2EE编程 ... -
关于web.xml中的load-on-startup作用
2009-04-19 11:51 2920load-on-startup 元素在web应用启动的时候指定 ... -
Struts2学习笔记
2009-04-18 09:55 1338包括下面内容: 一、Struts2简介.doc 二、Stru ...
相关推荐
根据mysql数据库自动生成对应的javabean,附带jdbc连接池工具类封装,支持Resultset转List javabean对象
游戏服务器 数据库连接池 jdbc 简单封装
关于java对SQLite和sql的封装类,可以实现增删改,查,事务操作
数据库连接池封装和ORM框架封装 涉及到知识点:多种设计模式、注解、反射.通过该封装学习,可以加深对java基础的理解
JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种...通过pool连接池提高性能,并将数据库数据直接转成json对象,且封装了几种取值方式。比传统的ojdbc性能更快更高效
Java JDBC封装类升级版,带增删改查例子,支持oracle,MySql,hsqldb 等,支持事务,返回数据格式 支持二维数组,MAP格式,以及javabean对象。有利于初学者DbDemo.java为demo,Connect为jdbc封装类,可以作为项目共通类...
JDBC+连接池–值得一看JDBC的使用增删改查操作JDBC工具类的封装JDBC实现新增数据-插入-insertJDBC实现修改数据-更新–updateJDBC实现删除数据-删除—deleteJDBC实现查询数据-查询—select案例:实现用户登录案例:...
再接再厉,推出我的JDBC小组件,非常有利于初学者学习使用,也可以用于小型项目DAO,大家共同学习交流!
MYSQL JDBC 封装类,涵盖了c3p0连接池
下面小编就为大家带来一篇jdbc结合dpcp连接池的封装实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
这是一个非常实用的JDBC工具类,这些封装好的方法很通用。。拿到任何地方,只要是连接oracle数据库,都可以排上用场!!!
yy-connJDBC 数据库连接池,简单封装,可以连接多个数据源
Java JDBC基本内容,带增删改查例子,支持MySql数据库,支持...有利于初学者理解数据库和Java的连接,还有连接池的两个小demo,也是慕课网上 JDBC之对面的女孩走过来这个项目的源码,实测可用,和课程上的效果一样。
采用bonecp数据库连接池封装了Jdbc,当时也是网上下载了一份代码,发现不能用,只好自己修改代码,现在这个代码是可以直接运行的,测试用的Sql Server 2008,表很简单,就四个字段
简单易用的数据库封装操作,包含数据库连接池的基本实现,数据库连接可重用,所有的操作都脱离源生JDBC操作,开发人员只需要熟悉Java集合的用法,会写Sql即可轻松的使用该封装好的JDBC API写出合理的代码。...
连接池的初始化、创建等仔细看构造函数的doc文档,就知道如何操作。我自己用着很方便。 有两个初始化方法,分别用于初始化多个数据库对象,或者单个数据库对象。 String[] dbPoolName = { "default", "sec" }; ...
JDBC规范 java.sql和javax.sql两个包中的类与接口(天龙八部): DataSource:数据源 DriverManager:驱动管理 Driver:JDBC驱动 ... JDBC数据库连接池/Connection Pool DBCP:apache tomcat内置
connectionPool.jar 把jdbc封装而成数据库连接池,配置简单,使用方便.
第十四节 编写一个简单的数据库连接池 74 14.1 为什么要使用数据库连接池 74 14.2 数据库连接池雏形 74 14.2 数据库连接池优化 77 14.2.1 对线程池加锁 77 14.2.2 连接不够用时抛出异常 77 14.3 数据库连接池之代理...
自己封装的阿里的Druid数据库连接池和Apache的DBUtils集成JDBC的工具类,可直接拿来使用