java数据库连接池[转载]

红外基本数据观察需要用到的技巧 1.用ps查看Y8的数据,直接将Y8.raw格式拖动到ps中去。 2.用ps查看Y16数据,直接将Y16.raw拖动到PS中去。 3.Y16转Y8是将Y16的值(Y16的范围~32768–32767)映射到Y8的值(Y8的范围为0~255),步骤如下:1.按照Y16的大小排列并统计相同Y16出现的次数直方图; 2.根据抛点比例计算抛点个数,分别从前往后与从后往前... 阅读详情

java数据库连接池

[转自http://www.donews.net/stevenjiang/archive/2004/05/20/20918.aspx]

java数据库连接池

数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者显式的调用Connection.close()方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:

第一:改变了用户使用习惯,增加了用户的使用难度。

首先我们来看看一个正常的数据库操作过程:


int executeSQL(String sql) throws SQLException
{
        Connection conn = getConnection();        //通过某种方式获取数据库连接
        PreparedStatement ps = null;
        int res = 0;
        try{
                ps = conn.prepareStatement(sql);
                res = ps.executeUpdate();
}finally{
try{
ps.close();
}catch(Exception e){}
try{
        conn.close();//
}catch(Exception e){}
}
return res;
}




使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句conn.close()将被某些特定的语句所替代。

第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,那么连接池将无法正常维护所有连接的状态,考虑连接池和应用由不同开发人员实现时这种问题更容易出现。

综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。

首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标准的java.sql.Connection。用户在获取到这个数据库连接后可以对这个连接进行任意的操作,包括关闭连接等。

通过对用户使用的描述,怎样可以接管Connection.close方法就成了我们这篇文章的主题。

为了接管数据库连接的close方法,我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler,这两个类都在java.lang.reflect包中。我们先来看看SUN公司提供的文档是怎么描述这两个类的。


public interface InvocationHandler

InvocationHandler is the interface implemented by the invocation handler of a proxy instance.

Each proxy instance has an associated invocation handler.
When a method is invoked on a proxy instance,
the method invocation is encoded and dispatched to the invoke method of its invocation handler.




SUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法,而对一般的类无效,考虑到java.sql.Connection本身也是一个接口由此就找到了解决如何接管close方法的出路。

首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下:


public class ConnectionParam implements Serializable
{
        private String driver;                                //数据库驱动程序
        private String url;                                        //数据连接的URL
        private String user;                                        //数据库用户名
        private String password;                                //数据库密码
        private int minConnection = 0;                //初始化连接数
        private int maxConnection = 50;                //最大连接数
        private long timeoutValue = 600000;//连接的最大空闲时间
        private long waitTime = 30000;                //取连接的时候如果没有可用连接最大的等待时间




其次是连接池的工厂类ConnectionFactory,通过该类来将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,具体代码如下:


/**
* 连接池类厂,该类常用来保存多个数据源名称合数据库连接池对应的哈希
* @author liusoft
*/
public class ConnectionFactory
{
        //该哈希表用来保存数据源名和连接池对象的关系表
        static Hashtable connectionPools = null;
        static{
                connectionPools = new Hashtable(2,0.75F);
        }
        /**
         * 从连接池工厂中获取指定名称对应的连接池对象
         * @param dataSource        连接池对象对应的名称
         * @return DataSource        返回名称对应的连接池对象
         * @throws NameNotFoundException        无法找到指定的连接池
         */
        public static DataSource lookup(String dataSource)
                throws NameNotFoundException
        {
                Object ds = null;
                ds = connectionPools.get(dataSource);
                if(ds == null || !(ds instanceof DataSource))
                        throw new NameNotFoundException(dataSource);
                return (DataSource)ds;
        }

        /**
         * 将指定的名字和数据库连接配置绑定在一起并初始化数据库连接池
         * @param name                对应连接池的名称
         * @param param        连接池的配置参数,具体请见类ConnectionParam
         * @return DataSource        如果绑定成功后返回连接池对象
         * @throws NameAlreadyBoundException        一定名字name已经绑定则抛出该异常
         * @throws ClassNotFoundException                无法找到连接池的配置中的驱动程序类
         * @throws IllegalAccessException                连接池配置中的驱动程序类有误
         * @throws InstantiationException                无法实例化驱动程序类
         * @throws SQLException                                无法正常连接指定的数据库
         */
        public static DataSource bind(String name, ConnectionParam param)
                throws NameAlreadyBoundException,ClassNotFoundException,
                                IllegalAccessException,InstantiationException,SQLException
        {
                DataSourceImpl source = null;
                try{
                        lookup(name);
                        throw new NameAlreadyBoundException(name);
                }catch(NameNotFoundException e){
                        source = new DataSourceImpl(param);
                        source.initConnection();
                        connectionPools.put(name, source);
                }
                return source;
        }
        /**
         * 重新绑定数据库连接池
         * @param name                对应连接池的名称
         * @param param        连接池的配置参数,具体请见类ConnectionParam
         * @return DataSource        如果绑定成功后返回连接池对象
         * @throws NameAlreadyBoundException        一定名字name已经绑定则抛出该异常
         * @throws ClassNotFoundException                无法找到连接池的配置中的驱动程序类
         * @throws IllegalAccessException                连接池配置中的驱动程序类有误
         * @throws InstantiationException                无法实例化驱动程序类
         * @throws SQLException                                无法正常连接指定的数据库
         */
        public static DataSource rebind(String name, ConnectionParam param)
                throws NameAlreadyBoundException,ClassNotFoundException,
                                IllegalAccessException,InstantiationException,SQLException
        {
                try{
                        unbind(name);
                }catch(Exception e){}
                return bind(name, param);
        }
        /**
         * 删除一个数据库连接池对象
         * @param name
         * @throws NameNotFoundException
         */
        public static void unbind(String name) throws NameNotFoundException
        {
                DataSource dataSource = lookup(name);
                if(dataSource instanceof DataSourceImpl){
                        DataSourceImpl dsi = (DataSourceImpl)dataSource;
                        try{
                                dsi.stop();
                                dsi.close();
                        }catch(Exception e){
                        }finally{
                                dsi = null;
                        }
                }
                connectionPools.remove(name);
        }
       
}




ConnectionFactory主要提供了用户将将连接池绑定到一个具体的名称上以及取消绑定的操作。使用者只需要关心这两个类即可使用数据库连接池的功能。下面我们给出一段如何使用连接池的代码:


        String name = "pool";
        String driver = " sun.jdbc.odbc.JdbcOdbcDriver ";
        String url = "jdbc:odbc:datasource";
        ConnectionParam param = new ConnectionParam(driver,url,null,null);
        param.setMinConnection(1);
        param.setMaxConnection(5);
        param.setTimeoutValue(20000);
        ConnectionFactory.bind(name, param);
        System.out.println("bind datasource ok.");
        //以上代码是用来登记一个连接池对象,该操作可以在程序初始化只做一次即可
        //以下开始就是使用者真正需要写的代码
        DataSource ds = ConnectionFactory.lookup(name);
        try{
                for(int i=0;i<10;i++){
                        Connection conn = ds.getConnection();
                        try{
                                testSQL(conn, sql);
                        }finally{
                                try{
                                        conn.close();
                                }catch(Exception e){}
                        }
                }
        }catch(Exception e){
                e.printStackTrace();
        }finally{
                ConnectionFactory.unbind(name);
                System.out.println("unbind datasource ok.");
                System.exit(0);
        }




从使用者的示例代码就可以看出,我们已经解决了常规连接池产生的两个问题。但是我们最最关心的是如何解决接管close方法的办法。接管工作主要在ConnectionFactory中的两句代码:


source = new DataSourceImpl(param);
source.initConnection();




DataSourceImpl是一个实现了接口javax.sql.DataSource的类,该类维护着一个连接池的对象。由于该类是一个受保护的类,因此它暴露给使用者的方法只有接口DataSource中定义的方法,其他的所有方法对使用者来说都是不可视的。我们先来关心用户可访问的一个方法getConnection


/**
* @see javax.sql.DataSource#getConnection(String,String)
*/
        public Connection getConnection(String user, String password) throws SQLException
        {
                //首先从连接池中找出空闲的对象
                Connection conn = getFreeConnection(0);
                if(conn == null){
                        //判断是否超过最大连接数,如果超过最大连接数
                        //则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接
                        if(getConnectionCount() >= connParam.getMaxConnection())
                                conn = getFreeConnection(connParam.getWaitTime());
                        else{//没有超过连接数,重新获取一个数据库的连接
                                connParam.setUser(user);
                                connParam.setPassword(password);
                                Connection conn2 = DriverManager.getConnection(connParam.getUrl(),
                                user, password);
                                //代理将要返回的连接对象
                                _Connection _conn = new _Connection(conn2,true);
                                synchronized(conns){
                                        conns.add(_conn);
                                }
                                conn = _conn.getConnection();
                        }
                }
                return conn;
        }
        /**
         * 从连接池中取一个空闲的连接
         * @param nTimeout        如果该参数值为0则没有连接时只是返回一个null
         * 否则的话等待nTimeout毫秒看是否还有空闲连接,如果没有抛出异常
         * @return Connection
         * @throws SQLException
         */
        protected synchronized Connection getFreeConnection(long nTimeout)
                throws SQLException
        {
                Connection conn = null;
                Iterator iter = conns.iterator();
                while(iter.hasNext()){
                        _Connection _conn = (_Connection)iter.next();
                        if(!_conn.isInUse()){
                                conn = _conn.getConnection();
                                _conn.setInUse(true);                               
                                break;
                        }
                }
                if(conn == null && nTimeout > 0){
                        //等待nTimeout毫秒以便看是否有空闲连接
                        try{
                                Thread.sleep(nTimeout);
                        }catch(Exception e){}
                        conn = getFreeConnection(0);
                        if(conn == null)
                                throw new SQLException("没有可用的数据库连接");
                }
                return conn;
        }




DataSourceImpl类中实现getConnection方法的跟正常的数据库连接池的逻辑是一致的,首先判断是否有空闲的连接,如果没有的话判断连接数是否已经超过最大连接数等等的一些逻辑。但是有一点不同的是通过DriverManager得到的数据库连接并不是及时返回的,而是通过一个叫_Connection的类中介一下,然后调用_Connection.getConnection返回的。如果我们没有通过一个中介也就是JAVA中的Proxy来接管要返回的接口对象,那么我们就没有办法截住Connection.close方法。

终于到了核心所在,我们先来看看_Connection是如何实现的,然后再介绍是客户端调用Connection.close方法时走的是怎样一个流程,为什么并没有真正的关闭连接。


/**
* 数据连接的自封装,屏蔽了close方法
* @author Liudong
*/
class _Connection implements InvocationHandler
{
        private final static String CLOSE_METHOD_NAME = "close";
        private Connection conn = null;
        //数据库的忙状态
        private boolean inUse = false;
        //用户最后一次访问该连接方法的时间
        private long lastAccessTime = System.currentTimeMillis();
       
        _Connection(Connection conn, boolean inUse){
                this.conn = conn;
                this.inUse = inUse;
        }
        /**
         * Returns the conn.
         * @return Connection
         */
        public Connection getConnection() {
                //返回数据库连接conn的接管类,以便截住close方法
                Connection conn2 = (Connection)Proxy.newProxyInstance(
                        conn.getClass().getClassLoader(),
                        conn.getClass().getInterfaces(),this);
                return conn2;
        }
        /**
         * 该方法真正的关闭了数据库的连接
         * @throws SQLException
         */
        void close() throws SQLException{
                //由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接
                conn.close();
        }
        /**
         * Returns the inUse.
         * @return boolean
         */
        public boolean isInUse() {
                return inUse;
        }

        /**
         * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
         */
        public Object invoke(Object proxy, Method m, Object[] args)
                throws Throwable
        {
                Object obj = null;
                //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态
                if(CLOSE_METHOD_NAME.equals(m.getName()))
                        setInUse(false);               
                else
                        obj = m.invoke(conn, args);       
                //设置最后一次访问时间,以便及时清除超时的连接
                lastAccessTime = System.currentTimeMillis();
                return obj;
        }
               
        /**
         * Returns the lastAccessTime.
         * @return long
         */
        public long getLastAccessTime() {
                return lastAccessTime;
        }

        /**
         * Sets the inUse.
         * @param inUse The inUse to set
         */
        public void setInUse(boolean inUse) {
                this.inUse = inUse;
        }
}




一旦使用者调用所得到连接的close方法,由于用户的连接对象是经过接管后的对象,因此JAVA虚拟机会首先调用_Connection.invoke方法,在该方法中首先判断是否为close方法,如果不是则将代码转给真正的没有被接管的连接对象conn。否则的话只是简单的将该连接的状态设置为可用。到此您可能就明白了整个接管的过程,但是同时也有一个疑问:这样的话是不是这些已建立的连接就始终没有办法真正关闭?答案是可以的。我们来看看ConnectionFactory.unbind方法,该方法首先找到名字对应的连接池对象,然后关闭该连接池中的所有连接并删除掉连接池。在DataSourceImpl类中定义了一个close方法用来关闭所有的连接,详细代码如下:


        /**
         * 关闭该连接池中的所有数据库连接
         * @return int 返回被关闭连接的个数
         * @throws SQLException
         */
        public int close() throws SQLException
        {
                int cc = 0;
                SQLException excp = null;
                Iterator iter = conns.iterator();
                while(iter.hasNext()){
                        try{
                                ((_Connection)iter.next()).close();
                                cc ++;
                        }catch(Exception e){
                                if(e instanceof SQLException)
                                        excp = (SQLException)e;
                        }
                }
                if(excp != null)
                        throw excp;
                return cc;
        }




该方法一一调用连接池中每个对象的close方法,这个close方法对应的是_Connection中对close的实现,在_Connection定义中关闭数据库连接的时候是直接调用没有经过接管的对象的关闭方法,因此该close方法真正的释放了数据库资源。
[24] cuda 应用之 nppi 实现图像颜色通道变换 阅读详情

相关推荐

解放双手:用KUKA示教器白键一键触发复杂工艺,自定义你的快捷指令

本文详细介绍了如何利用KUKA示教器的工艺白键功能,通过自定义快捷指令一键触发复杂工艺,显著提升自动化产线效率。文章涵盖UserTech技术栈解析、KRL脚本封装、人机交互视觉工程及工业实战策略,帮助工程师实现机械臂操作的高阶优化。

weixin_30379531的博客 432

一种实现数据库连接池的方法(JAVA)

数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式

longyanqian的专栏 1153

鸿蒙设备部署轻量级Web服务器NexServer实践

Web服务器作为互联网基础设施的核心组件,其轻量化部署在移动终端领域具有重要实践价值。本文以鸿蒙操作系统为技术载体,深入解析微内核架构如何通过资源隔离和分布式软总线实现服务高可用。重点探讨NexServer这一专为嵌入式场景设计的轻量级服务器,其ARM原生支持特性与15MB级内存占用,在HTTP/2协议处理与WebSocket通信中展现出独特优势。在智能家居控制面板、边缘计算节点等物联网典型场景中,鸿蒙设备结合NexServer的方案相比传统Nginx部署可降低60%资源消耗。通过实测数据对比,该组合在50

weixin_30411239的博客 482

Java的JDBC数据库连接池实现方法(3)

 DataSourceImpl是一个实现了接口javax.sql.DataSource的类,该类维护着一个连接池的对象。由于该类是一个受保护的类,因此它暴露给使用者的方法只有接口DataSource中定义的方法,其他的所有方法对使用者来说都是不可视的。我们先来关心用户可访问的一个方法getConnection  /*** @see javax.sql.DataSource#getCon

小肆的奶场 1011

社工库2.0

#大题目 社工库2.0 ###环境 whoosh2.7 jieba 12306 python3.7 网上嫖来的网页模板(感谢站长之家 ###实现效果 建立的索引文件 好看的页面 更快的查找速度 ###实现过程 具体的实现过程比较简易,毕竟whoosh已经封装的很好了 第一步 建立索引并存储 schema = Schema(zhanghao=TEXT(stored=True), code=STORED, name=TEXT(stored=True, analyzer=

sdyinruichao的博客 2万+

实战指南:如何用Kamailio+FreeSWITCH搭建高并发企业通信系统(附配置模板)

本文提供了一份实战指南,详细介绍了如何利用Kamailio与FreeSWITCH构建高并发企业通信系统。通过将Kamailio作为高性能SIP信令平面处理路由与负载均衡,FreeSWITCH作为媒体与应用平面负责通话与业务逻辑,实现信令与媒体分离的电信级架构。文章深入解析了架构设计、核心配置、集群部署与性能优化,并附有配置模板,旨在帮助企业构建可水平扩展、高可用的通信解决方案。

dell8的博客 364

Seasar如何执行自定义SQL语句-yellowcong

在Seasar中,没有给我们提供自定义SQL语句的操作,所以我看了一下源码,解决的思路是获取到Seasar封装的DataSourceImpl这个对象,然后我们就可以获取到数据库连接,然后就可以随意操作了,组建注入的时候,是父类,不能是子类,如果是子类,就会报错

1159

[AI] 本地部署 Dify 遇到 Internal Error?一文彻底解决密码不一致引发的问题

摘要:Dify本地部署常见InternalError错误主要由配置残留或密码不一致导致,特别是修改.env文件后未同步清除数据库记录。彻底解决方案包括:1)清理Docker数据;2)删除旧配置和数据库;3)还原源代码;4)重建.env文件;5)重新初始化部署。关键提醒:记录部署路径、备份.env文件并妥善保存密码。该错误本质是配置冲突,最有效方法是完全重置而非调试,保持清晰的部署管理可避免多数InternalError问题。(149字)

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 435

通过java代码连接数据库,利用HikariDataSource动态连接池的方式连接数据库且执行sql语句。

配置类3:连接池管理类。

鹏神丶明月天 4647

【护网必备】Windows平台shellcode免杀加载器

bypass:McAfee、金山(数字签名)、火绒、ESET、卡巴企业版(时间5s 抖动50 Sleep_mask)、360全家桶(物理机)、Norton(加白程序资源)、WDF(PC)、WDF(Server)、Symantec(加白程序资源)bypass:金山(数字签名)、火绒、ESET、360全家桶(物理机)、WDF(PC)、WDF(服务器提示复查(关云保护))、McAfee、Norton(加白程序资源)、卡巴企业版(时间5s 抖动50 Sleep_mask)必须使用Bof操作,shell运行就掉线。

Fly_鹏程万里 1186

元学习与Transformer的结合:Meta-Transformer架构解析

我们生活在一个信息爆炸的时代,每天都会产生海量的数据。在深度学习领域,如何让模型更高效地学习、更快地适应新的任务,一直是科学家们努力的方向。元学习和Transformer都是深度学习中的重要概念,它们各自有着独特的优势。本文的目的就是深入剖析将元学习和Transformer结合起来的Meta - Transformer架构,探讨它的原理、应用以及未来发展。我们会从基础概念讲起,逐步深入到架构的各个方面,让大家对Meta - Transformer有一个全面的了解。

AI智能探索者的博客 1053

java:数据库连接池

数据库连接池

分享前端开发工程师的一些日常生活、前端知识点、职业发展、对一些问题的看法、感悟等等 767

QCC304x系列开发教程(实战篇)之5.2 QCC3040之提示音

earbud_init.c中,初始化table中UiPrompts_Init /*! \brief Table of initialisation functions */ static const init_table_entry_t appInitTable[] = { ......... {UiPrompts_Init, 0, NULL}, ......... } ui_prompts.c中是提示音音处理的主要逻辑和配置源文件 函数static void uiPro...

心跳包的博客 2395

java 连接池代码_Java数据库连接池代码整理[转载]

package cn.ty;import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Driver;import java.sql.DriverManager;import java.sql.ResultSet;import java.sql.SQLException;import java.sql.St...

weixin_35908791的博客 406

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java mysql创建数据库连接池_JAVA数据库连接池(转载)

虽然现在用APACHE COMMONS DBCP可以非常方便的建立数据库连接池,但是像这篇文章把数据库连接池的内部原理写的这么透彻,注视这么完整,真是非常难得,让开发人员可以更深层次的理解数据库连接池,真是非常感谢这篇文章的作者。import java.sql.Connection;import java.sql.DatabaseMetaData;import java.sql.Driver;im...

weixin_33873956的博客 357

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[转载]Java jdbc数据库连接池总结!

1. 引言   近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机   应用程序已从传统的桌面应用转到Web应用。基于B/S(Browser/Server)架构的3层开发模式逐渐取代C/S(Client/Server)架构的开发模式,成为开发企业级应用和电子商务普遍采用的技术。在Web应用开发的早期,主要使用的技术是CGI﹑ASP﹑PHP...

ddvyg02484的专栏 150

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java数据库连接池示例【转载】

说明:通过ConnectionPool类的方法 getConnection()获取一个DB连接。在连接使用完后调用本类方法returnConnection()将此连接放回连接池中   import java.sql.Connection; /** * 此类用于保存连接池中连接对象的类 此类中有两个成员,一个是数据库的连接, 另一个是指示此连接是否 正在使用的标志。 */publi...

ynshun的专栏 198

Java中的BoneCP数据库连接池(转载)

BoneCP is a fast, free, open-source, Java database connection pool (JDBC Pool) library. If you are familiar with C3P0 and DBCP then you already know what this means. For the rest, this is a library th

Vincent_czz的专栏 1万+

[转载]使用JAVA中的动态代理实现数据库连接池

使用JAVA中的动态代理实现数据库连接池数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网 上找到很多关于数据库连接池的源程序,但是...

congji3817的博客 131

JAVA数据库连接池(转载)

[color=indigo]虽然现在用APACHE COMMONS DBCP可以非常方便的建立数据库连接池, 但是像这篇文章把数据库连接池的内部原理写的这么透彻,注视这么完整, 真是非常难得,让开发人员可以更深层次的理解数据库连接池,真是非常感 谢这篇文章的作者。 import java.sql.Connection; import java.sql.DatabaseMetaDa...

fangzhouyuan的博客 141

java servlet 连接池_用连接池提高Servlet访问数据库的效率(转载)

用连接池提高Servlet访问数据库的效率(转载)Java Servlet作为首选的服务器端数据处理技术,正在迅速取代CGI脚本。Servlet超越CGI的优势之一在于,不仅多个请求可以共享公用资源,而且还可以在不同用户请求之间保留持续数据。本文介绍一种充分发挥该特色的实用技术,即数据库连接池。一、实现连接池的意义动态Web站点往往用数据库存储的信息生成Web页面,每一个页面请求导致一次数据库访问...

weixin_39860349的博客 296

Java数据库连接池实现(转载)

import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.Driver; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; ...

GJ微风 123

java 数据库连接池的maxIdle该如何配置(转载非我原创)备忘

java连接池的maxIdle该如何配置 摘要:最近针对某系统做了次压力测试,在并发较高的时候暴露了一个maxIdle设置不合理的问题,特总结一下这次问题,并分析一下这个问题背后的原因。 问题现象 用60个线程并发访问某个读和写均有的业务接口,性能测试人员查看Oracle数据库负载CPU非常高,而且oracle的Logons指标达到148.1次/秒(这个值的含义是数据库客户端登录认证的每秒的次数)。 而且查看应用程序中的线程栈,也发现了较多数量的线程处于创建新的oracle物理连接处。.

zy103118的博客 2866

java bonecp mysql_Java中的BoneCP数据库连接池(转载)

packagecom.bonecp;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importcom.jolbox.bonecp.BoneCP;importcom.jolbox.bonecp.BoneCPConfig;/***@autho...

weixin_36019543的博客 176

HikariCP被号称为性能最好的Java数据库连接池,如何配置使用----转载一篇极度舒适的文章

转载作为记录用!!! HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池。 原文地址:http://blog.youkuaiyun.com/clementad/article/details/46928621 官网:https://github.com/brettwooldridge/HikariCP 为何要使用HiKariCP?这要先从BoneCP说起: 什...

茄子的博客 742

Servlet整合Druid连接池

druid配置(druid.properties) #druid配置文件 #驱动 driverClassName=com.mysql.jdbc.Driver #url url=jdbc:mysql://127.0.0.1:3306/cms?useUnicode=true&ch...

chulu6128的博客 1515
上一篇: 单元测试相关
下一篇: 连接池的相关文章
differ1
博客等级 码龄25年 0粉丝 25原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值