精华内容
下载资源
问答
  • 数据库连接

    千次阅读 2019-10-22 19:54:01
    释放空闲时间超过最大空闲时间数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。 这项技术能明显提高对数据库操作的性能。 2、连接解决的问题??? 不断的创建、销毁链接,会导致访问数据库...

    1、什么是数据库连接池?

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

    释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

    这项技术能明显提高对数据库操作的性能

    2、连接池解决的问题???

          不断的创建、销毁链接,会导致访问数据库服务器的压力,而且对于内存来说,不断的开辟与销毁,内存的使用率极低。使用数据库连接池可以明显提高对数据库操作的性能!

          数据库连接池的解决方案是在应用程序启动时建立足够的数据库连接,并将这些连接组成一个连接池(简单说:在一个“池”里放了好多半成品的数据库连接对象),由应用程序动态地对池中的连接进行申请、使用和释放。对于多于连接池中连接数的并发请求,应该在请求队列中排队等待并且应用程序可以根据池中连接的使用率,动态增加或减少池中的连接数

    3、数据库连接池的工作原理???

      1、三步骤     连接池的建立,连接池中连接的使用管理,连接池的关闭

    一、连接池的建立:创建几个连接对象,以便使用的时候能从连接池中获取

    二、客户请求数据库连接时,首先查看连接池中是否有空闲连接,若存在,将连接分配给用户使用;如果没有空闲连接,则查看当前所开的连接数是否已经达到最大的连接数,如果没有达到,就重新创建一个连接给请求的客户,如果达到就按照设定的最大等待时间进行等待,超出的最大等待的时间,就抛出异常给用户,当用户释放数据连接的时候,先判断该连接的引用次数是否超过了规定的值,如果超过就删除,如果没有的话,就保留为其他客户服务。保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源的资源开销。

    三、连接池的关闭,当应用程序退出的时候i,关闭所有的连接,释放相关的资源,正好与创建相反

    4、数据库连接配置时的参数(可选,有默认值)

    最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费.

    最大连接数:是连接池能申请的最大连接数,如果数据库连接请求超过次数,后面的数据库连接请求将被加入到等待队列中,这会影响以后的数据库操作

    最大空闲时间:连接池对象最长的闲置时间,如果长时间没有被使用,那么此连接对象就会被销毁。

    获取连接超时时间:池子中总共有50条连接,当这50条连接都处于工作状态时,第51个连接请求到达,让其加入到等待队列中,等待时间如果超过了设置的超时时间,则抛出异常

    初始化连接数:当数据库连接池创建时,初始化的连接数量

    5、主流的数据库连接池技术

    创建QueryRunner时,可以传递一个数据源DataSource,我们可以将这个数据源理解为数据库连接池,那么我们现在使用不同的数据库连接池技术,目的就只有一个,得到数据源对象

    6、DBCP

    介绍:DBCP(DataBase Connection Pool)属于Apache顶级项目Commons中的核心子项目(最早在Jakarta Commons里就有),它内部依赖于Commons中的另一个子项目Pool,连接池最核心的“池”,就是由Pool组件提供的,因此,DBCP的性能实际上就是Pool的性能

    步骤:

    导包 build path

    书写dbcp.properties属性文件,文件目录在src下

    书写dbcp工具类,来提供数据源

    测试数据源是否可用

    7、封装一个工具类,专门用于向外界提供dbcp的数据源。

    /**
     * 此类的作用就是生成并且提供dbcp的数据源
     * @author Administrator
     *
     */
    public class DBCPUtils {
    	private static DataSource dataSource = null;
    	
    	//完成对数据源的赋值,赋值只需要走一次,所以在静态代码块中完成赋值
    	static {
    		Properties properties = new Properties();
    		FileInputStream fStream = null;
    		try {
    			//创建输入流对象,来读取配置文件dbcp.properties
    			fStream = new FileInputStream("src/dbcp.properties");
    			//将流中读取到的内容加载属性文件对象中
    			properties.load(fStream);
    			//将加载完毕内容的属性文件对象传递到dbcp创建数据源的方法中,生成数据源
    			dataSource = BasicDataSourceFactory.createDataSource(properties);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    	
    	//返回数据源的方法
    	public static DataSource getDataSource() {
    		return dataSource;
    	}
    }

    测试代码的书写:

    public static void main(String[] args) throws SQLException {
    		/*
    		 	使用dbcp数据源来操作数据库
    		 	方式1:在创建QueryRunner对象,给定数据源,此时不需要书写连接获取的代码,会自动从给定的数据源中获取连接
    		 	使用完毕,不需要执行关闭资源的方法,连接对象会自动归还池子
    		 	
    		 	方式2:我们可以通过数据源的getConnection()获取到由池子管理的数据库连接对象
    		 	使用完毕后,执行关闭资源的方法,并不是将连接对象销毁,而是将连接对象归还池子
    		 */
    		/*
    		QueryRunner qRunner = new QueryRunner(DBCPUtils.getDataSource());
    		List<User> users = qRunner.query("select * from user", 
    				new BeanListHandler<User>(User.class));
    		for (User user : users) {
    			System.out.println(user);
    		}*/
    		
    		DataSource dataSource = DBCPUtils.getDataSource();
    		Connection connection = dataSource.getConnection();
    		QueryRunner qRunner = new QueryRunner();
    		List<User> users = qRunner.query(connection, "select * from user", 
    				new BeanListHandler<User>(User.class));
    		for (User user : users) {
    			System.out.println(user);
    		}
    		DbUtils.close(connection);
    	}

    写一个参数文件dbcp.properties:

    //创建输入流对象,来读取配置文件dbcp.properties

    7、druid的使用

    介绍:它除了提供性能卓越的连接池功能外,还集成了SQL监控,黑名单拦截等功能,用它自己的话说,Druid是“为监控而生”。借助于阿里这个平台的号召力,产品一经发布就赢得了大批用户的拥趸,从用户使用的反馈来看,Druid也确实没让用户失望。

    使用步骤:

    导包   

    书写配置文件druid.properties    

    书写druid工具类,来生成并提供druid的数据源   

    /**
     * 此类专门用于生成druid数据源
     * @author Administrator
     *
     */
    public class DruidUtils {
    	//声明数据源
    	private static DataSource dataSource = null;
    	
    	//为数据源赋值
    	static {
    		Properties properties = new Properties();
    		FileInputStream fStream = null;
    		try {
    			fStream = new FileInputStream("src/druid.properties");
    			properties.load(fStream);
    			dataSource = DruidDataSourceFactory.createDataSource(properties);
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} finally {
    			try {
    				if (fStream != null) {
    					fStream.close();
    				}
    			} catch (IOException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	//返回获取数据源的方法
    	public static DataSource getDataSource() {
    		return dataSource;
    	}
    }

    书写测试代码

    public static void main(String[] args) {
    		//使用druid+dbutils完成添加操作
    		QueryRunner qRunner = new QueryRunner(DruidUtils.getDataSource());
    		try {
    			int row = qRunner.update("insert into user values (null, ?, ?, ?)", 
    								"小阔爱", "666", "男");
    			System.out.println(row > 0 ? "添加成功" : "添加失败");
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}

    8、c3p0的使用

    介绍:C3P0是我使用的第一款数据库连接池,在很长一段时间内,它一直是Java领域内数据库连接池的代名词,当年盛极一时的Hibernate都将其作为内置的数据库连接池,可以业内对它的稳定性还是认可的。C3P0功能简单易用,稳定性好这是它的优点,但是性能上的缺点却让它彻底被打入冷宫。C3P0的性能很差,差到即便是同时代的产品相比它也是垫底的,更不用和Druid、HikariCP等相比了。正常来讲,有问题很正常,改就是了,但c3p0最致命的问题就是架构设计过于复杂,让重构变成了一项不可能完成的任务。随着国内互联网大潮的涌起,性能有硬伤的c3p0彻底的退出了历史舞台。

    使用步骤:

    导包   

    书写c3p0.properties文件,一定要放在src下   

    如果c3p0的配置文件名称叫c3p0.properties,并且放在了src下,那么就会自动读取配置文件!

    测试代码  

    测试代码:
    public class C3P0Demo {
    	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
    	
    	public static void main(String[] args) {
    		QueryRunner qRunner = new QueryRunner(dataSource);
    		try {
    			User user = qRunner.query("select * from user where uid = ?",
    					new BeanHandler<User>(User.class), 2);
    			System.out.println(user);
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();

    五,duid,dbcp,c3p0 的区别。

     

     

     

     

     

     

     

    展开全文
  • ———以上参考《百度百科》 二、为什么使用数据连接 建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如...

    一、什么是连接池?

    数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;

    释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。

    ———以上参考《百度百科》

    二、为什么使用数据连接池

    建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。

    连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。

    三、数据库连接池的工作原理

    连接池的工作原理主要由三部分组成,分别为

    • 连接池的建立
    • 连接池中连接的使用管理
    • 连接池的关闭

    第一、连接池的建立。
      一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。

    Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。

    第二、连接池的管理。
      连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:

    当客户请求数据库连接时,

    • 1)如果池中有空闲连接可用,返回该连接。
    • 2)如果没有空闲连接,池中连接都已用完,创建一个新连接添加到池中。
    • 3)如果池中连接已达到最大连接数,请求按设定的最大等待时间进入等待队列直到有空闲连接可用。
    • 4)如果超出最大等待时间,则抛出异常给客户。

    当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。

    该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。

    如果连接长时间空闲,或检测到与服务器的连接已断开,连接池管理器也会将该连接从池中移除。

    第三、连接池的关闭。
    当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。

    四、连接池需要注意的点

    1、并发问题

    为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。

    这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等,使用synchronized(java)lock(C#)关键字即可确保线程是同步的。

    2、事务处理

    我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。

    我们知道当2个线程共用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。

    为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。

    3、连接池的分配与释放

    连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

    对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他,如果没有就抛出一个异常给用户。

    4、连接池的配置与维护

    连接池中到底应该放置多少连接,才能使系统的性能最佳?

    系统可采取设置**最小连接数(minConnection)最大连接数(maxConnection)**等参数来控制连接池中的连接。

    比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。

    最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。

    如何确保连接池中的最小连接数呢?

    有动态和静态两种策略。
    动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。

    展开全文
  • 数据库连接 1、什么是数据库连接数据库连接(Database Connection Pooling)在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许...释放空闲时间超过最大空闲时间数据库连...

                                                    数据库连接池

    1、什么是数据库连接池?

              数据库连接池(Database Connection Pooling)在程序初始化时创建一定数量的数据库连接对象并将其保存在一块内存区中,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接以避免因为没有释放数据库连接而引起的数据库连接遗漏

             即在程序初始化的时候创建一定数量的数据库连接,用完可以放回去,下一个在接着用,通过配置连接池的参数来控制连接池中的初始连接数、最小连接、最大连接、最大空闲时间这些参数保证访问数据库的数量在一定可控制的范围类,防止系统崩溃,使用户的体验好

    2、为什么使用数据库连接池?(形象的说就是用了可以放回去给别人用,大家共享)

           数据库连接是一种关键、有限且昂贵的资源,创建和释放数据库连接是一个很耗时的操作,频繁地进行这样的操作将占用大量的性能开销,进而导致网站的响应速度下降,严重的时候可能导致服务器崩溃;数据库连接池可以节省系统许多开销。

    3.通过jdbcTemplat配置数据库连接池

    <!--配置文件-->
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    
    	<bean id="dataSource"  class="com.zaxxer.hikari.HikariDataSource">
    		<property name="driverClassName"  value="com.mysql.jdbc.Driver"></property>
    		<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/test"></property>
    		<property name="username" value="root"></property>
    		<property name="password"  value="root"></property>
    		<property name="idleTimeout" value="60000"></property><!--最大空闲时间-->
    		<property name="maximumPoolSize" value="20"></property><!--最大连接数-->
    		<property name="minimumIdle"  value="10"></property><!-- 最小连接数 -->
    	</bean>
    	
    	<bean id="jdbcTemplate " class="org.springframework.jdbc.core.JdbcTemplate">
    		<property name="dataSource"   ref="dataSource"></property>
    	</bean>
    	<context:component-scan base-package="com.jd"></context:component-scan>
    </beans>
    

    最大的空闲时间:数据库连接对象所能存活的最大时间。

    最小连接数:是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

    最大连接数:所能创建连接池的最大数目,如果数据库连接池连接请求超过该数目,这个请求就先等待。

    4. HikariCP是目前速度最快的数据库连接池,目前流行的技术,连速度快。

    展开全文
  • 谈谈数据库连接的原理

    万次阅读 多人点赞 2013-11-06 10:14:07
    这次我们采取技术演进的方式来谈谈数据库连接的技术出现过程及其原理,以及当下最流行的开源数据库连接jar包。

    谈谈数据库连接池的原理

                                                                                                                                                                             帅宏军

         这次我们采取技术演进的方式来谈谈数据库连接池的技术出现过程及其原理,以及当下最流行的开源数据库连接池jar包。

    一.早期我们怎么进行数据库操作

           1.原理:一般来说,java应用程序访问数据库的过程是:

       ①装载数据库驱动程序;

       ②通过jdbc建立数据库连接;

       ③访问数据库,执行sql语句;

       ④断开数据库连接。

           2.代码 

           // 查询所有用户

           Public void FindAllUsers(){
                  //1、装载sqlserver驱动对象
                  DriverManager.registerDriver(new SQLServerDriver());             
                  //2、通过JDBC建立数据库连接
                  Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");            
                  //3、创建状态
                  Statement state =con.createStatement();           
                  //4、查询数据库并返回结果
                  ResultSet result =state.executeQuery("select * from users");           
                  //5、输出查询结果
                  while(result.next()){
                         System.out.println(result.getString("email"));
                  }            
                  //6、断开数据库连接
                  result.close();
                  state.close();
                  con.close();
            }

    3.分析

           程序开发过程中,存在很多问题:首先,每一次web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的web应用,尤其是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

           上述的用户查询案例,如果同时有1000人访问,就会不断的有数据库连接、断开操作:

     

           通过上面的分析,我们可以看出来,“数据库连接”是一种稀缺的资源,为了保障网站的正常使用,应该对其进行妥善管理。其实我们查询完数据库后,如果不关闭连接,而是暂时存放起来,当别人使用时,把这个连接给他们使用。就避免了一次建立数据库连接和断开的操作时间消耗。原理如下:

    二. 技术演进出来的数据库连接池

           由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个很著名的设计模式:资源池(resource pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量﹑使用情况,为系统开发﹑测试及性能调整提供依据。

           我们自己尝试开发一个连接池,来为上面的查询业务提供数据库连接服务:

           ①   编写class 实现DataSource 接口

           ②   class构造器一次性创建10个连接,将连接保存LinkedList

           ③   实现getConnection  LinkedList返回一个连接

           ④   提供将连接放回连接池中方法

     

           1、连接池代码       

        public class MyDataSource implements DataSource {
                  //链表 --- 实现栈结构
                  privateLinkedList<Connection> dataSources = new LinkedList<Connection>();
     
                  //初始化连接数量
                  publicMyDataSource() {
                         //一次性创建10个连接
                         for(int i = 0; i < 10; i++) {
                                try {
                                   //1、装载sqlserver驱动对象
                                   DriverManager.registerDriver(new SQLServerDriver());
                                   //2、通过JDBC建立数据库连接
                                   Connection con =DriverManager.getConnection(
                                      "jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123");
                                   //3、将连接加入连接池中
                                   dataSources.add(con);
                                } catch (Exception e) {
                                   e.printStackTrace();
                                }
                         }
                  }
     
                  @Override
                  publicConnection getConnection() throws SQLException {
                         //取出连接池中一个连接
                         finalConnection conn = dataSources.removeFirst(); // 删除第一个连接返回
                         returnconn;
                  }
     
                  //将连接放回连接池
                  publicvoid releaseConnection(Connection conn) {
                         dataSources.add(conn);
                         }
           }


           2、使用连接池重构我们的用户查询函数       

           //查询所有用户
           Public void FindAllUsers(){
                  //1、使用连接池建立数据库连接
                  MyDataSource dataSource = new MyDataSource();
                  Connection conn =dataSource.getConnection();        
                  //2、创建状态
                  Statement state =con.createStatement();           
                  //3、查询数据库并返回结果
                  ResultSet result =state.executeQuery("select * from users");           
                  //4、输出查询结果
                  while(result.next()){
                         System.out.println(result.getString("email"));
                  }            
                  //5、断开数据库连接
                  result.close();
                  state.close();
                  //6、归还数据库连接给连接池
                  dataSource.releaseConnection(conn);
            }

           这就是数据库连接池的原理,它大大提供了数据库连接的利用率,减小了内存吞吐的开销。我们在开发过程中,就不需要再关心数据库连接的问题,自然有数据库连接池帮助我们处理,这回放心了吧。但连接池需要考虑的问题不仅仅如此,下面我们就看看还有哪些问题需要考虑。

    三.连接池还要考虑更多的问题

           1、并发问题

           为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为java语言自身提供了对并发管理的支持,使用synchronized关键字即可确保线程是同步的。使用方法为直接在类方法前面加上synchronized关键字,如:

          publicsynchronized connection getconnection()

     

           2、多数据库服务器和多用户

           对于大型的企业级应用,常常需要同时连接不同的数据库(如连接oraclesybase)。如何连接不同的数据库呢?我们采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件,其中资源文件中存放着多个数据库的url地址等信息。根据资源文件提供的信息,创建多个连接池类的实例,每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字,通过不同的名字来管理不同的连接池。

           对于同一个数据库有多个用户使用不同的名称和密码访问的情况,也可以通过资源文件处理,即在资源文件中设置多个具有相同url地址,但具有不同用户名和密码的数据库连接信息。

     

           3、事务处理

           我们知道,事务具有原子性,此时要求对数据库的操作符合“all-all-nothing”原则即对于一组sql语句要么全做,要么全不做。

           java语言中,connection类本身提供了对事务的支持,可以通过设置connectionautocommit属性为false 然后显式的调用commitrollback方法来实现。但要高效的进行connection复用,就必须提供相应的事务支持机制。可采用每一个事务独占一个连接来实现,这种方法可以大大降低事务管理的复杂性。

     

           4、连接池的分配与释放

           连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。

           对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxconn如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout 则返回空值(null)。系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法。

     

           5、连接池的配置与维护

           连接池中到底应该放置多少连接,才能使系统的性能最佳?系统可采取设置最小连接数(minconn)和最大连接数(maxconn)来控制连接池中的连接。最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过反复测试,找到最佳点。

           如何确保连接池中的最小连接数呢?有动态和静态两种策略。动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。

    四.实际开发中有成熟的开源连接池供我们使用

           理解了连接池的原理就可以了,没有必要什么都从头写一遍,那样会花费很多时间,并且性能及稳定性也不一定满足要求。事实上,已经存在很多流行的性能优良的第三方数据库连接池jar包供我们使用。如:

           1.Apache commons-dbcp 连接池

            下载:http://commons.apache.org/proper/commons-dbcp/

     

           2.c3p0 数据库连接池

            下载:http://sourceforge.net/projects/c3p0/

     

          网上有很多关于这些连接池的介绍文章,这里就不再进行展开。


    转载请注明出处:http://blog.csdn.net/shuaihj/article/details/14223015

    展开全文
  • 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接。 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗...
  • 上一个章节,我们讲了xml文件的解析框架XML...这个章节主要实现自己的数据库连接,封装自己的BasicDataSource类。实现自己业务的数据。下面开始我们的项目构建。 1.1.1. maven依赖。 org.apache.commons commons
  • java数据库连接

    2018-08-12 10:42:26
    一、数据库连接是什么 ①数据库连接的基本思想就是为数据库连接建立一个“缓冲”。 数据库连接负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。 ②...
  • 数据库连接DataSource

    千次阅读 2017-09-17 18:40:28
    一:数据库连接介绍 什么是数据库连接 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的...
  • 自定义数据库连接

    千次阅读 2019-04-20 13:21:41
    时间很快就到周末了,学习计划也已经进行了五天了,既然是周末的话,那当然要多学习一点知识,毕竟拥有这么充裕的时间。 今天的学习内容是数据库连接。 那什么是数据库连接,它有什么作用是我们首先会想到的问题...
  • 本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接实现过程作为演示。 一、早期通过JDBC方式操作数据库 我们先来看早期使用JDBC...
  • 数据库连接面试

    千次阅读 2019-08-31 15:38:42
    数据库连接了解吗, 有什么好处? 有了解数据库连接吗? 17.自己如何设计数据库连接 数据库连接代码 数据库连接用的哪个? 数据库连接是线程安全的吗? MyBatis 中其实是有数据库连接的,那么为什么要有...
  • Android中的数据库连接

    千次阅读 2019-11-02 20:19:14
    最近在看数据库相关的三方库的时候,我发现在Android应用开发的时候是可以并行操作数据库的读写,但Android默认的数据连接中只有一个数据库链接。一个数据库连接能实现并发么?要是一个数据库链接可以实现并发,...
  • SpringBoot切换数据库连接

    千次阅读 2017-08-12 03:28:10
    释放空闲时间超过最大空闲时间数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。数据库连接有哪些? DBCP(DBCP(DataBase Connection Pool)数据库连接...
  • 1.SpringBoot的数据库连接的相关默认 springBoot之前的版本默认使用的是Tomcat的数据库连接 较新的版本2点多(具体多少我看看)默认使用的是Hikari(我使用的是2.2.1) 默认支持数据库连接: Tomcat ...
  • 配置tomcat数据库连接及使用数据库连接(hibernate数据源配置和使用) 数据库连接就是一个装有很多个数据库连接的东西,配置包括3步:1.让tomcat容器启动创建数据库连接2.在某个项目中关联数据库连接,3....
  • Mybatis深入之数据库连接原理

    万次阅读 多人点赞 2015-06-23 22:34:43
    Mybatis深入之数据库连接原理简介主要记录Mybatis数据库连接实现原理、如何使用连接来管理数据库连接的、连接如何向外提供数据库连接、当外部调用使用完成之后是如何将数据库连接放回数据库连接的。
  • 本节内容紧接着上篇的数据库连接原理分析,继续讲解连接需要考虑的其他重要问题 1、并发问题  为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。这个问题相对比较好解决,因为java语言...
  • 数据库连接理解

    千次阅读 2016-12-25 13:16:03
    1 数据库连接中的连接,本质是一种对象,创建连接,可以减少对象初始化、创建的时间,这个和线程池有点类似。都是为了节省创建时间,资源复用。 2 和连接一样,数据库连接创建的一般也有最大,最小值,即...
  • 使用了druid数据库连接以后有时候运行会报com.alibaba.druid.pool.DruidDataSource.error create connection error, url: jdbc:mysql://localhost:3306/resturant, errorCode 1045, state 28000 java.sql....
  • 数据库连接的理解和使用

    万次阅读 多人点赞 2015-08-27 20:49:47
    一、什么是数据库连接? 官方:数据库连接(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接,由程序动态地对中的连接进行申请,使用,释放。 个人理解:创建数据库连接...
  • 数据库连接原理详解与自定义连接实现

    万次阅读 多人点赞 2017-05-17 18:18:54
    实现原理数据库连接在初始化时将创建一定数量的数据库连接放到连接中,这些数据库连接的数量是由最小数据库连接数制约。无论这些数据库连接是否被使用,连接都将一直保证至少拥有这么多的连接数量。连接的...
  • Java-数据库连接技术

    千次阅读 多人点赞 2021-02-06 10:43:57
    (Pool)技术在一定程度上可以明显优化服务器应用程序的...数据库连接负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;常见的数据库连接技术有C3P0,Druid
  • 数据库连接实现原理

    千次阅读 2018-05-08 13:54:10
    为什么要用数据库连接 数据库连接是一种关键的、有限的、昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。...
  • 动态加载数据库连接

    千次阅读 2019-08-22 09:29:58
    实现背景:对于SQL语句需要在库中配置的数据源加载问题,无法直接使用外部的数据库连接加载动态配置的数据库 简单的实现方式是使用JDBC单独获取配置信息建立数据库连接,对于连接频繁的数据库连接使用JDBC则不是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 235,256
精华内容 94,102
关键字:

数据库时间池怎么查询