我有一个自定义的业务需求,其中我需要管理数据库中各种Oracle数据源的详细信息。并且,一旦我的应用程序部署完毕,我就会创建与每个em对应的jdbcTemplates。
现在的问题是,如果我使用的是DataSource连接,则会导致打开的数据连接过多,因此DB拒绝连接并且应用程序崩溃。
我还使用了SingleConnectionDataSource,但是在这种情况下,Spring在空闲会话1或2个小时后抛出连接超时错误。
另一个试验是与BasicDataSource一起进行的,但这也导致了应用程序的混乱。
我维护数据的方式
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(DRIVER_CLASS_NAME);
dataSource.setUrl(CONNECTION_PREFIX + getHost() + ":" + getPort() + ":" + getServiceName());
dataSource.setUsername(getUserName());
dataSource.setPassword(getPassword());
dataSource.setInitialSize(15);
dataSource.setMinIdle(20);
dataSource.setMaxIdle(100);
dataSource.setMaxActive(150);
dataSource.setMaxWait(6000);
dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeout(30000);
dataSource.setLogAbandoned(true);
dataSource.setTestOnBorrow(true);
dataSource.setTestOnReturn(false);
dataSource.setTestWhileIdle(true);
dataSource.setTimeBetweenEvictionRunsMillis(30000);
dataSource.setMinEvictableIdleTimeMillis(30000);
dataSource.setMinEvictableIdleTimeMillis(30000);
dataSource.setValidationQuery("SELECT 1 from dual");
JdbcTemplate template = new JdbcTemplate(dataSource);
请注意,我以这种方式创建了多个jdbcTemplates并将它们维护在HashMap中。数据源详细信息也来自数据库表
这是因为前端应用程序将实际决定将使用哪个特定数据源来执行数据库操作。
请建议我一个更好的方法,或解决现有的超时/空闲连接问题!
最佳答案
我建议连接池。可以设置初始连接数,总连接数限制以及许多其他选项。
看看here。