cas是多个系统的中心认证,认证的过程就是用户的登录信息和数据库中的信息匹对的过程,假设某一时刻登录的人数非常多,须要频繁的读取数据库,数据库连接的管理就是问题。

    前天測试评教时无意之中把单点登录的问题暴露出来了,平时通过cas登录管理端是没有问题的,而200人同一时候通过cas登陆学生端时出现异常

    org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Listener refused the connection。。。

    而我在实现单点登录时,重点放在了实现,没有考虑详细应用的场景,所以说做的应用一定要投入到实际使用中,否则永远停留在理想的学习使用中。

    解决这个问题固然重要,更重要的是发现问题。看到错误提示信息,非常明显的说明了Connection资源有限,于是做了例如以下优化:

    1. 为cas加入�Connection
      Pool连接池。
    2. 配置Oracle的Connection
      Pool。(数据库使用的是Oracle,而Oracle默认是不开启连接池的)
    3. 为频繁的查询字段创建索引

    为cas加入�Connection Pool连接池

    数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当须要建立数据库连接时,仅仅需从“缓冲池”中取出一个,使用完成之后再放回去。

    不管是DBCP还是C3P0,配置都差点儿相同,由于连接池的属性是通用的。这里以C3P0为例,配置在cas的deployerConfigContext.xml中

    在tomcat的/webapps/cas/WEB-INF/deployerConfigContext.xml加入�下面内容:

    <span style="font-size:18px;"><bean id="casDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}" />
    <property name="jdbcUrl" value="${jdbc.url}" />
    <property name="user" value="${jdbc.username}" />
    <property name="password" value="${jdbc.password}" />
    <!-- 最大连接数 -->
    <property name="maxPoolSize" value="${hibernate.c3p0.max_size}" />
    <!-- 最小连接数 -->
    <property name="minPoolSize" value="${hibernate.c3p0.min_size}" />
    <!-- 初始化连接数 -->
    <property name="initialPoolSize" value="${hibernate.c3p0.initial_pool_size}" />
    <!-- 最大空暇时间 ,120秒内未使用则连接被丢弃。若为0则永不丢弃 -->
    <property name="maxIdleTime" value="${hibernate.c3p0.max_idle_time}" />
    <!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
    <property name="acquireIncrement" value="${hibernate.c3p0.acquire_increment}" />
    <!-- 最大的PreparedStatement的数量 -->
    <property name="maxStatements" value="${hibernate.c3p0.max_statements}" />
    <!-- 每隔120秒检查连接池里的空暇连接-->
    <property name="idleConnectionTestPeriod" value="${hibernate.c3p0.idle_test_period}" />
    <!-- 假设设为true那么在取得连接的同一时候将校验连接的有效性 。Default: false -->
    <property name="testConnectionOnCheckin" value="${hibernate.c3p0.test_connection_on_checkin}" />
    <!--定义在从数据库获取新连接失败后反复尝试的次数。Default: 30 -->
    <property name="acquireRetryAttempts" value="${hibernate.c3p0.acquire_retry_attempts}" />
    <!--连接关闭时默认将全部未提交的操作回滚。Default: false -->
    <property name="autoCommitOnClose" value="${hibernate.c3p0.auto_commit_on_close}"/>
    <!--获取连接失败将会引起全部等待连接池来获取连接的线程抛出异常。可是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。
    假设设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false-->
    <property name="breakAfterAcquireFailure" value="${hibernate.c3p0.break_after_acquire_failure}" />
    <!--c3p0是异步操作的,缓慢的JDBC操作通过帮助进程完毕。扩展这些操作能够有效的提升性能通过多线程实现多个操作同一时候被运行。Default: 3-->
    <property name="numHelperThreads" value="${hibernate.c3p0.num_helper_threads}" />
    <!--当连接池用完时client调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。Default: 0 -->
    <property name="checkoutTimeout" value="${hibernate.c3p0.checkout_timeout}" />
    </bean> </span>

    在tomcat的\webapps\cas\WEB-INF文件夹下新建两个文件,各自是jdbc.properties和c3p0.properties,内容例如以下:

    Jdbc.properties代码

    <span style="font-size:18px;">## MySQL  
    
    #jdbc.driverClassName=com.mysql.jdbc.Driver
    #jdbc.url=jdbc:mysql://10.5.227.125:3306/dcsso?#useUnicode=true&characterEncoding=utf-8
    #jdbc.username=root
    #jdbc.password=root ## Oracle jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
    jdbc.url=jdbc:oracle:thin:@192.168.24.46:1521:orcl
    jdbc.username=gxpt_jc
    jdbc.password=gxpt_jc</span>

    C3p0.properties代码

    <span style="font-size:18px;">###########################
    ### C3P0 Connection Pool###
    ###########################
    hibernate.c3p0.max_size 60
    hibernate.c3p0.min_size 2
    hibernate.c3p0.initial_pool_size 3
    hibernate.c3p0.max_idle_time 120
    hibernate.c3p0.acquire_increment 2
    hibernate.c3p0.max_statements 100
    hibernate.c3p0.idle_test_period 120
    hibernate.c3p0.test_connection_on_checkin true
    hibernate.c3p0.acquire_retry_attempts 30
    hibernate.c3p0.auto_commit_on_close false
    hibernate.c3p0.break_after_acquire_failure false
    hibernate.c3p0.num_helper_threads 3
    hibernate.c3p0.checkout_timeout 30000
    hibernate.c3p0.validate true </span>

    c3p0须要jar包的支持,c3p0-0.9.1.jar、commons-collections-3.2.1.jar、commons-pool-1.5.4.jar

    在tomcat的\webapps\cas\WEB-INF\spring-configuration文件夹下找到propertyFileConfigurer.xml文件,改动例如以下:

    Propertyfileconfigurer.xml代码

    <span style="font-size:18px;"><?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <description>
    This file lets CAS know where you've stored the cas.properties file which details some of the configuration options
    that are specific to your environment. You can specify the location of the file here. You may wish to place the file outside
    of the Servlet context if you have options that are specific to a tier (i.e. test vs. production) so that the WAR file
    can be moved between tiers without modification.
    </description> <!--
    <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
    p:location="/WEB-INF/cas.properties" /> --> <bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="locations">
    <list>
    <value>/WEB-INF/cas.properties</value>
    <value>/WEB-INF/jdbc.properties</value>
    <value>/WEB-INF/c3p0.properties</value>
    </list>
    </property>
    </bean>
    </beans> </span>

    让应用启动的时候载入jdbc.properties和c3p0.properties文件。

    配置Oracle的Connection Pool

    眼下Oracle仅仅支持一个连接池,pool name缺省为“SYS_DEFAULT_CONNECTION_POOL”,管理连接池信息的也就一个包“DBMS_CONNECTION_POOL”,也就意味着必须以DBA的角色来操作。

    先看看DBMS_CONNECTION_POOL的相关说明:

    <span style="font-size:18px;">SQL> desc DBMS_CONNECTION_POOL
    Element Type
    ---------------- ---------
    ALTER_PARAM PROCEDURE
    CONFIGURE_POOL PROCEDURE
    RESTORE_DEFAULTS PROCEDURE
    START_POOL PROCEDURE
    STOP_POOL PROCEDURE</span>

    包含5个存储过程。

    SYS_DEFAULT_CONNECTION_POOL,可是并没有被打开,须要显示的开启连接池。

    第一步当然就是开启连接池:

    <span style="font-size:18px;">exec DBMS_CONNECTION_POOL.START_POOL('SYS_DEFAULT_CONNECTION_POOL');</span>

    打开了连接池之后能够通过系统视图dba_cpool_info进行查询:

    <span style="font-size:18px;">SQL> select connection_pool,status from dba_cpool_info;
    
    CONNECTION_POOL                                                                  STATUS
    -------------------------------------------------------------------------------- ----------------
    SYS_DEFAULT_CONNECTION_POOL ACTIVE</span>

    当连接池启动了之后,能够通过DBMS_CONNECTION_POOL.CONFIGURE_POOL来查看连接池的相关配置项。

    <span style="font-size:18px;">SQL> desc DBMS_CONNECTION_POOL.CONFIGURE_POOL
    Parameter Type Mode Default?
    ---------------------- -------------- ---- --------
    POOL_NAME VARCHAR2 IN Y
    MINSIZE BINARY_INTEGER IN Y
    MAXSIZE BINARY_INTEGER IN Y
    INCRSIZE BINARY_INTEGER IN Y
    SESSION_CACHED_CURSORS BINARY_INTEGER IN Y
    INACTIVITY_TIMEOUT BINARY_INTEGER IN Y
    MAX_THINK_TIME BINARY_INTEGER IN Y
    MAX_USE_SESSION BINARY_INTEGER IN Y
    MAX_LIFETIME_SESSION BINARY_INTEGER IN Y </span>

    參数说明:

    參数

    说明

    MINSIZE

    在pool中最小数量的pooled servers,缺省为4

    MAXSIZE

    在pool中最大数量的pooled servers,缺省为40

    INCRSIZE

    这个參数是在一个client应用须要连接的时候,当pooled servers不可用的状态时候,每次pool添加�pooled servers的数目。

    SESSION_CACHED_CURSORS

    缓存在每一个pooled servers上的会话游标的数目,缺省为20

    INACTIVITY_TIMEOUT

    pooled server处于idle状态的最大时间,单位秒,超过这个时间,the server将被停止。缺省为300.

    MAX_THINK_TIME

    在一个client从pool中获得一个pooled server之后,假设在MAX_THINK_TIME时间之内没有提交数据库调用的话,这个pooled server将被释放,client连接将被停止。缺省为30,单位秒

    MAX_USE_SESSION

    pooled server可以在pool上taken和释放的次数,缺省为5000

    MAX_LIFETIME_SESSION

    The time, in seconds, to live for a pooled server in the pool. The default value is 3600.

    一个pooled server在pool中的生命值。

    能够使用DBMS_CONNECTION_POOL.CONFIGURE_POOL或DBMS_CONNECTION_POOL.ALTER_PARAM对连接池的设置进行改动。

    先来看看參数信息:

    <span style="font-size:18px;">SQL>  desc DBMS_CONNECTION_POOL.ALTER_PARAM
    Parameter Type Mode Default?
    ----------- -------- ---- --------
    POOL_NAME VARCHAR2 IN Y
    PARAM_NAME VARCHAR2 IN
    PARAM_VALUE VARCHAR2 IN
    SQL> exec DBMS_CONNECTION_POOL.ALTER_PARAM ('','minsize','10'); PL/SQL procedure successfully completed SQL> exec DBMS_CONNECTION_POOL.ALTER_PARAM ('','maxsize','100'); PL/SQL procedure successfully completed</span>

    因为仅仅有一个连接池,第一个參数的值能够省略。

    系统中有几个系统视图比較实用:

    DBA_CPOOL_INFO          这个视图包括着连接池的状态

    V$CPOOL_STATS             这个视图包括着连接池的统计信息

    V$CPOOL_CC_STATS       这个视图包括着池的连接类型级别统计

    改动成功了之后能够查询下连接池信息:

    <span style="font-size:18px;">SQL> select CONNECTION_POOL, STATUS,MINSIZE,MAXSIZE from DBA_CPOOL_INFO;
    
    CONNECTION_POOL                                                                  STATUS              MINSIZE    MAXSIZE
    -------------------------------------------------------------------------------- ---------------- ---------- ----------
    SYS_DEFAULT_CONNECTION_POOL ACTIVE 10 100</span>

    到此,连接池的设置和相关改动已经完毕。

    为查询字段创建索引

    首先,查看眼下已经建立的索引

    <span style="font-size:18px;">select * from user_indexes where table_name = ‘TB_STUDENT’; </span>

    能够看到仅仅有系统给主键自己主动建立的索引:SYS_C55001

为频繁的查询字段建立索引(学生表中有近3万条数据)。

    <span style="font-size:18px;">create index student_code_idx on tb_student(student_code);  </span>

    这里创建的非聚集索引,假设使用聚集索引的话,由于当中键值的逻辑顺序决定了表中对应行的物理顺序,查询的速度的确更快,可是对于增删改的操作会非常慢,所以当创建聚集索引时要谨慎。

    索引是通过二叉树的数据结构来描写叙述的,我们能够这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,仅仅只是有一个指针指向相应的数据块。很多其它关于聚集索引能够參考http://www.cnblogs.com/aspnethot/articles/1504082.html

    小结

    不管是Oracle的连接池还是Java的连接池,说白了就是两块缓冲区,提前创建好对象或者保留已经创建的对象,用的时候少去了创建的时间,提高了复用性。

    索引,就像一本书的文件夹,是高速锁定目标的有效途径,由于有了文件夹或者索引,查询时间的长短跟内容多少无关,仅仅取决于找到索引的时间。

通过连接池和字段索引,提升单点登录cas的性能的更多相关文章

  1. cas sso单点登录系列7_ 单点登录cas常见问题系列汇总

    转:http://blog.csdn.net/matthewei6/article/details/50709252 单点登录cas常见问题(一) - 子系统是否还要做session处理?单点登录ca ...

  2. 单点登录CAS使用记(一):前期准备以及为CAS-Server配置SSL协议

    知识点: SSO:单点登录(Single Sign On),是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. CAS:耶 ...

  3. 单点登录CAS使用记(三):实现自定义验证用户登录

    问题: CAS自带的用户验证逻辑太过简单,如何像正常网站一样,通过验证DB中的用户数据,来验证用户以及密码的合法性呢? 方案1:CAS默认的JDBC扩展方案: CAS自带了两种简单的通过JDBC方式验 ...

  4. 单点登录CAS使用记(四):为登录页面加上验证码

    CAS默认的登录页面样式如下,只有用户名与密码两项验证项目. 现在需要为首页登录加上验证码功能. 第一步:首页对默认登录页面的样式进行了调整,使其看上去还算美观. 在页面上加上了验证码项目. 第二步: ...

  5. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

  6. 单点登录CAS使用记(五):cas-client不拦截静态资源以及无需登录的请求。

    一.问题在哪? 在配置cas-client中,有这么一段配置: <filter> <filter-name>CAS Filter</filter-name> < ...

  7. 单点登录CAS使用记(六):单点登出、单点注销

    单点登出基本上没有啥配置 直接在原来logout的时候,重定向到Cas-Server的logout方法 @RequestSecurity @RequestMapping(value = "l ...

  8. 单点登录CAS使用记(七):关于服务器超时以及客户端超时的分析

    我的预想情况 一般情况下,当用户登录一个站点后,如果长时间没有发生任何动作,当用户再次点击时,会被强制登出并且跳转到登录页面, 提醒用户重新登录.现在我已经为站点整合了CAS,并且已经实现了单点登录以 ...

  9. 单点登录CAS使用记(八):使用maven的overlay实现无侵入的改造CAS

    前期在学习CAS部署的过程中,都是网上各种教程,各种方案不停的尝试. 期间各种侵入改源码,时间久了,改了哪个文件,改了哪段配置,增加了哪段代码,都有可能混淆不清了. 而且最大的问题是,万一换个人来维护 ...

随机推荐

  1. mysql 日期操作 增减天数、时间转换、时间戳(转换)

    http://hi.baidu.com/juntao_li/item/094d78c6ce1aa060f6c95d0b MySQL datediff(date1,date2):两个日期相减 date1 ...

  2. Linux系统运维笔记(一),查看系统版本和设置系统时间

    Linux系统运维笔记 查看系统版本和设置系统时间 查看系统版本 lsb_release -a (适用于所有的linux,包括Redhat.SuSE.Debian等发行版,但是在debian下要安装l ...

  3. 【转载】Java是传值还是传引用

    1. 简单类型是按值传递的 Java 方法的参数是简单类型的时候,是按值传递的 (pass by value).这一点我们可以通过一个简单的例子来说明: /* 例 1 */ /** * @(#) Te ...

  4. Selenium Webdriver概述(转)

    Selenium Webdriver https://www.yiibai.com/selenium/selenium_overview.html# webdriver自动化俗称Selenium 2. ...

  5. hdu 3033(好题,分组背包)

    I love sneakers! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  6. 基于图文界面的蓝牙扫描工具btscanner

    基于图文界面的蓝牙扫描工具btscanner   btscanner是Kali Linux内置的一款蓝牙扫描工具.它提供图文界面,更便于渗透测试人员查看扫描信息.该工具会自动使用主机所有的蓝牙接口,并 ...

  7. 以管理员身份运行CMD

    To complete these procedures, you must be a member of the Administrators group. To start a command p ...

  8. FTP传输一定要注意使用二进制模式

    一个问题困扰了我一下午,刚刚才解决.我要上传一个PHP程序,其中用了sqlite数据库,没想到上传完以后无论如何也不能用,总是数据库查询失败.我登录上SSH,把几乎每个php都调试了一遍,还是没法解决 ...

  9. poj 2253 最短路floyd **

    题意:有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第一个和第二个坐标,现在A青蛙想要到B青蛙那里去,并且A青蛙可以借助任意石头的跳跃,而从A到B有若干通路,问从A到B的 ...

  10. bzoj 2209 括号序列

    反转操作 + 翻转操作 = 对称操作 因为上面三个操作都是自己的逆操作,所以我们只需要实现对称操作和反转操作,就可以搞定翻转操作. #include <cstdio> #include & ...