百度云(BAE)数据库连接问题-yellowcong

时间:2022-05-16 07:08:52

百度云在数据库连接上,做了限制,使用的是短连接,减少资源的消耗,30秒不用,就直接断开了,这样就会导致java的连接池就不好用了,解决办法是通过计时器每隔多长时间访问一次,让连接池里面一直有连接

百度云(BAE)数据库连接问题-yellowcong

数据库连接池配置

数据库配置的连接配置,需要到BAE上,找到我们需要连接的数据库,然后找到我们的数据库账户和密码

百度云(BAE)数据库连接问题-yellowcong

百度云(BAE)数据库连接问题-yellowcong

数据库的账户和密码
百度云(BAE)数据库连接问题-yellowcong

jdbc-config-local.properties

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://sqld.duapp.com:4050/UMdSqranbtODJbYVTACF
username=ec76852a7b9840adbc18ae3a8603e23d(Access Kye)
password=xiangzhidaomimabajiubugaosuni(Secreat Kye)

ApplicationContext.xml

ApplicationContext.xml文件,采用的是c3p0的数据库连接池,我们采用的quartz这个框架,进行数据库连接的维护,这个是微信的job,不是我当时做百度的代码,当时我做的使用的是TimerTask这个类,进行的定时任务

<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd"
>

<!-- 通过我们 注释所表示的是可选配置的方式-->

<!-- 开启我们的注解 ,有时候 找不到类,我们可以在后面添加 * 表示所遇的包-->
<context:annotation-config/>
<context:component-scan base-package="com.yellowcong.*"/>

<!-- 其中我们可以通过properties
后面你有个神奇的空格
设定数据库的一些属性 -->

<context:property-placeholder location="classpath:jdbc-config-local.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driverClassName}"/>
<property name="jdbcUrl" value="${url}"/>
<property name="user" value="${username}"/>
<property name="password" value="${password}"/>
<!-- 链接池启动的初始值 -->
<property name="initialPoolSize" value="5"/>
<!-- 设定最大的请求连接 -->
<property name="maxPoolSize" value="500"/>
<!-- 最小的空闲值当空闲的连接数目比较 -->
<property name="minPoolSize" value="1"/>
<!--最大空闲值,超过60秒钟没有用就默认关闭, 默认值为 0 -->
<property name="maxIdleTime" value="0"/>
<!-- 连接数没有了的时候,获取的连接输 默认是 3 我们可以设定 -->
<property name="acquireIncrement" value="5"/>
<!-- 自动回收超时连接 -->
<property name="unreturnedConnectionTimeout" value="1"/>

<!--连接时间最长为10s ,超过了10s就自动收回了 -->
<property name="maxIdleTimeExcessConnections" value="10"/>
<!--最长回收时间-->
<property name="maxConnectionAge" value="10"/>
</bean>

<!-- 配置SessionFacrory ,其中我们是基于xml 配置使用LocalSessionFactoryBean这个类-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan">
<value>com.yellowcong.model</value>
</property>
<!-- 配置一些SQL数据 这个以前是在hibernate.cfg.xml中配置的数据-->
<property name="hibernateProperties">
<!-- 第二种设定值的方式 -->
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">false</prop>
</props>
</property>
</bean>

<!-- 配置Spring的事物处理 -->
<!-- 创建事物管理器对象 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置Aop Spring 是通过Aop 来进行事物管理的 -->
<aop:config>
<!-- 设定事物 -->
<aop:pointcut id="allMethod" expression="execution(* com.yellowcong.dao.impl.*.*(..))"/>
<!-- 确定需要调用的方法 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="allMethod"/>
</aop:config>

<!-- 导入tx 事物管理,配置事物管理 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 这个是所有的方法都加入事物管理 -->
<tx:method name="*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

<!-- 需要执行的job -->
<bean id="weixinJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="com.yellowcong.weixin.quartz.TokenRefreshJob"/>
<property name="jobDataAsMap">
<map>
<entry key="refreshTokenTask">
<ref bean="refreshTokenTask"/>
</entry>
</map>
</property>
</bean>
<!-- 触发器 -->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<!-- 需要启动的Job -->
<property name="jobDetail" ref="weixinJob"/>
<!-- 第一次执行的时间 单位是ms-->
<property name="startDelay" value="1000"/>
<!-- 重复执行的间隔时间 -->
<!-- 设定1小时获取一次token -->
<property name="repeatInterval" value="3600000"/>
</bean>

<!-- 启动触发器 -->
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref local="weixinJob" />
</list>
</property>
<property name="triggers">
<list>
<ref local="simpleTrigger" />
</list>
</property>
</bean>
</beans>

quartz定时任务

我们刚刚在Spring配置文件ApplicationContext.xml中写到的定时任务,我们需要建立Job(需要继承QuartzJobBean)和Task(需要在Spring中配置Bean,我做的是基于Annotation的方式)

百度云(BAE)数据库连接问题-yellowcong

RefreshTokenTask.java

这个Task类,是定时任务的类容,我们需要做的定时任务,都在这个地方操作,其中数据库连接定时刷新,也可以在这个地方做。

package com.yellowcong.weixin.quartz;

import org.springframework.stereotype.Component;

import com.yellowcong.weixin.model.AccessToken;
import com.yellowcong.weixin.model.WeixinValues;
import com.yellowcong.weixin.utils.TokenUtils;

/**
* 微信刷新Token的任务
* @author yellowcong
*
*/

@Component("refreshTokenTask")
public class RefreshTokenTask {

public void refreshToken(){
//System.out.println("刷新Token");
AccessToken token = TokenUtils.getToken();
//获取Token
WeixinValues.ACCESS_TOKEN = token.getAccess_token();
}
}

TokenRefreshJob

这个类需要继承QuartzJobBean ,复写executeInternal方法

package com.yellowcong.weixin.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* 微信获取Token的触发器
* @author yellowcong
*
*/

public class TokenRefreshJob extends QuartzJobBean {

//注入执行的任务
private RefreshTokenTask refreshTokenTask;

public void setRefreshTokenTask(RefreshTokenTask refreshTokenTask) {
this.refreshTokenTask = refreshTokenTask;
}

@Override
protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
// TODO Auto-generated method stub
//调用Task中的方法
this.refreshTokenTask.refreshToken();
}

}