zoukankan      html  css  js  c++  java
  • 数据库连接池和connection的理解

    数据库连接池Data Source Pool的理解

    1.数据库连接池允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个连接,避免了每个方法里new connection的耗费资源和时间。

    2.数据库连接池是在项目启动时候初始化的,以方便程序运行时,随时可以调用这些已经被创建好的connection。只需要getConnection()就好。

    connection的建立、断开都由连接池自身来管理。

    3.创建connection是个很耗时的操作,所以建议在项目启动的时候去创建connection。避免在方法里需要connection时再去new一个connection是很耗费时间的。

    4.数据库连接池,怎样归还connection?
    Connection connection = pool.getConnection(); 
    pool.release(connection);//归还资源 

    5.程序启动时候,是怎样初始化一个数据连接池的?

    答:spring启动会自动ioc注入bean,相当于new已经配置好的连接池类。连接池类里面声明了static的list,用以装放connection。然后通过static代码块来将conection add进这个list。这样,整个list就在new bean的时候,在加载这个连接池类的时,就先创建好了。后期程序运行时候,那些connection就已经存在了。

    connection的理解

    1.jdbc connection就是一个连接数据库的TCP实例。

    2.connection是个长连接的TCP。不像hTTP是个短连接的,每次都要3次握手才能建立。

    3.connection长连接是提高了性能。不过还有一些细节的问题需要解决,即mysql发现一个链接长时间没有执行查询请求,就会自动断掉这个连接。

    4.具体多长时间后断掉,有个timeout设置时间。通过sql:"show global variables like '%timeout';" 查看。

    当链接已经失效了,仍然去执行查询操作,一个明显的表现形式就是提示:MySQL server has gone away

    5.数据库连接池通过心跳机制,每间断一段时间发送空数据包来保持维护connection存活的。

    6.长连接适用于要进行大量数据传输的情况,如:数据库,redis,memcached等要求快速,数据量大的情况下。 

    7.我们平常用的数据库连接都是长连接的,因为我们每次都是从数据库连接池中去拿connection的!!!db source里都是长连接!!

    8.mysql默认的connection timeout时间是8小时。这个可以通过my.ini配置文件修改。

    9.connection不是线程安全的!Connection不是线程安全的,它在多线程环境中使用时,会导致数据操作的错乱,特别是有事务的情况.connection.commit()方法就是提交事务,你 
    可以想象,在多线程环境中,线程A开启了事务,然后线程B却意外的commit,这该是个多么纠结的情况.

    10.多个线程同用一个connection会不会提高效率,减少多次连接的消耗?答:不会,因为connection里,每个方法都是synchronized,都执行了同步。所以并不会提高效率。
    如:
    public int executeUpdate(){ 
    synchronized(connection){ 
    //do 

    11.菜鸟一般都是两种方法使用connection:1。要么就是只用一个connection,多个线程都用一个connection。2.要么就是每个方法里面创建一个connection,每次调用都创建 

    一个connection。
    这两种都是效率低下的。
    因为TCP链接的创建开支是昂贵的,当然DB server所能承载的TCP并发连接数也是有限制的.因此每次调用都创建一个Connection,这是不现实的;所以才有了数据库连接池的出现.

    创建一个数据库连接池:

    public class SimplePoolDemo {
        //创建一个连接池
        private static LinkedList<Connection> pool = new LinkedList<Connection>(); 
        
        //初始化10个连接
        static{
            try {
                for (int i = 0; i < 10; i++) {
                    Connection conn = DBUtils.getConnection();//得到一个连接
                    pool.add(conn);
                }
            } catch (Exception e) {
                throw new ExceptionInInitializerError("数据库连接失败,请检查配置");
            }
        }
        //从池中获取一个连接
        public static Connection getConnectionFromPool(){
            return pool.removeFirst();//移除一个连接对象
        }
        //释放资源
        public static void release(Connection conn){
            pool.addLast(conn);
        }
    }
  • 相关阅读:
    Java并发容器和线程池
    CountDownLatch、CyclicBarrier
    spring data jpa
    转换时间的工具类(1)
    swagger 报错: TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot h
    自动生成entry-mapper-service-controller
    Hutool工具包导出Excel文件异常 You need to add dependency of poi-ooxml to your project
    Java获取24小时制的时间方法
    查询全国城市行政区
    Java对象与Json字符串之间的转化
  • 原文地址:https://www.cnblogs.com/panxuejun/p/6403760.html
Copyright © 2011-2022 走看看