天天看点

通过连接池和字段索引,提升单点登录cas的性能为cas添加Connection Pool连接池配置Oracle的Connection Pool为查询字段创建索引小结

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的连接池,说白了就是两块缓冲区,提前创建好对象或者保留已经创建的对象,用的时候少去了创建的时间,提高了复用性。

索引,就像一本书的目录,是快速锁定目标的有效途径,因为有了目录或者索引,查询时间的长短跟内容多少无关,只取决于找到索引的时间。

继续阅读