cas是多个系统的中心认证,认证的过程就是用户的登录信息和数据库中的信息匹对的过程,如果某一时刻登录的人数很多,需要频繁的读取数据库,数据库连接的管理就是问题。
前天测试评教时无意之中把单点登录的问题暴露出来了,平时通过cas登录管理端是没有问题的,而200人同时通过cas登陆学生端时出现异常
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Listener refused the connection。。。
而我在实现单点登录时,重点放在了实现,没有考虑具体应用的场景,所以说做的应用一定要投入到实际使用中,否则永远停留在理想的学习使用中。
解决问题固然重要,更重要的是发现问题。看到错误提示信息,很明显的说明了Connection资源有限,于是做了如下优化:
为cas添加Connection
Pool连接池。
配置Oracle的Connection
Pool。(数据库使用的是Oracle,而Oracle默认是不开启连接池的)
为频繁的查询字段创建索引
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。
无论是DBCP还是C3P0,配置都差不多,因为连接池的属性是通用的。这里以C3P0为例,配置在cas的deployerConfigContext.xml中
在tomcat的/webapps/cas/WEB-INF/deployerConfigContext.xml添加以下内容:
在tomcat的\webapps\cas\WEB-INF目录下新建两个文件,分别是jdbc.properties和c3p0.properties,内容如下:
Jdbc.properties代码
C3p0.properties代码
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代码
让应用启动的时候加载jdbc.properties和c3p0.properties文件。
目前Oracle只支持一个连接池,pool name缺省为“SYS_DEFAULT_CONNECTION_POOL”,管理连接池信息的也就一个包“DBMS_CONNECTION_POOL”,也就意味着必须以DBA的角色来操作。
先看看DBMS_CONNECTION_POOL的相关说明:
包括5个存储过程。
SYS_DEFAULT_CONNECTION_POOL,但是并没有被打开,需要显示的开启连接池。
第一步当然就是开启连接池:
打开了连接池之后可以通过系统视图dba_cpool_info进行查询:
当连接池启动了之后,可以通过DBMS_CONNECTION_POOL.CONFIGURE_POOL来查看连接池的相关配置项。
参数说明:
参数
说明
MINSIZE
在pool中最小数量的pooled servers,缺省为4
MAXSIZE
在pool中最大数量的pooled servers,缺省为40
INCRSIZE
这个参数是在一个客户端应用需要连接的时候,当pooled servers不可用的状态时候,每次pool增加pooled servers的数目。
SESSION_CACHED_CURSORS
缓存在每个pooled servers上的会话游标的数目,缺省为20
INACTIVITY_TIMEOUT
pooled server处于idle状态的最大时间,单位秒,超过这个时间,the server将被停止。缺省为300.
MAX_THINK_TIME
在一个客户端从pool中获得一个pooled server之后,如果在MAX_THINK_TIME时间之内没有提交数据库调用的话,这个pooled server将被释放,客户端连接将被停止。缺省为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对连接池的设置进行修改。
先来看看参数信息:
由于只有一个连接池,第一个参数的值可以省略。
系统中有几个系统视图比较有用:
DBA_CPOOL_INFO 这个视图包含着连接池的状态
V$CPOOL_STATS 这个视图包含着连接池的统计信息
V$CPOOL_CC_STATS 这个视图包含着池的连接类型级别统计
修改成功了之后可以查询下连接池信息:
到此,连接池的设置和相关修改已经完成。
首先,查看目前已经建立的索引
可以看到只有系统给主键自动建立的索引:SYS_C55001
为频繁的查询字段建立索引(学生表中有近3万条数据)。
这里创建的非聚集索引,如果使用聚集索引的话,因为其中键值的逻辑顺序决定了表中相应行的物理顺序,查询的速度的确更快,但是对于增删改的操作会很慢,所以当创建聚集索引时要慎重。
索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。更多关于聚集索引可以参考
无论是Oracle的连接池还是Java的连接池,说白了就是两块缓冲区,提前创建好对象或者保留已经创建的对象,用的时候少去了创建的时间,提高了复用性。
索引,就像一本书的目录,是快速锁定目标的有效途径,因为有了目录或者索引,查询时间的长短跟内容多少无关,只取决于找到索引的时间。