当前位置: 首页 > 知识库问答 >
问题:

需要使用Spring和Dbcp连接池进行数据库调优的输入

楮阳
2023-03-14

我在我的项目中使用Spring,并如下所示实例化dataSource。

@Bean(destroyMethod="close")
    public DataSource restDataSource() {

        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(env.getProperty("hibernate.connection.driver_class"));
        dataSource.setUrl(env.getProperty("hibernate.connection.url"));
        dataSource.setUsername(env.getProperty("hibernate.connection.username"));
        dataSource.setPassword(env.getProperty("hibernate.connection.password"));
        dataSource.setInitialSize(env.getRequiredProperty("hibernate.dbcp.initialSize", Integer.class));
        dataSource.setMaxActive(env.getRequiredProperty("hibernate.dbcp.maxActive", Integer.class));
        dataSource.setMaxIdle(env.getRequiredProperty("hibernate.dbcp.maxIdle", Integer.class));
        dataSource.setMinIdle(env.getRequiredProperty("hibernate.dbcp.minIdle", Integer.class));
        return dataSource;
    }
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
hibernate.connection.username=<>
hibernate.connection.password=<>
hibernate.connection.url=jdbc:oracle:thin:@<Host>:1521:<SID>
hibernate.show_sql=true

hibernate.cache.use_query_cache=true
cache.provider_class=org.hibernate.cache.EhCacheProvider
hibernate.cache.use_second_level_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
net.sf.ehcache.configurationResourceName=ehcache.xml
**hibernate.dbcp.initialSize=10
hibernate.dbcp.maxActive=100
hibernate.dbcp.maxIdle=30
hibernate.dbcp.minIdle=10**
  1. 用粗体标记的属性中的任何更改(initialSize、maxActive、maxidle、minIdle)。我的应用程序将被大约100个用户同时使用,总用户约为3000人。
  2. 我正在使用Tomcat服务器来部署我的应用程序。我应该使用JNDI来连接而不是直接指定连接属性吗?以上使用连接的方法是否适用于生产系统?

共有1个答案

吕自怡
2023-03-14

我建议使用HikariCP而不是Commons DBCP(我最近对此有很好的体验,或者如果您已经使用tomcat,请使用tomcat JDBC。

这里有很多关于池大小的文章(请看这里有一个很好的解释,这里有一个来自Oracle的短视频)。简而言之,大池不起作用,而且可能会使性能变差。

一个经验法则/公式(也在提到的文章中)是使用

连接=((core_count*2)+effective_spindle_count)

其中core_count是服务器中的(实际)核心数,effective_spindle_count是您拥有的磁盘数。如果您的服务器有一个大磁盘和4个核心,它将导致一个大小为9的连接池。这应该能够处理你所需要的,添加更多只会增加监控,线程切换等开销。

 类似资料:
  • 我们需要一个源应用程序,它允许每个用户很少连接到它的数据库。 因为我们有多个Spring批处理接口连接到同一个源Db,所以我们用完了连接,Spring批处理作为单独的java程序运行,我们没有容器。 请建议一种方法,使数据源具有多个用户或数据源配置,可以帮助我们维护一个公共池,其中多个用户连接到该数据库。 我认为,一个丑陋的解决方法是使用一个公共服务从数据库获取连接,在该服务中,我们可以使用一些容

  • 问题内容: 我目前正在使用NEST ElasticSearch C#库与ElasticSearch进行交互。我的项目是一个MVC 4 WebAPI项目,该项目基本上构建了一个RESTful Web服务来访问目录服务信息。 我们才刚刚开始使用NEST,并且由于缺乏文档而陷入困境。那里有用,但是有一些很大的孔。当前,我们需要的所有东西都可以正常工作,但是,我们遇到了一个问题,有时连接可能需要一整秒的时

  • 问题内容: 似乎与我的应用程序有关。每当启动应用程序很长时间(不确定确切的时间)后,我的日志中都会出现以下错误消息。我正在使用Spring + Hibernate + MySQL和ApacheDBCP进行连接池 如果我重新启动URL,则一切正常。我认为这与我的连接池有关。这是我的Apache DBCP设置,MYSQL中的wait_timeout设置为其默认值。(28800秒或8小时)。 在搜索的同

  • 我有一些集成测试,为此我使用Testcontainers。但我突然意识到,当我的应用程序数据库docker容器关闭时,所有其他测试(不包括使用Testcontainers的集成测试)都失败了(甚至是Spring Boot Initializer生成的

  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的

  • null 提前谢了。