下面是java写的数据库连接池代码,可以连接oracle和mysql,当然使用时必须加上对应的驱动包。
public class JdbcPool {
private static List<Connection> pool=new LinkedList<Connection>();
private static int minConn=10;
private static int maxConn=50;
private static int curActive=0;
private static JdbcPool jp;
public static JdbcPool getInstance(){
if(jp==null){
jp=new JdbcPool();
}
return jp;
}
private JdbcPool(){
initPool();
}
public void initPool(){
for(int i=0;i<minConn;i++){
try {
pool.add(createConnection());
} catch (Exception e) {
e.printStackTrace();
}
}
}
private Connection createConnection() throws Exception{
String clazz="org.gjt.mm.mysql.Driver";//"oracle.jdbc.driver.OracleDriver";
String url="jdbc:mysql://localhost:3306/user";//"jdbc:oracle:thin:@127.0.0.1:1521:ORAC";
String username="root";//"scott";
String password="root";//"tiger";
Connection conn=null;
Class.forName(clazz);
conn=DriverManager.getConnection(url,username,password);
//保证连接池中存放的是对象代理 Proxy得到动态代理对象
conn=(Connection)Proxy.newProxyInstance(Connection.class.getClassLoader(),
new Class[]{Connection.class},
new DynamicProxyHandler(conn));
return conn;
}
public synchronized Connection getConnection() throws Exception{
Connection conn=null;
synchronized (pool) {
if(pool.size()<=0){
if(curActive<=maxConn){
conn=createConnection();//这个已经是代理类
curActive++;
}else{
Thread.sleep(50);
}
}else{
conn=pool.remove(0);
curActive++;
}
}
return conn;
}
private class DynamicProxyHandler implements InvocationHandler{//逻辑处理器
private Connection conn;
private DynamicProxyHandler(Connection conn){
this.conn=conn;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
if(method.getName()=="close"){
synchronized(pool){
if(pool.size()>minConn){
try {
conn.close();
System.out.println("真正关闭");
} catch (SQLException e) {
e.printStackTrace();
}
}else{
System.out.println(conn.getClass());
conn=(Connection)Proxy.newProxyInstance(Connection.class.getClassLoader(),
new Class[]{Connection.class},
new DynamicProxyHandler(conn));
System.out.println(conn.getClass());
pool.add(conn);
}
}
curActive--;
return null;
}
return method.invoke(conn,args);
}
}
public static void main(String[] args) {
try {
Connection conn=null;
for(int i=0;i<100;i++){
conn=JdbcPool.getInstance().getConnection();
System.out.println(conn.getClass());
conn.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
分享到:
相关推荐
而JDBC(Java Database Connectivity)是Java中用于与数据库交互的API,JDBC连接池(如JDBCPool)则是管理数据库连接的一种高效机制。 在这个"struts+jdbcpool实例"中,开发者使用Struts作为前端控制器,处理用户...
JDBC连接池 原子性:最小的单元,如果一个是失败了,则一切的操作将全部失败。 一致性:如果事务出现错误,则回到最原始的状态 隔离性:多个事务之间无法访问,只有当事务完成后才可以看到结果 持久性:当一个...
Tomcat 7 的 新数据源配置方式,context.xml 配置了一个性能优秀的数据源,数据库的账号,密码和url需要根据自己的项目实际情况来修改
本篇文章将对比分析四个常见的Java连接池实现:C3P0、Proxool、Druid和Tomcat JDBC Pool,以帮助开发者选择最适合项目需求的解决方案。 1. C3P0 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3...
java中c3p0数据库连接池使用方法(c3p0-config.xml+c3p0-0.9.2-pre1.jar+JdbcPool_c3p0.java),里面包含了c3p0-0.9.2-pre1.jar、以及配置文件:c3p0-config.xml、以及一个c3p0数据库连接池工具类(只有简单的两个方法...
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
NULL 博文链接:https://jackyin5918.iteye.com/blog/1922379
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用
jar包,官方版本,自测可用