- 为cas加入Connection Pool连接池。
- 配置Oracle的Connection Pool。(数据库使用的是Oracle,而Oracle默认是不开启连接池的)
- 为频繁的查询字段创建索引
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连接池
数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当须要建立数据库连接时,仅仅需从“缓冲池”中取出一个,使用完成之后再放回去。
不管是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的webappscasWEB-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代码