重试失败的JDBC连接

时间:2016-11-28 19:58:10

标签: java spring jdbc

我使用Spring在Application.java中配置Connection bean,如下所示:

@Bean
public Connection getConnection(
        @Value("${sqlserver.host}") String host,
        @Value("${sqlserver.user}") String user,
        @Value("${sqlserver.password}") String password,
        @Value("${sqlserver.dbname}") String dbname){
    try {
        return DriverManager.getConnection(String.format("jdbc:jtds:sqlserver://%s:1433;instance=MSSQLSERVER;DatabaseName=%s", host, dbname), user, password);
    }catch(Exception ex){
        System.out.println(ex.getMessage());
    }

    return null;
}

在我的控制器中,我自动连接此连接。 同样在我的控制器中,我调度了以一定时间间隔运行的方法,并使用此自动有线连接获取数据。 我的问题是: 如何在已调度的方法中关闭连接,因为当我关闭连接时,下次运行调度的方法时,连接为空。如果连接为空,我该如何重试连接。

解决这个问题的正确策略是什么?

1 个答案:

答案 0 :(得分:1)

Spring正在提供一个非常基本的SingleConnectionDataSource 根据文档that wraps a single Connection that is not closed after each use。在同一文档中,还提到这主要是一个测试类。要遵循您的方法签名

@Bean
public DataSource dataSource( 
        @Value("${sqlserver.host}") String host,
        @Value("${sqlserver.user}") String user,
        @Value("${sqlserver.password}") String password,
        @Value("${sqlserver.dbname}") String dbname)) {

  SingleConnectionDataSource dataSource = new SingleConnectionDataSource();
  dataSource.setSuppressClose(true);
  dataSource.setUrl(String.format("jdbc:jtds:sqlserver://%s:1433;instance=MSSQLSERVER;DatabaseName=%s", host, dbname));
  dataSource.setUsername(user);
  dataSource.setPassword(password);
  return dataSource;
}

There is a dedicated section in the Documentation介绍了如何设置生产就绪的C3P0DBCP数据库连接池。直接从上述文档引用:

DBCP配置

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>

<context:property-placeholder location="jdbc.properties"/>

C3P0配置:

<bean id="dataSource" 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}"/>
</bean>

<context:property-placeholder location="jdbc.properties"/>