spring 连接到数据库池以及数据库操作

来源:互联网 发布:banner制作软件 编辑:程序博客网 时间:2024/05/17 21:57

1、传统的两层结构中(即客户端、数据库),客户端程序在启动时打开数据库连接,在退出程序时关闭数据库连接。这样,每个客户端始终占用一个数据库连接,效率低下;在三层结构模式中(即客户端、数据库连接池、数据库),数据库连接通过中间层的连接池管理。只有当用户真正需要进行数据库操作时,中间层才从连接池申请一个连接,数据库操作完毕,连接立即释放到连接池中,以供其他用户使用。这样,少量的共享线程池可以维护大量的数据库连接,而且省去了建立连接的时间。

数据库连接池的几个属性说明:

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

● 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中;

● 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些新建立的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或者空闲超时后被释放。

 

2、dbcp

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">            <property name="driverClassName" value="com.mysql.jdbc.Driver" />           <property name="url" value="jdbc:mysql://localhost:3309/sampledb" />           <property name="username" value="root" />           <property name="password" value="1234" />       </bean>

BasicDataSource提供了close()方法来关闭数据源,所以必须设定destory-method=“close”属性,以便spring容器关闭时,数据源能够正常关闭。常见属性:

    defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true; 
    defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false; 
    maxActive:最大连接数据库连接数,设置为0时,表示没有限制。连接池中可同时连接的最大的连接数(默认值为8); 
    maxIdle:最大等待连接中的数量,设置为0时,表示没有限制; 
    minIdle:连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的);
    maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息; 
    validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据, 如你可以简单地设置为:“select count(*) from user”; 
    removeAbandoned:是否自我中断,默认是 false ; 
    removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值; 
    logAbandoned:是否记录中断事件, 默认为 false;
    initialSize :连接池启动时创建的初始化连接数量( 默认值为0)

 

3、c3po

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">           <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/>           <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/>           <property name="user" value="admin"/>           <property name="password" value="1234"/>       </bean>

    acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目; 
    acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30; 
    acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000; 
    autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚。默认为false;    
    checkoutTimeout:当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0; 
    idleConnectionTestPeriod:隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查; 
    initialPoolSize:初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3; 
    maxIdleTime:最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0; 
    maxPoolSize:连接池中保留的最大连接数。默认为15; 
    maxStatements:JDBC的标准参数,用以控制数据源内加载的PreparedStatement数量。但由于预缓存的Statement属 于单个Connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素,如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭。默认为0; 
    maxStatementsPerConnection:连接池内单个连接所拥有的最大缓存Statement数。默认为0; 
    numHelperThreads:C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3; 
    preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个参数能显著提高测试速度。测试的表必须在初始数据源的时候就存在。默认为null; 
    propertyCycle: 用户修改系统配置参数执行前最多等待的秒数。默认为300;

 

5、spring的数据源实现类

spring本身也提供了一个简单的数据源实现DriverManagerDataSource,它位于org.springframework.jdbc.datasource包中。这个类实现了javax.sql.DataSource接口,但 它并没有提供池化连接的机制,每次调用getConnection()获取新连接时,只是简单地创建一个新的连接。因此,这个数据源类比较适合在单元测试 或简单的独立应用中使用,因为它不需要额外的依赖类。

DriverManagerDataSource ds = new DriverManagerDataSource ();       ds.setDriverClassName("com.mysql.jdbc.Driver");       ds.setUrl("jdbc:mysql://localhost:3309/sampledb");       ds.setUsername("root");       ds.setPassword("1234");       Connection actualCon = ds.getConnection(); 

 

6、HibernateDaoSupport 和 HibernateTemplate

spring如果想整合hibernate,首先应该获得SessionFactory这个类,然后通过获得的session对数据库进行访问。即spring提供的类HibernateDaoSupport和HibernateTemplate应该是有setSessionFactory,在使用的时候注入下就ok了:

<bean id="cfgSessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    <property name="dataSource" ref="cfgDataSource"/>    <property name="hibernateProperties">        <props>           <prop key="hibernate.dialect">${bl3.order.dal.hibernate.cfg.dialect}</prop>           <prop key="hibernate.jdbc.batch_size">${bl3.order.dal.hibernate.cfg.jdbc.batch_size}</prop>           <prop key="hibernate.show_sql">${bl3.order.dal.hibernate.cfg.show_sql}</prop>           <prop key="hibernate.generate_statistics">${bl3.order.dal.hibernate.cfg.generate_statistics}</prop>        </props>    </property>    <property name="packagesToScan">        <list>           <value>com.sdo.bl3.order.dal.cfg.model</value>        </list>    </property></bean>

 

原创粉丝点击