是否能用单例建立一个数据库连接,有什么大漏洞

是否能用单例建立一个数据库连接

将数据库连接用一个bean实现,不是每次都new一个,但是这样的话项目启动后默认单例的,那么所有数据库请求都会用这个连接,这会有问题么,特别再请求量很大时

相关代码

// 注册一个bean
@Bean
public InfluxDbTemplate influxDbTemplate() {
    return new InfluxDbTemplate(
            iotInfluxDbProperties.getUsername(),
            iotInfluxDbProperties.getPassword(),
            iotInfluxDbProperties.getOpenUrl(),
            iotInfluxDbProperties.getDatabase(),
            iotInfluxDbProperties.getRetentionPolicy());
}

这个对象:

public class InfluxDbTemplate {
    private String username;
    private String password;
    private String openUrl;
    private InfluxDB influxDB;
    
    public InfluxDbTemplate(String username, String password, String openUrl) {
    this.username = username;
    this.password = password;
    this.openUrl = openUrl;
    influxDbBuild();
}
    // 建立数据库连接
    public InfluxDB influxDbBuild() {
    if (influxDB == null) {
        influxDB = InfluxDBFactory.connect(openUrl, username, password);
    }
    return influxDB;
}

}

以上这种方式,哪里用到操作数据库就 @Autowired进来,虽然用起来很方便,但是不知道有什么问题,还有操作数据库后要不要调用close方法下

有没有大侠可以解答下,给点建议

阅读 3.3k
5 个回答

所有网络资源的连接,如果使用在多线程环境,我没见过把连接作为单例的,都是连接池作为单例,连接是按需生成的。
原因在于,多线程环境下,如果不对这个单例做访问控制,后果很严重。线程1刚发送完请求,线程2拿到这个响应会出现什么问题?或者说两个线程同时往1个TCP连接发数据会有什么问题?

不了解InfluxDB,如果InfluxDB允许一个应用使用一个连接,并且线程安全,并且能长时间保持连接不超时,单例应该就没问题。

如果你的目标是降低数据库压力,减少应用吞吐量,限制应用处理能力,让你的CPU更轻闲一些,内存少用一些,你这么做是能达到目的的。

一些数据库的连接其实是伪连接,比如基于 HTTP 的,基于 UDP 的。这种连接对象单例长期持有没问题。

剩下的就不行了,Spring 处理它的方式就是连接池,比如 MyBatis,Session对象是连接,那么SessionFactoryBean就是池子了。你getSession的时候不一定新建也不一定不新建,都是池子控制的。

数据库请求简化一下就是“拿到链接”——>“发送请求”——>“处理请求”——>“返回结果”,日过只有一个链接可用当数据量大的话肯定会慢的,而且如果使用的线程多的话为了保证线程安全必定会引起阻塞。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题