2016-11-28 134 views
1

我使用Spring进行如下配置Application.java一个连接豆:重试失败的JDBC连接

@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

使用连接池,这就是他们被发明的东西。 – dunni

回答

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 DB连接池是生产就绪。直接从上面的文档引用:

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"/> 
+0

这个实现是否关注关闭连接?重新打开连接并在连接失败时重试 – StephCurry3093

+0

假设我使用DriverManagerDataSource – StephCurry3093

+0

打开到数据库的连接是一项昂贵的操作。数据库连接池(如DBCP,DBCP2,C3P0,Hikari,Tomcat)具有自己的命名参数,以保持initSize(启动时打开的连接数),maxIdle,maxSize(= active)等信息。请参阅数据库连接你打算用来查看这些参数的池以及它们的默认值是什么。这是DBCP的配置页面:http://commons.apache.org/proper/commons-dbcp/configuration.html – dimitrisli