数据库连接池

按照以前做练习的做法,每次需要使用数据库时,建立连接-完成操作-关闭连接。当访问量少,数据量小的时候,这种办法可行,但是当访问量大的时候性能非常低下,连续插入一百条数据就要6到7秒,大量时间耗费在了与数据库建立连接上。

解决办法之一是使用数据库连接池。思路是当服务器启动是便自动创建好一定数量(可配置)的连接,将这些随时可用的连接放入连接池中。当需要使用的时候直接从连接池中获取,使用完毕后放回池中(此时物理连接还存在,并未断开)。

根据这个博客做的

package com.cto.noticeboard.db;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class JdbcUtils_JNDI {
     private static DataSource ds = null;
        //在静态代码块中创建数据库连接池
        static{
            try{
                 //初始化JNDI
                Context initCtx = new InitialContext();
                 //得到JNDI容器
                Context envCtx = (Context) initCtx.lookup("java:comp/env");
                 //从JNDI容器中检索name为jdbc/datasource的数据源
                ds = (DataSource)envCtx.lookup("jdbc/datasource");
            }catch (Exception e) {
                throw new ExceptionInInitializerError(e);
            }
        }

        public static Connection getConnection() throws SQLException{
            //从数据源中获取数据库连接
            return ds.getConnection();
        }
        public static void release(Connection conn,Statement st,ResultSet rs){
            if(rs!=null){
                try{
                    //关闭存储查询结果的ResultSet对象
                    rs.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
                rs = null;
            }
            if(st!=null){
                try{
                    //关闭负责执行SQL命令的Statement对象
                    st.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }

            if(conn!=null){
                try{
                    //将Connection连接对象还给数据库连接池
                    conn.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        public static void release(Connection conn,Statement st){           
            if(st!=null){
                try{
                    //关闭负责执行SQL命令的Statement对象
                    st.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }

            if(conn!=null){
                try{
                    //将Connection连接对象还给数据库连接池
                    conn.close();
                }catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
}
public long insertSingle(String sql)
    {
        int count=0;
        Connection conn = null;
        Statement statement=null;
        //TestDBCP db = new TestDBCP("jdbc:mysql://localhost/noticeborad");  
        try{            
            conn = JdbcUtils_JNDI.getConnection(); //DBUtil.getInstance().getConnection();
            //System.out.println("conn"+conn);
            statement = conn.createStatement();
            //System.out.println("statemrnt:"+statement);
            count=statement.executeUpdate(sql);
            //System.out.println(db.getDataSourceStats());
        }catch(Exception e){
            e.printStackTrace();
        }finally{
           // DBUtil.close(conn);

            JdbcUtils_JNDI.release(conn, statement);
        }
        return count;
    }
<?xml version="1.0" encoding="UTF-8"?>

 <Context>
     <Resource 
         name="jdbc/datasource" 
         auth="Container"
         type="javax.sql.DataSource" 
         username="root" 
         password="123456"
         driverClassName="com.mysql.jdbc.Driver" 
         url="jdbc:mysql://localhost:3306/noticeborad"
         initialSize="100"
         maxActive="1000" 
         maxTotal="-1"
         maxWaitMillis="-1"
         maxIdle="100"/>
 </Context>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值